1

我有一个小型应用程序,可以处理从带有 fetchmail 的 imap 服务器下载的电子邮件。该处理包括查找带有 XML 文件的 base64 编码附件。

这是代码(有些剥离):

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 文件的一部分,但已被剪裁。

有什么办法可以得到整个附件?有小费吗?

4

1 回答 1

0

我看到您的代码在第一个找到的 XML 片段处中断了循环。也许较大的消息将它们的 XML 分成相同的多部分 MIME 消息中的较小块?然后,您将返回一主体并将它们连接起来

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

(PS。这是一个长镜头,我没试过这个)

于 2009-07-14T22:32:15.453 回答