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