Ruby on rails 如何使用Ruby处理UTF-8电子邮件头(如主题:)?
我是一个电子邮件n00b,但我正在开发一个应用程序,它可以发送带有Unicode字符的HTML电子邮件(正如我朋友所说的“享受编码地狱”)Ruby on rails 如何使用Ruby处理UTF-8电子邮件头(如主题:)?,ruby-on-rails,ruby,email,unicode,utf-8,Ruby On Rails,Ruby,Email,Unicode,Utf 8,我是一个电子邮件n00b,但我正在开发一个应用程序,它可以发送带有Unicode字符的HTML电子邮件(正如我朋友所说的“享受编码地狱”) 主题:标题来自用户输入,因此可能包含Unicode字符。一些邮件客户端(如GMail和Outlook2007)对此没有问题,但据我所知,这样做的正确方法似乎是使用邮件头 我找不到一个Ruby库来做这个。有吗 另外,是否有一个要添加的头,它会告诉邮件客户端在显示邮件时使用UTF-8?我们正在发送多部分电子邮件,因此我们的内容类型是multipart/mixed
主题:
标题来自用户输入,因此可能包含Unicode字符。一些邮件客户端(如GMail和Outlook2007)对此没有问题,但据我所知,这样做的正确方法似乎是使用邮件头
我找不到一个Ruby库来做这个。有吗
另外,是否有一个要添加的头,它会告诉邮件客户端在显示邮件时使用UTF-8?我们正在发送多部分电子邮件,因此我们的
内容类型
是multipart/mixed
。尤其是Apple Mail.app没有使用正确的编码,即使在各个部分中指定为UTF-8。您也可以选择使用Base64编码:
require "base64"
value = Base64.encode64("Your UTF-8 string")
header = "=?UTF-8?B?" + value + "?="
注意标记Base64编码的有效负载的“B”,与标记“Q编码的”有效负载的“Q”相反。后者可以通过URL编码字符串并将所有“%”字符替换为“=”来伪造
我所说的“伪造”是指:它会产生一个有效的结果,但可能编码的字符比需要的更多。该规范允许使用
“=”+字节码ashex
对每个字符进行编码,它只会损害原始标题的可读性。UrlEncode是+.gsub(/%/,“=”)
在没有其他可用的情况下,这不是一个好的折衷方案。啊哈ActionMailer::Quoteing
有一个quoted_可打印的方法
以下是我所做的:
def my_email(foo)
...
@subject = quoted_printable(foo.some_subject_with_accented_chars, 'utf-8')
...
end
这样做可以说服Mail.app使用UTF-8显示电子邮件的其余部分。现在来测试其余的 因为没有一个答案能够用纯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
在这里,您可以打开到本地主机的连接。也可以使用外部SMTP服务器,请参阅net/SMTP的文档
第一行设置消息中使用的字符集。其余行是单独定义的变量:
from是一个地址,格式为from:Name here
。如果不需要名称,则只能指定地址,如From:address@here.fi
to使用相同的语法,例外情况是From:
更改为to:
主语的形式是主语:主语在这里。对于UTF-8,需要对其进行Base64编码才能为客户端正确显示
subject = "Subject: =?UTF-8?B?" + Base64.strict_encode64(subject) + "?="
消息是以UTF-8编码的纯文本消息,没有任何前缀。net/smtp将负责生成正确的邮件。谢谢!我一开始使用Base64,但我担心垃圾邮件过滤器会标记它,所以我改用引用的printable。我在ActionMailer::Quoting中找到了一种方法。看起来它也能用!我不认为垃圾邮件过滤器会标记这个,这是一个有效的头值。是的,我没有任何证据。我想垃圾邮件发送者可能会尝试绕过幼稚的内容过滤器。Q编码必须打包。比如str.to_.pack(“M”)或其他什么。有关解码,请参见:rails 4中不存在此方法:(-有其他选择吗?