我正在通过SMTP从Heroku上的Rails应用程序向Mandrill发送电子邮件。

一切正常运行了一段时间,但是最近(两天前检测到),我们收到了一些链接断开的报告。

当我也通过SMTP将邮件发送到Mailtrap时,原始邮件很好,HTML正文在1行中。

但是,在Mandrill上,API调用中出现的raw_message包含额外的\n(这是一个换行符,后跟一个空格)。

有点不走运,然后会出现一个链接,如下所示:

<a href=\"https://www.\n facebook.com/

启用链接跟踪后,这将转换为:
https://www.%20facebook.com/

在链接跟踪为OFF的情况下,Mailbox的理解如下:
https://www.%0d%0a%20facebook.com/

在这两种情况下,链接显然都断开了。看到SMTP消息看起来不错,我猜想Mandrill的SMTP服务器在调用API时会添加换行符。我该怎么办?我怎么可能是唯一一个似乎受到影响的人呢?

感谢您提供任何帮助,包括解决方法,因为这也会破坏我们在生产环境中的“重置密码”链接!

编辑

这是我在邮件陷阱中收到的(略作编辑的)原始邮件。它是由多个部分组成的text/html,对我来说一切都很好。
Date: Thu, 26 Feb 2015 16:11:49 +0000
From: redacted <[email protected]>
Reply-To: redacted <[email protected]>
To: [email protected]
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&#39;t request this, please ignore this email</p><p>Your password won&#39;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>&nbsp;&nbsp;-&nbsp;&nbsp;<a href="https://twitter.com/redacted" style="color: #3897d3; text-decoration: none;">Twitter</a>&nbsp;&nbsp;-&nbsp;&nbsp;<a href="https://www.facebook.com/redacted" style="color: #3897d3; text-decoration: none;">Facebook</a>&nbsp;&nbsp;-&nbsp;&nbsp;<a href="https://plus.google.com/redacted" style="color: #3897d3; text-decoration: none;">Google+</a></td></tr></table></div>
----==_mimepart_54ef45c510602_3a3fddaa4e53f081842--

最佳答案

我们通常会在SMTP库或生成HTML且没有真正换行符的框架中看到这种问题。 SMTP规范指出,电子邮件的行长不应超过1000个字符。达到该限制时,在通过SMTP传输邮件数据时,将自动插入一个换行符。不幸的是,这种情况经常发生在单词或URL的中间。您将需要查看SMTP库,以查看是否可以修改处理换行符的方式。

如果您使用的HTML换行符(例如<br>)用于指示换行符,那么不幸的是,在这种情况下,这些换行符将无济于事。添加自己的换行符(不是HTML换行符,而是数据中的实际换行符,例如换行符或换行符-通常为\r\n)将有助于确保在不方便的地方SMTP session 中不会随意添加强制换行符。

关于ruby-on-rails - Mandrill raw_message中的多余 “\n ”破坏了一些链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28749614/

10-17 03:07