簡體   English   中英

如何使用Ruby處理UTF-8電子郵件標題(如Subject :)?

[英]How to handle UTF-8 email headers (like Subject:) using Ruby?

我是一封電子郵件n00b,但我正在開發一個發送帶有Unicode字符的HTML電子郵件的應用程序(正如我的朋友所說“享受編碼地獄”)。

Subject:標題來自用戶輸入,因此可能包含Unicode字符。 一些郵件客戶端(如GMail和Outlook 2007)可以正常使用,但從我的閱讀中看來,正確的方法是對標題使用MIME編碼字編碼

我找不到一個Ruby庫來做這件事。 有嗎?

此外,是否有一個標題要添加,告訴郵件客戶端在顯示郵件時使用UTF-8? 我們正在發送多部分電子郵件,因此我們的Content-Typemultipart/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編碼並用“=”替換所有“%”字符來偽造。

通過“偽造”我的意思是:它會產生一個有效的結果,但可能編碼的字符比必要的多。 規范允許用"=" + ByteCodeAsHex對每個字符進行編碼,它只會損害原始頭的人類可讀性。 當沒有其他可用的東西時.gsub(/%/, "=") UrlEncode是+ .gsub(/%/, "=")並不是一個糟糕的妥協。

啊啊! ActionMailer::Quoting quoted_printable有一個quoted_printable方法。

所以這就是我做的:

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

在這里打開與localhost的連接。 也可以使用外部SMTP服務器,請參閱net / smtp文檔。

第一行設置消息中使用的字符集。 其余的行是分別定義的變量:

from是From: Name here <address@here.fi>的地址From: Name here <address@here.fi> 如果不需要名稱,則只能指定地址,例如From: address@here.fi

使用相同的語法,例外From:更改為To: .

主題是主語:主題在這里。 對於UTF-8,它需要進行Base64編碼才能正確顯示給客戶端。

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

消息是以UTF-8編碼的純文本消息,沒有任何前綴。 net / smtp將負責形成正確的郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM