Mandrill raw_message 中的额外“\n”会破坏一些链接
Extra "\n " in Mandrill raw_message break some links
我正在通过 SMTP 从 Heroku 上的 Rails 应用向 Mandrill 发送电子邮件。
一段时间以来一切正常,但最近(2 天前检测到),我们收到报告称某些 link 出现故障。
当我也通过 SMTP 将邮件发送到 Mailtrap 时,原始邮件没有问题,HTML 正文在 1 行中。
然而,在 Mandrill 上,出现在 API 调用中的 raw_message
包含额外的 \n
(即换行符后跟 space)。
运气有点差,出现一个link是这样的:
<a href=\"https://www.\n facebook.com/
启用 link 跟踪后,这将转换为:
https://www.%20facebook.com/
在 link 关闭跟踪的情况下,邮箱理解为:
https://www.%0d%0a%20facebook.com/
在这两种情况下,link 显然已损坏。看到 SMTP 消息看起来不错,我猜 Mandrill 的 SMTP 服务器在调用 API 时添加了换行符。我该怎么办?我怎么可能是唯一一个看似受影响的人?
感谢任何帮助,包括解决方法,因为这也会破坏我们的 "Reset password" link 生产!
编辑
这是我在 mailtrap 中收到的(略有编辑的)原始消息。它是多部分 text/html,我觉得一切都很好。
Date: Thu, 26 Feb 2015 16:11:49 +0000
From: redacted <notifications+staging@redacted.com>
Reply-To: redacted <support@redacted.io>
To: redacted@redacted.com
Message-ID: <54ef45c51372b_3a3fddaa4e53f081961@3d32585e-59a2-456b-b7ff-4ed464b73400.mail>
Subject: Reset password instructions
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="--==_mimepart_54ef45c510602_3a3fddaa4e53f081842";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_54ef45c510602_3a3fddaa4e53f081842
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Hello redacted,
Someone has requested a link to change your password for redacted. You can do this through the link below.
http://redacted.io/security/users/password/edit?reset_password_token=redacted
If you didn't request this, please ignore this email
Your password won't change until you access the link above and create a new one.
----==_mimepart_54ef45c510602_3a3fddaa4e53f081842
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
<div style="width: 100%; background: #ffffff;"><table style="width: 100%; max-width: 520px; margin: 0 auto; border: 0; border-collapse: collapse;"><tr><td style="width: 50%; padding: 10px;"><img alt="redacted" src="https://s3-eu-west-1.amazonaws.com/redacted/redacted.png" /></td><td style="width: 50%; padding: 20px; text-align: right; vertical-align: middle; font-family: Helvetica,Arial,sans-serif; color: #8494a4; font-size: 14px;">LOST PASSWORD</td></tr><tr><td colspan="2" style="padding: 40px 50px 20px 50px; font-family: Helvetica,Arial,sans-serif; color: #8494a4; font-size: 14px;"><p>Hello redacted,</p><p>Someone has requested a link to change your password for redacted. You can do this through the link below.</p></td></tr></table><table style="width: 100%; max-width: 520px; margin: 0 auto; border: 0; border-collapse: collapse;"><tr><td width="33%"></td><td style="background: #3897d3; text-align: center; vertical-align: middle; width: 34%; height: 50px;" width="34%"><a href="http://redacted.io/security/users/password/edit?reset_password_token=redacted" style="font-family: Helvetica,Arial,sans-serif; font-size: 14px; color: #ffffff; text-decoration: none; background: #3897d3; display: block; padding: 15px 0; text-align: center;">Change password</a></td><td width="33%"></td></tr><tr><td colspan="3" style="padding: 20px 50px; font-family: Helvetica,Arial,sans-serif; color: #8494a4; font-size: 14px;"><p>If you didn't request this, please ignore this email</p><p>Your password won't change until you access the link above and create a new one.</p></td></tr><tr><td colspan="3" style="padding: 30px 0 10px 0; text-align: center; font-family: Helvetica,Arial,sans-serif; font-size: 12px; color: #8494a4;"><a href="http://redacted.io/" style="color: #3897d3; text-decoration: none;">redacted</a> - <a href="https://twitter.com/redacted" style="color: #3897d3; text-decoration: none;">Twitter</a> - <a href="https://www.facebook.com/redacted" style="color: #3897d3; text-decoration: none;">Facebook</a> - <a href="https://plus.google.com/redacted" style="color: #3897d3; text-decoration: none;">Google+</a></td></tr></table></div>
----==_mimepart_54ef45c510602_3a3fddaa4e53f081842--
您确定要以 HTML 格式发送 e-mails 吗?好像您以纯文本格式发送它,而 Mandril 将其与一列对齐。你能算出\n符号的位置吗?
更新:
尝试将 X-MC-Autotext
e-mail header 设置为 no
并将 X-MC-AutoHtml
设置为 no
。描述的所有 header 都是 here
我们通常会在生成 HTML 且没有真正的换行符的 SMTP 库或框架中看到此类问题。 SMTP 规范规定电子邮件的行长度不应超过 1000 个字符。当达到该限制时,在通过 SMTP 传输消息数据时会自动插入一个换行符。不幸的是,这经常发生在单词或 URL 的中间。您需要查看 SMTP 库,看看是否可以修改换行符的处理方式。
如果您使用 HTML 换行符(例如 <br>
)来表示换行符,很遗憾,这些换行符在这种情况下无济于事。添加您自己的换行符(不是 HTML 换行符,而是数据中的实际换行符,例如换行符或行尾 - 通常 \r\n
- 将有助于确保强制换行符不是任意的在不方便的地方添加到 SMTP 对话中。
我正在通过 SMTP 从 Heroku 上的 Rails 应用向 Mandrill 发送电子邮件。
一段时间以来一切正常,但最近(2 天前检测到),我们收到报告称某些 link 出现故障。
当我也通过 SMTP 将邮件发送到 Mailtrap 时,原始邮件没有问题,HTML 正文在 1 行中。
然而,在 Mandrill 上,出现在 API 调用中的 raw_message
包含额外的 \n
(即换行符后跟 space)。
运气有点差,出现一个link是这样的:
<a href=\"https://www.\n facebook.com/
启用 link 跟踪后,这将转换为:
https://www.%20facebook.com/
在 link 关闭跟踪的情况下,邮箱理解为:
https://www.%0d%0a%20facebook.com/
在这两种情况下,link 显然已损坏。看到 SMTP 消息看起来不错,我猜 Mandrill 的 SMTP 服务器在调用 API 时添加了换行符。我该怎么办?我怎么可能是唯一一个看似受影响的人?
感谢任何帮助,包括解决方法,因为这也会破坏我们的 "Reset password" link 生产!
编辑
这是我在 mailtrap 中收到的(略有编辑的)原始消息。它是多部分 text/html,我觉得一切都很好。
Date: Thu, 26 Feb 2015 16:11:49 +0000
From: redacted <notifications+staging@redacted.com>
Reply-To: redacted <support@redacted.io>
To: redacted@redacted.com
Message-ID: <54ef45c51372b_3a3fddaa4e53f081961@3d32585e-59a2-456b-b7ff-4ed464b73400.mail>
Subject: Reset password instructions
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="--==_mimepart_54ef45c510602_3a3fddaa4e53f081842";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_54ef45c510602_3a3fddaa4e53f081842
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Hello redacted,
Someone has requested a link to change your password for redacted. You can do this through the link below.
http://redacted.io/security/users/password/edit?reset_password_token=redacted
If you didn't request this, please ignore this email
Your password won't change until you access the link above and create a new one.
----==_mimepart_54ef45c510602_3a3fddaa4e53f081842
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
<div style="width: 100%; background: #ffffff;"><table style="width: 100%; max-width: 520px; margin: 0 auto; border: 0; border-collapse: collapse;"><tr><td style="width: 50%; padding: 10px;"><img alt="redacted" src="https://s3-eu-west-1.amazonaws.com/redacted/redacted.png" /></td><td style="width: 50%; padding: 20px; text-align: right; vertical-align: middle; font-family: Helvetica,Arial,sans-serif; color: #8494a4; font-size: 14px;">LOST PASSWORD</td></tr><tr><td colspan="2" style="padding: 40px 50px 20px 50px; font-family: Helvetica,Arial,sans-serif; color: #8494a4; font-size: 14px;"><p>Hello redacted,</p><p>Someone has requested a link to change your password for redacted. You can do this through the link below.</p></td></tr></table><table style="width: 100%; max-width: 520px; margin: 0 auto; border: 0; border-collapse: collapse;"><tr><td width="33%"></td><td style="background: #3897d3; text-align: center; vertical-align: middle; width: 34%; height: 50px;" width="34%"><a href="http://redacted.io/security/users/password/edit?reset_password_token=redacted" style="font-family: Helvetica,Arial,sans-serif; font-size: 14px; color: #ffffff; text-decoration: none; background: #3897d3; display: block; padding: 15px 0; text-align: center;">Change password</a></td><td width="33%"></td></tr><tr><td colspan="3" style="padding: 20px 50px; font-family: Helvetica,Arial,sans-serif; color: #8494a4; font-size: 14px;"><p>If you didn't request this, please ignore this email</p><p>Your password won't change until you access the link above and create a new one.</p></td></tr><tr><td colspan="3" style="padding: 30px 0 10px 0; text-align: center; font-family: Helvetica,Arial,sans-serif; font-size: 12px; color: #8494a4;"><a href="http://redacted.io/" style="color: #3897d3; text-decoration: none;">redacted</a> - <a href="https://twitter.com/redacted" style="color: #3897d3; text-decoration: none;">Twitter</a> - <a href="https://www.facebook.com/redacted" style="color: #3897d3; text-decoration: none;">Facebook</a> - <a href="https://plus.google.com/redacted" style="color: #3897d3; text-decoration: none;">Google+</a></td></tr></table></div>
----==_mimepart_54ef45c510602_3a3fddaa4e53f081842--
您确定要以 HTML 格式发送 e-mails 吗?好像您以纯文本格式发送它,而 Mandril 将其与一列对齐。你能算出\n符号的位置吗?
更新:
尝试将 X-MC-Autotext
e-mail header 设置为 no
并将 X-MC-AutoHtml
设置为 no
。描述的所有 header 都是 here
我们通常会在生成 HTML 且没有真正的换行符的 SMTP 库或框架中看到此类问题。 SMTP 规范规定电子邮件的行长度不应超过 1000 个字符。当达到该限制时,在通过 SMTP 传输消息数据时会自动插入一个换行符。不幸的是,这经常发生在单词或 URL 的中间。您需要查看 SMTP 库,看看是否可以修改换行符的处理方式。
如果您使用 HTML 换行符(例如 <br>
)来表示换行符,很遗憾,这些换行符在这种情况下无济于事。添加您自己的换行符(不是 HTML 换行符,而是数据中的实际换行符,例如换行符或行尾 - 通常 \r\n
- 将有助于确保强制换行符不是任意的在不方便的地方添加到 SMTP 对话中。