2009-01-18 28 views
22

我試圖使用下面的代碼通過System.Net.Mail發送郵件,並且有時獲取主題如'=?utf- 8?B?W3AxM25dIEZpbGV ...'(修剪)。這是所謂的代碼:System.Net.Mail和=?utf-8?B?XXXXX ....頭文件

MailMessage message = new MailMessage() 
{ 
    From = new MailAddress("[email protected]", "Service"), 
    BodyEncoding = Encoding.UTF8, 
    Body = body, 
    IsBodyHtml = true, 
    ReplyTo = new MailAddress("[email protected]"), 
    SubjectEncoding = Encoding.UTF8 
}; 

foreach (string emailAddress in addresses) 
{ 
    message.To.Add(new MailAddress(emailAddress.Trim(), "Person")); 
} 

message.Subject = subject; 

我想強調,這不會發生在所有的時間。

我在做什麼錯?

回答

33

當您的主題包含ASCII範圍以外的字符時,郵件軟件必須對它們進行編碼(RFC2822郵件不允許標頭中包含非ASCII字符)。有兩種方法可以做到這一點:

  • 引用Printable
  • 的Base64(主題爲 「?= UTF-8 B」 開頭)
  • (主題爲 「?= UTF-8 Q」 開頭)

看來該框架已經發現Base64編碼比引用可打印的編碼更有效率(=更短)。當您的主題包含ASCII範圍之外的相對較多的字符時,這很有意義。

要回答你的問題:你沒有做錯什麼。這就是如何使用非ASCII字符的互聯網郵件看起來像。當然,讀取此類郵件的軟件應檢測並解碼此類主題字段。

+3

這是原始郵件的樣子,但是當你在電子郵件客戶端中得到它時,這是錯誤的。我最近發現.NET中存在一個錯誤,這使得使用UTF-8編碼進行編碼的主體格式不正確。我已經將這個bug提交給了微軟。在研究期間,我發現一些電子郵件客戶端顯示原始Base64字符串,如果它格式不正確。不幸的是,沒有解決方法。 Dotnet不允許手動編碼主題,如果你這樣做,它會重新編碼它引入新的錯誤。 – Harry 2013-02-18 08:38:02

+1

@Harry:我想我們只是絆倒了同樣的問題 - 你有鏈接到連接錯誤和/或解決方法嗎? – 2015-02-07 19:12:20

2

答案可能在修剪主體的其餘部分 - 您提供的部分解碼爲「[p13n]文件」,但是您有任何非ASCII字符,那麼我希望它編碼因爲它具有

1

雖然我不確定,但有關wikipedia上MIME的article可能有助於獲取更多背景信息。

14

我碰到這個職位時,我調試一個相同的問題,並根據我的進一步調查,我可以提供替代解釋安德烈亞斯:

的問題可能是您的電子郵件客戶端軟件(Outlook 2003中,在我的情況下)不正確解碼主題行。換句話說,這是Outlook中的一個錯誤,而不是.NET或您的程序。

如果你使用像這樣的問題的值(字母「C」重複256次),它在Outlook中顯示正常:

subject = New String("c"c, 256) 

同樣,如果你使用像這樣的問題(字母「C 「重複178次,用所附的一個Unicode不間斷空格字符),它也顯示爲預期在Outlook:

subject = New String("c"c, 178) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160}) 

然而,下面的主題顯示爲 」= UTF-8 B「 -prepended垃圾?在Outlook中:

subject = New String("c"c, 179) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160}) 

區別在於,當UTF-8編碼時,第三個主題行是256字節。我假設Outlook必須在顯示它之前將主題行截斷爲255個字符......除了通過將編碼的字符串截斷爲255字節來切斷編碼終止符(「?=」)之外, ,使其不可解碼。

這是Outlook中的錯誤,而不是您的郵件提供程序或.NET;您可以通過右鍵單擊消息列表中的消息並從上下文菜單中選擇「選項...」,然後在「Internet標題」框中向下滾動,直至Outlook中看到完整的,未截斷的UTF-8編碼主題行你會看到以「Subject:」開頭的行。

與Andreas指出的情況相反,不僅在非ASCII字符多的情況下,而且在存在一個或多個非ASCII字符且主題行很長的情況下,問題也會顯現出來。解決方法可能是使用較短的主題行或去除主題中的所有非ASCII字符。因爲如上所述,問題數據中沒有包含明顯的非ASCII字符 - 只有少數幾個非中斷空格,這些顯示與常規ASCII空格相同打印出來到控制檯此外,如果更改在Visual Studio調試器的字符串變量的值,它靜靜地與常規空格替換它們)