Как отправить вложение csv с длиной более 990 символов?

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

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

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

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

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

Обновление

Я пробовал кодировать вложение в base64 так:

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

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

Ответы

Ответ 1

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

  1. Поле заголовка Content-Transfer-Encoding

    Многие типы носителей, которые могут быть полезны для транспортировки по электронной почте, представлены в их "естественном" формате как 8-битный символ или двоичный файл данные. Такие данные не могут передаваться по некоторым протоколам передачи.
    Например, RFC 821 (SMTP) ограничивает почтовые сообщения 7-битным US-ASCII
    данные с линиями длиной не более 1000 символов, включая любые завершающие Разделитель строк CRLF.

    Поэтому необходимо определить стандартный механизм для кодирование таких данных в формате 7-битной короткой строки. Надлежащая маркировка
    неэкономного материала в менее ограничительных форматах для прямого использования менее рестриктивные перевозки также желательны. Этот документ
    указывает, что такие кодировки будут обозначены новым "Content-
    " Передача-кодирование". Это поле не было определено с помощью любой предыдущий стандарт.

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

attachments['file.csv']= { :data=> ActiveSupport::Base64.encode64(@string), :encoding => 'base64' }

Ответ 2

У вас есть новые строки в ваших данных, которые могли бы вызвать это? Проверьте и посмотрите,

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).