用 .NET 發信很簡單,但是要發出一封「完美的郵件」卻困難重重!我為了發一封完美的 E-Mail 遭遇到好多問題,但嘗試了很久還是無法達到 100% 的完美程度。
主要的問題整理如下:
使用 System.Web.Mail 命名空間發信的問題 ( .NET 1.0 )
使用 System.Net.Mail 命名空間發信的問題 ( .NET 2.0 )
其實 System.Net.Mail 寫得很好,但是這一點點小問題真的讓我很頭痛,因為有很多舊版的 WebMail 系統與一些舊版的收信軟體至今還是不支援 Unicode 的郵件閱讀,所以為了發出郵件的相容性達到最高(讓所有的人都能夠正確開啟郵件),還是有必要將郵件以 Big5 編碼的方式發送,否則總是有一些人看不到 E-Mail 或者是必須手動調整 Browser 的字集才看的到。
如果你想試看看用 System.Net.Mail 發信時如何發生錯誤,可以試試以下的程式碼,請建立一個 Console Pogram 就可以測試了:
[code:c#]
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Mail;
namespace SystemNetMailTest
{
class Program
{
static void Main(string[] args)
{
string myMailEncoding = "BIG5";
string myFromEmail = "test@test.com";
string myFromName = "多奇-寶貝-寄件者";
string myToEmail = "test@test.com";
string myToName = "多奇-寶貝-收件者";
MailAddress from = new MailAddress(myFromEmail, myFromName, Encoding.GetEncoding(myMailEncoding));
MailAddress to = new MailAddress(myToEmail, myToName, Encoding.GetEncoding(myMailEncoding));
MailMessage myMessage = new MailMessage(from, to);
myMessage.Subject = "多奇-寶貝-郵件主旨";
myMessage.SubjectEncoding = Encoding.GetEncoding(myMailEncoding);
myMessage.Body = "<h1>這是郵件內容</h1>";
myMessage.BodyEncoding = Encoding.GetEncoding(myMailEncoding);
myMessage.IsBodyHtml = true;
myMessage.Priority = MailPriority.High;
SmtpClient smtp = new SmtpClient("localhost");
try
{
smtp.Send(myMessage);
Console.WriteLine(DateTime.Now.ToString() + " 寄信成功");
}
catch
{
Console.WriteLine(DateTime.Now.ToString() + " 寄信失敗!!!");
}
Console.ReadKey();
}
}
}
[/code]
執行完後去收信,就會發現以下的錯誤,郵件中只要出現「奇」或「寶」等字,都一定會變成亂碼,其他的中文字也可能會這樣:
相關連結