Ruby TMail ограничивает размер тела? - PullRequest
1 голос
/ 09 июня 2009

У меня есть небольшое приложение, которое обрабатывает электронную почту, загруженную с imap-сервера с fetchmail. Обработка состоит в поиске вложений в кодировке base64 с XML-файлом внутри.

Вот код (несколько раздетый):

def extract_data_from_mailfile(mailfile)
   begin
      mail = TMail::Mail.load(mailfile)
   rescue
      return nil
   end

   bodies_found = []
   if mail.multipart? then
     mail.parts.each do |m|
       bodies_found << m.body
     end
   end

   ## Let's parse the parts we found in the mail to see if one of them
   ## looks XML-ish. Hacky but works for now.
   ## was XML.
   bodies_found.each do |body|
     if body =~ /^<\?XML /i then
       return body
     end
   end
   return nil # Nothing found.
 end

Это прекрасно работает, но на больших XML-файлах (обычно> 600k почтовых файлов) это ломается.

>> mail.parts[1].body.size 
=> 487424    <-- should have been larger - doesn't include the end of the file

Base64-декодирование также не происходит автоматически. Но это когда я пытаюсь запустить декодирование вручную:

>> Base64::decode64(mail.parts[1].body)
[...] ll="SMTP"></Sendt><Sendt"

Это часть XML-файла, но он был вырезан.

Есть ли способ получить все вложения? какие-нибудь советы?

1 Ответ

0 голосов
/ 15 июля 2009

Я вижу, что ваш код прерывает цикл в первом найденном фрагменте XML. Возможно, более крупные сообщения делят свой XML на более мелкие порции в одном и том же MIME-сообщении? Затем вы должны вернуть массив тел и объединить их

mail.parts[1].body[0] + mail.parts[1].body[1]

(PS. Это длинный выстрел, я не пробовал это)

...