OpenSMTP.Net 是 .Net 平台下一個免費、open source 的 SMTP 元件,中文的介紹可以參考 Neo's Blog 的免費的 .Net Email 元件一文介紹。
最近在使用 OpenSMTP.Net 來發信上遇到了問題,就是只要信件主旨一太長,超過十二個全型字,那使用者收到的信件就會是一堆亂碼。
有興趣的朋友可以用下列的程式碼測看看︰
Dim from As New EmailAddress("from@abc.com", "From")
Dim sto As New EmailAddress("to@abc.com", "to")
Dim msg As New OpenSmtp.Mail.MailMessage(from, sto)
msg.Subject = "一二三四五六七八九十一二三"
msg.Body = "內文"
msg.Charset = "big5"
Dim Smtp As New Smtp("smtp.abc.com", 25)
Smtp.Username = "username" '有支援 SMTP 認證
Smtp.Password = "password"
Smtp.SendMail(msg)
今天總算找到瞭解決這問題的方式,詳細說明可以參考 haogj 關於 OpenSmtp 郵件標題過長後出現亂碼問題的解決一文的說明。在這邊記錄一下 patch 程式的步驟︰
1. 到 OpenSMTP.Net 官網下載最後 release 的 source code,目前最後的版本為 01.11.0 版。
2. 解壓縮後,開啟 src/MailEncoder.cs 檔,加入下方的 function︰
public static string ConvertHeaderToBase64(string s, string charset)
{
int lineLength = 40;
Encoding encoding = Encoding.GetEncoding(charset);
byte[] buffer = encoding.GetBytes(s);
StringBuilder sb = new StringBuilder();
string linebase64;
int block = buffer.Length % lineLength == 0 ? buffer.Length / lineLength : buffer.Length / lineLength + 1;
for (int i = 0; i < block; i++)
{
if (buffer.Length - i * lineLength >= lineLength)
linebase64 = Convert.ToBase64String(buffer, i * lineLength, lineLength);
else
linebase64 = Convert.ToBase64String(buffer, i * lineLength, buffer.Length - i * lineLength);
sb.Append("=?");
sb.Append(charset);
sb.Append("?B?");
sb.Append(linebase64);
sb.Append("?=\r\n\t");
}
sb.Remove(sb.Length - 3, 3);
return sb.ToString();
}
3. 開啟 src/MailMessage.cs 檔,在 toString() function 中,將下列這一行 source code 註解起來︰
//sb.Append("Subject: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "\r\n");
改成這一行︰
sb.Append("Subject: " + MailEncoder.ConvertHeaderToBase64(cleanSubject.ToString(), charset) + "\r\n");
4. 在 src/ 目錄下,以下列命令重新 compile OpenSMTP
csc.exe /o+ /nologo /warn:3 /checked /t:library /out:..\bin\OpenSmtp.dll /doc:..\OpenSmtp.xml *.cs
5. 在 bin/ 目錄下就可以得到重編過的 OpenSMTP.dll 檔,用它來取代原本的 dll 檔就可以解決這個問題了。
1 意見:
您好
我有試過您的方法
但還是出現亂碼,您方便把改過的Code
跟編譯過的dll寄給我嗎?
wong@mail2000.com.tw
謝謝你!
張貼留言