16

好的。我认为这个问题与我的 rails 应用程序有关,但似乎与电子邮件附件的更深层次的工作有关。

我必须从我的 rails 应用程序将一个 csv 文件发送到一个仓库,以履行我商店中的订单。仓库有 CSV 格式,讽刺的是 CSV 文件的标题行超长(1000+ 个字符)。

当我收到测试电子邮件时,我在 csv 文件的标题行中出现换行符,但无法弄清楚它放在那里的内容。但是,一些谷歌搜索终于找到了原因:附件的行字符限制为 1000。为什么?我不知道。这看起来很荒谬,但我仍然必须以某种方式发送这个 csv 文件。

我尝试手动将附件的 MIME 类型设置为 text/csv,但这无济于事。有谁知道如何解决这个问题?

一些相关的谷歌搜索结果: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'}

这似乎没有什么不同。我通过 Mac 版 Sparrow 收到带有 me.com 帐户的电子邮件。我会尝试使用 gmail 的网络界面。

4

2 回答 2

26

这似乎是因为 SendGrid 邮件服务器正在修改附件内容。如您所见,如果您发送带有纯文本存储 mime 类型(例如text/csv)的附件,它将每 990 个字符包装一次内容。我认为这与RFC 2045/821有关:

  1. 内容传输编码头字段

    许多可以通过电子邮件有效传输的媒体类型以其“自然”格式表示为 8 位字符或二进制
    数据。此类数据无法通过某些传输协议传输。
    例如,RFC 821 (SMTP) 将邮件消息限制为 7 位 US-ASCII
    数据,行数不超过 1000 个字符,包括任何尾随 CRLF 行分隔符。

    因此,有必要定义一种标准机制,
    将此类数据编码为 7 位短线格式。也希望以较少限制的格式对未编码材料进行适当的标记
    ,以便直接用于限制较少的传输。本文档
    规定,此类编码将由新的“Content
    -Transfer-Encoding”头字段指示。该字段尚未由
    任何以前的标准定义。

如果您使用 base64 编码而不是默认的 7 位发送附件,则附件保持不变(不添加换行符):

attachments['file.csv']= { :data=> ActiveSupport::Base64.encode64(@string), :encoding => 'base64' }
于 2012-05-05T17:52:02.030 回答
1

您的数据中是否有会导致这种情况的换行符?检查看看是否

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

如果是这样,一个快速/hackish 修复可能会改变您调用values_for_line_item(item)的位置values_for_line_item(item).map{|c| c.gsub(/(\r|\n)/, '')}(对于其他 line_item 调用也是如此)。

于 2012-05-05T04:34:26.467 回答