2010-10-15 9 views
5

La mia applicazione memorizza molti file XML. Un lavoro in background invia periodicamente alcuni di questi file XML a una casella di posta specifica. Il codice Mailer è morto semplice:Interruzioni di riga impreviste durante l'invio di allegati XML tramite 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 

Tuttavia, per qualche ragione, quelli XML sono sempre corrotto sulla trasmissione: la prima interruzione di riga viene aggiunto alla colonna 987, e il seguente sono aggiunti alla colonna 990. Dopo ogni pausa, viene inserito uno spazio. Penso che la foto dice di sé:

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 

Ho provato a chiamare File.read io su rails console, funziona benissimo, non vengono aggiunti interruzioni di riga. Quindi presumo che l'errore dovrebbe trovarsi sullo ActionMailer. Qualche consiglio?

Modifica per chiarimenti: La maggior parte del documento XML giace su una grande linea singola. Non posso cambiarlo, dal momento che l'XML è firmato digitalmente - qualsiasi modifica, inclusa l'aggiunta di interruzioni di riga e rientro, interrompe la firma digitale.

risposta

3

Rispondendo alla domanda che mi ha dato il 'Thumbleweed' distintivo :)

ho finito per la codifica del file stesso, e sta ora lavorando bene:

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