Rails ActionMailer 在 html 每行末尾添加回车符 return (=0D)

Rails ActionMailer adds carriage return (=0D) to end of every line in html

我的 ActionMailer 在每行的末尾添加一个回车符 return:

<!DOCTYPE html>=0D
<html>=0D
<head>=0D
...
this is stuff=0D
=0D
This intro has some content in it.=0D
=0D
blah.=0D
=0D

我的邮件在 preview host/rails/mailers/user_mailer/periodic_digest.html (and also in mailcatcher) 中呈现得非常好,但是当我通过 Mailgun 发送邮件时,我的文本之间出现了双倍行距。

app/mailers/user_mailer.rb:periodic_digest

m = mail(from: 'blah', to: 'me')
puts m.html_part.body.decoded

我的格式正确 html。

如何发送我的 html 而不在每一行附加回车符 return 字符 =0D

这个isn't an error on Rails' part. Mailgun just handles it in an undesirable manner.

回车 return 用于在引用的可打印编码文本中强制换行。如果您要发送多部分或纯文本电子邮件,RFC 5322(以及之前的 2822 和 822)指定您必须在不超过 998 个字符处换行。出于实用目的,大多数电子邮件客户端将近 70 个字符换行。

为了插入一个可见的换行符,您需要使用回车符 return 后跟一个换行符,您可能习惯于将其表示为 \r\n。这与您在代码或文本文件中使用的典型 unix 风格的行结尾(只是一个换行符)形成对比。

通过删除电子邮件文本中的特殊字符(例如“ñ”和重音符号),我能够避免每行末尾出现“= 0D”。

<%=  (@mails.html_part.body.decoded.to_s.split).join(" ").html_safe %>

在我的案例中,这些行的测试用例失败:

<td class="quantity">1</td>
<td>Programming Ruby 1.9</td>

于:

assert_match /<td[^>]*>1<\/td>\s*<td>Programming Ruby 1.9<\/td>/, mail.body.encoded

所以失败的地方在这些行之间,因为 \s 没有处理换行,puts 显示如下:

<td class=3D"quantity">1</td>=0D
<td>Programming Ruby 1.9</td>=0D

所以解决方案是使用:

mail.html_part.body.decoded.to_s

我希望这对某人有所帮助。