Как отправить вложение 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:
-
Поле заголовка 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).