Вопрос по csv, attachment, sendgrid, email, mime-types – Как отправить вложение csv со строками длиной более 990 символов?
Хорошо. Я думал, что эта проблема как-то связана с моим приложением 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.generate
строить линии & gt; 1000 символов, добавил полученные данные кattachments
часть ActionMailer и отправил его, но он не воспроизвел вашу проблему.
pjumble
которые вызвали бы это? Проверьте и посмотрите,
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).
это связано с тем, что почтовый сервер 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' }
:encoding => 'base64'
часть?