最近同事詢問透過 SmtpClient 去寄送 Mail 時,在 Zimbra 的 Web 界面看會有 ? 的狀況,如下圖,

觀察發現,當主旨太長時才會有這個問題。在 Zimbra 中檢查 Mail 的內容,發現主旨被切分成多段,如下圖,

而那些再透過 Base64 轉回來,的確會有 ? 的狀況,看起來應該是 MailMessage 在切分時剛好切到一半所造成的,如下圖,

但是這樣子的狀況,在 outlook 來看卻是沒問的哦~~~ 如下圖,

在網路上查到 4.0 SMTPClient.Send Attachments mit Umlauten im Dateinamen ,它指出 Base64 會每 30 個字切成一段去串,QuotedPrintable 則是每 76 個字去切。 而我們的狀況似乎是因為它是將字串轉成 Base64 去切,所以會有切到一半的狀況。
所以我們可以調整他的做法,將原始的字串依 7 個字串先切開再串接即可,如下,
1 | public class EmailHeaderHelper |
所以使用如下,
1 | string subject = "華華華(華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華"; |
不過筆者發現,如果您有 2 個 =?utf-8?B? 的話, .NET 的 Mail 元件似乎也不會自動去幫你切斷,所以另個寫法是自已串 Base64 的字串後,再串一個空的 =?utf-8?B? ,如下,
1 | string subject = "華華華(華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華華"; |
