2009-06-09 7 views
1

J'ai une petite application qui traite les emails téléchargés à partir d'un serveur imap avec fetchmail. Le traitement consiste à trouver des pièces jointes codées en base64 avec un fichier XML à l'intérieur.Ruby TMail taille-limite sur le corps?

Voici le code (un peu dépouillé):

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 

Cela fonctionne très bien, mais sur de gros fichiers XML (typiquement> 600k mailfiles), cette pause.

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

Le décodage Base64 ne se fait pas automatiquement non plus. Mais c'est lorsque je tente de lancer manuellement decode:

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

Cela fait partie du fichier XML, mais il a été coupé.

Un moyen d'obtenir l'intégralité de la pièce jointe? des conseils?

Répondre

0

Je vois que votre code éclate la boucle au premier fragment XML trouvé. Peut-être que les plus gros messages divisent leur XML en morceaux plus petits dans le même message MIME en plusieurs parties? Vous pouvez ensuite retourner un tableau des corps et les concaténer

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

(PS. Il est un long shot, je n'ai pas essayé)

Questions connexes