SmtpClient/MailMessage 上的主題編碼
我正在嘗試使用
SmtpClient和MailMessage類發送包含非 ASCII 字元的電子郵件。我正在使用外部郵件服務 ( MailChimp ),我的一些電子郵件已被他們的 SMTP 伺服器拒絕。我已經聯繫了他們,他們是這樣回复的:
似乎主題行是 Base64 編碼,然後是 Quoted-Printable 編碼,這通常應該沒問題,但是其中一個字元被分成兩行。因此,當您的主題行有點長時,為了正確處理,它被分成兩行。在主題行中使用 UTF-8 引用可列印時,不應在行之間斷開字元串。相反,應該縮短一行,以便完整的字元串保持在一起。在這種情況下,這不會發生,因此表示單個字元的字元串被分成多行,因此不是有效的 UTF-8 引用列印編碼。
有問題的主題如下:
Subject: XXXXXXX - 5 personnes vous ont nommé guide也就是說,在 UTF-8/Base64 中:
Subject: WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3DqSBndWlkZQ==因為該標頭會超過某個最大長度(我不確定是 Quoted-Printable 編碼及其每行 76 個字元的限制,還是 SMTP 標頭限制),在編碼和拆分後,標頭將變為:
Subject: =?utf-8?B?WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3D?= =?utf-8?B?qSBndWlkZQ==?=顯然這在解碼時會導致問題(因為第一行無法解碼為有效字元串)。我不確定我是否完全理解這個問題,我有以下問題:
- 為什麼是 ?utf-8?B?部分重複?QP編碼不應該在分割線之前發生,因此它的標題不應該重複嗎?
- 在 QP 解碼之後,我們不應該得到一個有效的 1 行 Base64 字元串嗎?
- 在 QP 編碼之外的第二行開頭有一個空格,這可能是問題嗎?
- 是編碼器壞了,還是解碼器壞了?
另請注意,其他一些 SMTP 伺服器將接受此消息,但這並不意味著它是有效的。
作為一種解決方法,我嘗試禁用 Base64 編碼,這顯然是不必要的,但是 MailMessage 類具有控制此編碼的BodyTransferEncoding屬性,但僅適用於消息的正文部分。似乎沒有屬性可以控制主題的“轉移”編碼。
這在 MSDN 論壇中被確認為一個錯誤:http:
並且在 Microsoft Connect 上送出了一個錯誤: https ://connect.microsoft.com/VisualStudio/feedback/details/785710/mailmessage-subject-incorrectly-encoded-in-utf-8-base64
一種解決方法是將 MailMessage 的 SubjectEncoding 設置為其他編碼,例如 ISO-8859-1。在這種情況下,主題將被編碼為 Quoted Printable(不是 Base64),從而避免了該問題。