Ruby TMail ограничивает размер тела?
У меня есть небольшое приложение, которое обрабатывает электронную почту, загруженную с 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-файлах (обычно>600 тыс. Почтовых файлов) это ломается.
>> 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 ответ
Я вижу, ваш код прерывает цикл в первом найденном фрагменте XML. Возможно, более крупные сообщения делят свой XML на более мелкие порции внутри одного и того же сообщения MIME, состоящего из нескольких частей? Затем вы должны вернуть массив тел и объединить их
mail.parts[1].body[0] + mail.parts[1].body[1]
(PS. Это длинный выстрел, я не пробовал это)