2008-12-04 55 views
6

我是一個電子郵件n00b,但我正在使用Unicode字符發送HTML電子郵件的應用程序(正如我的朋友指出「享受編碼地獄」)。如何使用Ruby處理UTF-8電子郵件標題(如主題:)?

Subject:標題來自用戶輸入,因此可能包含Unicode字符。有些郵件客戶端(如GMail和Outlook 2007)可以,但從我的閱讀中看來,正確的做法是使用MIME Encoded-Word encoding作爲標題。

我無法找到一個Ruby庫來做到這一點。有一個嗎?

另外,是否有一個標題可以告訴郵件客戶端在顯示消息時使用UTF-8?我們正在發送多部分電子郵件,所以我們的Content-Typemultipart/mixed。特別是Apple Mail.app不使用正確的編碼,即使它在各個部分中指定爲UTF-8。

回答

5

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

因此,這裏是我所做的:

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

這樣做說服Mail.app使用UTF-8來顯示電子郵件的其餘部分。現在來測試其餘的!

9

你可任選做同樣使用Base64編碼:

require "base64" 

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

注意「B」,這標誌着Base64編碼有效載荷,而不是在「Q」,這標誌着「Q編碼」有效載荷。後者可以通過對字符串進行URL編碼來僞造,並用「=」替換所有的「%」字符。通過「僞造」我的意思是:它會產生一個有效的結果,但也許更多的字符編碼比必要的。該規範允許編碼每個字符與"=" + ByteCodeAsHex,它只會削弱原始標題的人類可讀性。 UrlEncode是+ .gsub(/%/, "=")當沒有其他可用的時候不是一個壞的折衷。

+0

謝謝!我開始使用Base64,但是我擔心垃圾郵件過濾器會出現這種情況,所以我轉而引用了可打印的內容。我在ActionMailer :: Quoting中找到了一個方法。看起來它也起作用! – 2008-12-04 20:18:32

+0

我不認爲垃圾郵件過濾器會標記這,這是一個有效的標題值。 – Tomalak 2008-12-04 20:22:19

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 <[email protected]>的地址。如果不需要名稱,則只能指定地址,如From: [email protected]

使用相同的語法,但例外From:更改爲To:

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

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

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