[英]How to handle UTF-8 email headers (like Subject:) using Ruby?
我是一封電子郵件n00b,但我正在開發一個發送帶有Unicode字符的HTML電子郵件的應用程序(正如我的朋友所說“享受編碼地獄”)。
Subject:
標題來自用戶輸入,因此可能包含Unicode字符。 一些郵件客戶端(如GMail和Outlook 2007)可以正常使用,但從我的閱讀中看來,正確的方法是對標題使用MIME編碼字編碼 。
我找不到一個Ruby庫來做這件事。 有嗎?
此外,是否有一個標題要添加,告訴郵件客戶端在顯示郵件時使用UTF-8? 我們正在發送多部分電子郵件,因此我們的Content-Type
是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編碼並用“=”替換所有“%”字符來偽造。
通過“偽造”我的意思是:它會產生一個有效的結果,但可能編碼的字符比必要的多。 規范允許用"=" + 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.