如何在Rails中更改邮件发送器的Content-Transfer-Encoding设置?

8
"默认情况下,“Content-Transfer-Encoding”设置为“7bit”。邮件服务器Postfix将电子邮件标题分解为一堆1000个字符,这意味着如果您有一个长的电子邮件(例如使用HTML),您最终会在文本或链接中间出现空格。(有关更多信息,请参见此线程:http://tech.groups.yahoo.com/group/postfix-users/message/273296
根据Rails ActionMailer文档(http://api.rubyonrails.org/classes/ActionMailer/Base.html),将以下代码添加到我的应用程序文件中应该可以解决问题,但实际上并没有起作用: ActionMailer::Base.default 'Content-Transfer-Encoding' => 'quoted-printable' 我最终仍然得到了默认值:"
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_50166adf1e043_1b9810829142282d";
 charset=UTF-8
Content-Transfer-Encoding: 7bit

我的电子邮件看起来像这样:

def new_registered_user(user_id) 
    @user = User.find(user_id)

    set_locale @user.locale

    mail(
      :subject => i18n_subject,
      :to => @user.email_with_name
    ) do |format|
      format.text { render :layout => 'text_email' }
      format.html
    end
  end

你有没有想过还需要做哪些改变?

3个回答

9
我发现设置邮件对象上的(未公开的)transport_encoding有效:
m = mail(...)
m.transport_encoding = "quoted-printable"
m.deliver

我无法使用ActionMailer中文档记录的方法来设置Content-Transfer-Encoding。

我的环境: rails (3.1), mail (~> 2.3.3)


FYI,电子邮件行长度限制为998个字符。请参见https://dev59.com/LXI-5IYBdhLWcg3w99kH - Felix Livni
非常感谢,所以除了在长电子邮件中添加断行符(\r\n)之外,没有其他选择。 - Vincent Peres
确实。每998个字符必须有一个CRLF。话虽如此,根据您的内容编码,您可以避免将CRLF放在内容本身中。 - Felix Livni
非常感谢你的问题和回答。这是一个非常棘手的问题!我使用m.transport_encoding =“base64”而不是m.transport_encoding =“quoted-printable”,因为我们必须发送包含外语字符的邮件,而根据维基百科:“Base64 ...是二进制格式或非拉丁语言文字的更明智的选择。”来自https://en.wikipedia.org/wiki/Quoted-printable - ryan2johnson9
p.s. 我很幸运能找到这个问题。我在我的文本和链接中遇到了相同的空格问题,但我不知道需要修改content_transfer_encoding。为了他人的利益,可能有必要在标题中添加“Rails电子邮件文本和链接中的随机空格”之类的内容...或者仅凭这条评论就可以帮助搜索结果。 - ryan2johnson9

3
如果您使用自定义邮件类,您可以将其设置为默认选项在您的邮件类中,如ActionMailer::Base文档所述。
class Notifier < ApplicationMailer
  default 'Content-Transfer-Encoding' => '7bit'
end

1

我最近也遇到了这个问题。Rails 默认使用 quoted-printable 编码,但是在 Web 邮件客户端中会导致渲染问题。换行符被渲染为 =0D,而 Web 邮件客户端无法正确地渲染。

我的解决方案是仅更改 HTML 部分的内容编码,因为我还要发送单独的文本部分,并且不想更改其编码。 html 方法接受一个 content_transfer_encoding 参数,避免了使用临时变量的需要:

mail do |format|
  format.text { ... }
  format.html(content_transfer_encoding: '7bit') { ... }
end

文档提到使用 default 'Content-Transfer-Encoding' ...,但仅在不直接调用mail方法时才有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接