Неожиданные разрывы строк при отправке вложений XML с помощью ActionMailer - PullRequest
5 голосов
/ 15 октября 2010

Мое приложение хранит много файлов XML. Фоновое задание периодически отправляет некоторые из этих файлов XML в определенный почтовый ящик. Код почтовой программы очень прост:

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

Однако по какой-то причине эти XML-данные повреждены при передаче: первый разрыв строки добавляется в столбец 987, а следующий добавляется в столбец 990. После каждого разрыва вставляется пробел. Я думаю, что картина говорит сама за себя:

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 

Я пытался дозвониться до File.read на rails console, все работает нормально, разрывы строк не добавляются. Поэтому я предполагаю, что ошибка должна лежать на ActionMailer. Любые советы?

Изменить для уточнения: Большая часть XML-документа лежит на большой одной строке. Я не могу изменить его, так как XML имеет цифровую подпись - любое изменение, включая добавление разрывов строк и отступов, нарушает цифровую подпись.

1 Ответ

3 голосов
/ 09 ноября 2010

Отвечая на вопрос, который дал мне значок 'Thumbleweed':)

Я закончил кодировать файл сам, и теперь он работает нормально:

attachments[f_short] = {
  :encoding => 'base64',
  :content => Base64.encode64( File.read(f_phys) ).chomp
} if File.exists?(f_phys)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...