2010-10-15 4 views
5

Mon application stocke beaucoup de fichiers XML. Un travail d'arrière-plan envoie périodiquement certains de ces fichiers XML à une boîte aux lettres spécifique. Le code Mailer est mort simple:Les sauts de ligne inattendus lors de l'envoi de pièces jointes XML à l'aide d'ActionMailer

class MailSender < ActionMailer::Base 
    default :from => AppConfig.mail_from 

    smtp_settings :address => AppConfig.smtp_host, 
        :username => AppConfig.smtp_user, 
        :password => AppConfig.smtp_pass 

    def send_xml(record) 
     f = record.filename.gsub("\\", "/") # converts \ to/
     f_short = arq.gsub(/.*\//, "") # extracts only the filename 
     f_phys = "#{AppConfig.xml_root}#{arq}" # builds the physical filename 

     headers["Return-Receipt-To"] = AppConfig.return_receipt 

     attachments[f_short] = File.read(f_phys) if File.exists?(f_phys) 

     mail :subject => "...", 
      :to => AppConfig.mail_to 
    end 
end 

Cependant, pour une raison quelconque, les XML sont de corrompu sur la transmission: la première saut de ligne est ajouté à la colonne 987, et les éléments suivants sont ajoutés à la colonne 990. Après chaque pause, un espace est inséré. Je pense que l'image dit lui-même:

col 1          col 990 
|.................................................| 
<?xml version="1.0" ... </IE><IM>321505493301< 
/IM><CNAE>4744001< ... 00</pCOFINS><vCOFINS>0.00 
</vCOFINS></COFINS ... /prod><imposto><ICMS><ICM 
S40><orig>0</orig> ... <infAdic><infCpl>Permite 

J'ai essayé d'appeler moi-même sur File.readrails console, il fonctionne très bien, pas de sauts de ligne sont ajoutés. Donc, je suppose que l'erreur devrait se trouver sur le ActionMailer. Des conseils?

Modifier pour plus de précisions: La plupart des documents XML se trouvent sur une grande ligne unique. Je ne peux pas le changer, car le XML est signé numériquement - tout changement, y compris l'ajout de sauts de ligne et d'indentation, casse la signature numérique.

Répondre

3

Répondant à la question qui m'a donné le badge « Thumbleweed » :)

J'ai fini par l'encodage du fichier moi-même, et il est maintenant fonctionne bien:

attachments[f_short] = { 
    :encoding => 'base64', 
    :content => Base64.encode64(File.read(f_phys)).chomp 
} if File.exists?(f_phys) 
Questions connexes