【问题标题】:Newlines resolved as =0A in Sendgrid X-SMTPAPI headerSendgrid X-SMTPAPI 标头中的换行符解析为 =0A
【发布时间】:2013-04-13 19:59:35
【问题描述】:

我正在使用 Sendgrid 将电子邮件发送到邮件列表,使用 X-SMTPAPI 标头指定多个收件人。来自Sendgrid documentation“标题必须被包裹以保持行长低于72。”

我正在使用 ActionMailer 发送电子邮件,并使用 headers 方法设置 X-SMTPAPI 标头。为了使行少于 72 个字符,我尝试用逗号+换行符+空格替换每个逗号。例如,

headers["X-SMTPAPI"] = {
        :to => ['user1@example.com','user2@example.com','user3@example.com','user4@example.com','user5@example.com','user6@example.com']
}.to_json.gsub(',',",\n ")

我没有在标题中获取换行符,而是得到以下内容(来自日志文件)

X-SMTPAPI: {"to":["user1@example.com",=0A "user2@example.com",=0A "user3@example.com",=0A "user4@example.com",=0A "user5@example.com",=0A "user6@example.com"]}

请注意,\n 字符被替换为=0A。此序列被 Sendgrid 服务器视为无效而拒绝。

有什么想法可以将正确的换行符放入标题中吗?

编辑: 我尝试添加“放置标题”以查看标题中设置的内容。然后就是我发现的

Date: Sat, 13 Apr 2013 18:21:36 -0400
Message-ID: <5169da701cd26_5343fe1776afc50749b4@saunders.mail>
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
X-SMTPAPI: {"to":["user1@example.com",=0A "user2@example.com",=0A
 "user3@example.com",=0A "user4@example.com",=0A "user5@example.com",=0A
 "user6@example.com"]}

请注意,我添加的换行符仍显示为“=0A”。但似乎有些东西自己添加了包装。这种换行是自动的,并且足以使我的标题行长度不超过要求吗?

【问题讨论】:

  • 如果你 puts headers["X-SMTPAPI"] 紧跟在 to_json 之后,输出是一样的吗?
  • 是的,是一样的。但我注意到有一些换行被应用,但不是我插入它的地方。请参阅上面的编辑。

标签: ruby-on-rails ruby sendgrid


【解决方案1】:

如果你给它适当的间距,ActionMailer 实际上会为你处理折叠和编码行。你应该使用JSON.generate 给它间距:

例如

headers["X-SMTPAPI"] = JSON.generate({
  :category => "welcome_email",
  :to => ['user1@example.com','user2@example.com','user3@example.com','user4@example.com','user5@example.com','user6@example.com']
}, :indent => ' ')

这会导致:

X-SMTPAPI: { "category":"welcome_email", "to":[  "user1@example.com",
 "user2@example.com",  "user3@example.com",  "user4@example.com",  
 "user5@example.com",     "user6@example.com"]}

如您所见,当 ActionMailer 遇到空格时,它会为您包装东西 - 不需要通常的 \r\n

【讨论】:

  • 你是对的。我刚刚在研究 ActionMailer Mail::UnstructuredField 类时发现了这一点。谢谢!
  • 我会补充一点,如果使用 Rails 和 ActionMailer,Sendgrid 实际上需要您使用这种方法(空格与换行符);如果您直接嵌入换行符,Sendgrid 会在解析 JSON 时抛出错误,但如果您使用空格,ActionMaler 会将其转换为适合 Sendgrid 的格式。
【解决方案2】:

标题中的字符似乎必须根据RFC 2047 [14]的规则进行编码。
根据 ASCII 表 %0A 状态为 \n

【讨论】:

  • 如果我的换行符被自动编码,我该如何折叠长标题行?
  • @DaveIsaacs,我不确定,但你可以试试...gsub(',',",\\n ")
  • 我试过了。不工作。 \\n 被解析为两个单独的字符:一个 \ 和一个 n。
  • @DaveIsaacs,后面不是解释为换行吗?.. 不好(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
相关资源
最近更新 更多