【问题标题】:How to handle UTF-8 email headers (like Subject:) using Ruby?如何使用 Ruby 处理 UTF-8 电子邮件标头(如主题:)?
【发布时间】:2008-12-04 19:08:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby email unicode utf-8


    【解决方案1】:

    您可以选择使用 Base64 编码来做同样的事情:

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

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

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

    【讨论】:

    • 谢谢!我开始使用 Base64,但我担心垃圾邮件过滤器会标记它,所以我切换到引用的可打印。我在 ActionMailer::Quoting 中找到了一种方法。看起来它也有效!
    • 我认为垃圾邮件过滤器不会标记这一点,这是一个有效的标头值。
    • 是的,我没有任何证据。我认为垃圾邮件发送者可能会尝试绕过幼稚的内容过滤器。
    • Q 编码必须打包。像 str.to_a.pack("M") 什么的。看到这个解码:stackoverflow.com/questions/3473952/…
    【解决方案2】:

    啊哈! ActionMailer::Quoting 有一个 quoted_printable 方法。

    这就是我所做的:

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

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

    【讨论】:

    • Rails 4 中不存在此方法 :( - 任何替代方法?
    【解决方案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
    

    在这里你打开到本地主机的连接。也可以使用外部 SMTP 服务器,参考 net/smtp 的文档。

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

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

    使用相同的语法,除了 From: 更改为 To:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 2020-09-18
      • 2011-08-20
      • 2013-10-09
      • 2012-11-05
      • 2020-11-21
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多