好的。我认为这个问题与我的rails应用程序有关,但它似乎与电子邮件附件的更深层次的工作有关。
我必须从我的rails应用程序发送一个csv文件到一个仓库,它可以在我的商店中完成订单。仓库具有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'}
这似乎没有什么区别。我通过Sparrow for Mac收到了me.com帐户的电子邮件。我将尝试使用gmail的网络界面。
答案 0 :(得分:26)
这似乎是因为SendGrid邮件服务器正在修改附件内容。如果您发送带有纯文本存储mime类型的附件(例如text/csv
),它将按照您观察到的每990个字符包装内容。我认为这与RFC 2045/821:
- 醇>
Content-Transfer-Encoding标头字段
许多可通过电子邮件有效传输的媒体类型 以“自然”格式表示为8位字符或二进制
因此,有必要为
数据。这些数据不能通过某些传输协议传输 例如,RFC 821(SMTP)将邮件限制为7位US-ASCII
行数不超过1000个字符,包括任何尾随行 CRLF行分隔符。
定义标准机制 将这些数据编码成7bit短线格式。正确的标签
未经编码的材料,限制较少的格式,可直接使用 限制较少的运输也是可取的。本文件
指定此类编码将由新的“内容”表示 Transfer-Encoding“标题字段。该字段尚未由
定义 任何以前的标准。
如果使用base64编码而不是默认的7位发送附件,则附件保持不变(没有添加的换行符):
attachments['file.csv']= { :data=> ActiveSupport::Base64.encode64(@string), :encoding => 'base64' }
答案 1 :(得分: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调用也是如此)。