Вопрос по csv, attachment, sendgrid, email, mime-types – Как отправить вложение csv со строками длиной более 990 символов?

15

Хорошо. Я думал, что эта проблема как-то связана с моим приложением rails, но, похоже, она связана с более глубокой работой вложений электронной почты.

Я должен отправить файл csv из моего приложения rails на склад, который выполняет заказы в моем магазине. Хранилище имеет формат для CSV, и по иронии судьбы строка заголовка файла CSV очень длинная (более 1000 символов).

Я получал разрыв строки в строке заголовка csv-файла, когда получал тестовые письма и не мог понять, что его там поместило. Тем не менее, некоторые поиски в Google наконец-то показали причину: вложенные файлы имеют ограничение на количество символов в строке 1000. Почему? Я не знаю. Это кажется смешным, но мне все равно нужно как-то отправить этот CSV-файл.

Я попытался вручную установить тип MIME вложения для текста / CSV, но это не помогло. Кто-нибудь знает, как решить эту проблему?

Некоторые релевантные результаты Google:http://www.google.com/search?client=safari&rls=en&q=csv+wrapped+990&ie=UTF-8&oe=UTF-8

update

Я пытался кодировать вложение в base64 следующим образом:

<code>    attachments['205.csv'] = {:data=> ActiveSupport::Base64.encode64(@string), :encoding => 'base64', :mime_type => 'text/csv'}
</code>

Кажется, это не имеет значения. Я получаю письмо с учетной записью me.com через Sparrow для Mac. Я попытаюсь использовать веб-интерфейс gmail.

К сожалению, я до сих пор не могу воспроизвести проблему, даже с вашим кодом. Если вы просто сохраните CSV, а не отправите его по электронной почте, все ли еще есть разрывы строк? Кроме того, какой почтовый сервер, почтовый клиент и программа просмотра CSV вы используете? pjumble
Я пользуюсь услугами SendGrid через Heroku. Что касается просмотра CSV-файла, я использовал Numbers, а также простые текстовые редакторы. Разрыв строки определенно есть в файле. CharlieMezak
добавил код! CharlieMezak
Если я пишу CSV в файл непосредственно с моей локальной консоли Rails, вывод в порядке. Таким образом, кажется, нет проблемы с самим поколением CSV. CharlieMezak
Можете ли вы опубликовать код для вашего ActionMailer (и генерирования данных CSV)? Я пытался использоватьCSV.generate строить линии & gt; 1000 символов, добавил полученные данные кattachments часть ActionMailer и отправил его, но он не воспроизвел вашу проблему. pjumble

Ваш Ответ

2   ответа
1

которые вызвали бы это? Проверьте и посмотрите,

csv_for_orders(orders).lines.count == orders.count

Если это так, быстрое / хакерское исправление может измениться, где вы звонитеvalues_for_line_item(item) вvalues_for_line_item(item).map{|c| c.gsub(/(\r|\n)/, '')} (то же самое для других вызовов line_item).

Да, похоже, CSV в порядке. Количество строк правильное. CharlieMezak
Я уже что-то пробовал в этом направлении, но позвольте мне попробовать ваши конкретные примеры и посмотреть, придут ли они к чему-нибудь. Спасибо! CharlieMezak
25

это связано с тем, что почтовый сервер SendGrid изменяет содержимое вложения. Если вы отправляете вложение с типом mime для хранения обычного текста (например,text/csv) он будет обтекать содержимое каждые 990 символов, как вы заметили. Я думаю, что это связано сRFC 2045/821:

Content-Transfer-Encoding Header Field

Many media types which could be usefully transported via email are represented, in their "natural" format, as 8bit character or binary
data. Such data cannot be transmitted over some transfer protocols.
For example, RFC 821 (SMTP) restricts mail messages to 7bit US-ASCII
data with lines no longer than 1000 characters including any trailing CRLF line separator.

It is necessary, therefore, to define a standard mechanism for
encoding such data into a 7bit short line format. Proper labelling
of unencoded material in less restrictive formats for direct use over less restrictive transports is also desireable. This document
specifies that such encodings will be indicated by a new "Content-
Transfer-Encoding" header field. This field has not been defined by
any previous standard.

Если вы отправляете вложение с использованием кодировки base64 вместо 7-битного по умолчанию, вложение остается неизменным (без добавленных разрывов строк):

attachments['file.csv']= { :data=> ActiveSupport::Base64.encode64(@string), :encoding => 'base64' }
Не добавляйте:mime_type => 'text/csv' (как вы сделали в обновлении вопроса), это установит:encoding значение возвращается к 7-битному, чтобы вложение не декодировалось.
Я использовал предложенную вами строку для добавления вложения, но полученный файл не декодируется при его получении & # x2013; это по-прежнему последовательность значений base64. CharlieMezak
Вот оно, детка. Спасибо! Теперь вложение проходит нормально! (Я назначу вознаграждение, как только истечет срок. Через 3 часа) CharlieMezak
Да, я наткнулся на эту документацию. Позвольте мне попробовать ваше решение & # x2026; CharlieMezak
На какой почтовый сервер вы отправляете, и используете ли вы OSX mail.app для чтения электронных писем? Похоже, что у mail.app есть проблемы с декодированием некоторых вложений base64, но в настоящий момент у меня нет доступа к OSX для его тестирования. Перед публикацией я проверил отправку вложения с помощью ActionMailer через heroku / SendGrid на учетные записи gmail / hotmail / yahoo / smartermail, и все они правильно расшифровали вложение. Вы отправляете текст в электронном письме или просто вложение? Также вы определенно добавили:encoding => 'base64' часть?

Похожие вопросы