Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用Ruby处理UTF-8电子邮件头(如主题:)?_Ruby On Rails_Ruby_Email_Unicode_Utf 8 - Fatal编程技术网

Ruby on rails 如何使用Ruby处理UTF-8电子邮件头(如主题:)?

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

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

主题:
标题来自用户输入,因此可能包含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中不存在此方法:(-有其他选择吗?