如何使用长度超过990个字符的行发送csv附件?

时间:2012-05-01 17:47:26

标签: email csv mime-types attachment sendgrid

好的。我认为这个问题与我的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的网络界面。

2 个答案:

答案 0 :(得分:26)

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

有关
  
      
  1. Content-Transfer-Encoding标头字段

         

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

         因此,有必要为
    定义标准机制   将这些数据编码成7bit短线格式。正确的标签
      未经编码的材料,限制较少的格式,可直接使用   限制较少的运输也是可取的。本文件
      指定此类编码将由新的“内容”表示   Transfer-Encoding“标题字段。该字段尚未由
    定义   任何以前的标准。

  2.   

如果使用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调用也是如此)。