8

我是一封电子邮件 n00b,但我正在开发一个发送带有 Unicode 字符的 HTML 电子邮件的应用程序(正如我的朋友所说的“享受编码地狱”)。

Subject:头来自用户输入,因此可能包含 Unicode 字符。一些邮件客户端(如 GMail 和 Outlook 2007)对此没有问题,但从我的阅读来看,正确的方法似乎是对标题使用MIME Encoded-Word 编码

我找不到 Ruby 库来执行此操作。有吗?

此外,是否要添加一个标头,告诉邮件客户端在显示消息时使用 UTF-8?我们正在发送多部分电子邮件,所以我们Content-Typemultipart/mixed。尤其是 Apple Mail.app 没有使用正确的编码,即使它在各个部分中指定为 UTF-8。

4

3 回答 3

10

您可以选择使用 Base64 编码执行相同操作:

require "base64"

value  = Base64.encode64("Your UTF-8 string")
header = "=?UTF-8?B?" + value + "?="

请注意标记 Base64 编码有效负载的“B”,而不是标记“Q 编码”有效负载的“Q”。后者可以通过对字符串进行 URL 编码并用“=”替换所有“%”字符来伪造。

通过“伪造”,我的意思是:它会产生一个有效的结果,但可能编码的字符多于必要的字符。该规范允许使用 对每个字符进行编码"=" + ByteCodeAsHex,它只会损害原始标题的人类可读性。当没有其他可用的时候, UrlEncode 是.gsub(/%/, "=")一个不错的折衷方案。

于 2008-12-04T20:00:49.893 回答
5

啊啊!ActionMailer::Quotingquoted_printable方法。

所以这就是我所做的:

def my_email(foo)
  ...
  @subject = quoted_printable(foo.some_subject_with_accented_chars, 'utf-8')
  ...
end

这样做使 Mail.app 使用 UTF-8 显示电子邮件的其余部分。现在来测试其余的!

于 2008-12-04T20:17:02.777 回答
3

由于没有一个答案能说明纯 Ruby 的整个消息,所以就在这里。

Net::SMTP.start("localhost") do |smtp|
    smtp.open_message_stream opts[:sender_address], opts[:receiver_address] do |f|

        f.puts "Content-type: text/plain; charset=UTF-8"
        f.puts from
        f.puts to
        f.puts subject
        f.puts message
    end
end

在这里,您打开到 localhost 的连接。也可以使用外部 SMTP 服务器,请参阅 net/smtp 的文档。

第一行设置消息中使用的字符集。其余行是单独定义的变量:

from 是形式为 的地址From: Name here <address@here.fi>。如果不需要名称,则只能指定地址,例如From: address@here.fi.

to 使用相同的语法,但将异常From:更改为To:.

主题是主题形式:主题在这里。对于 UTF-8,它需要经过 Base64 编码才能正确显示给客户端。

subject = "Subject: =?UTF-8?B?" + Base64.strict_encode64(subject) + "?="

消息是以 UTF-8 编码的纯文本消息,没有任何前缀。net/smtp 将负责形成正确的邮件。

于 2011-09-14T13:03:47.933 回答