2010-10-15 9 views
5

Mi aplicación almacena una gran cantidad de archivos XML. Un trabajo en segundo plano envía periódicamente algunos de esos archivos XML a un buzón específico. El código de anuncio publicitario está muerto-simple:Saltos de línea inesperados al enviar archivos adjuntos XML utilizando 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 

Sin embargo, por alguna razón, los XML están consiguiendo dañado en la transmisión: el primer salto de línea se agrega a la columna 987, y se añaden lo siguiente en la columna 990. Después de cada romper, se inserta un espacio. Creo que la imagen vale por sí mismo:

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 

intenté llamar a mí mismo en File.readrails console, que funciona bien, no se añaden los saltos de línea. Así que supongo que el error debería estar en el ActionMailer. ¿Algun consejo?

Editar para la aclaración: La mayor parte del documento XML se encuentra en una línea grande y única. No puedo cambiarlo, ya que el XML está firmado digitalmente: cualquier cambio, incluidos los saltos de línea y la sangría, rompe la firma digital.

Respuesta

3

Respondiendo a la pregunta que me dio la 'Thumbleweed' insignia :)

Terminé que codifica el archivo de mí mismo, y ahora está trabajando muy bien:

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