The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

System.Web.Mail 太陽春、System.Net.Mail 有問題

用 .NET 發信很簡單,但是要發出一封「完美的郵件」卻困難重重!我為了發一封完美的 E-Mail 遭遇到好多問題,但嘗試了很久還是無法達到 100% 的完美程度。

主要的問題整理如下:

使用 System.Web.Mail 命名空間發信的問題 ( .NET 1.0 )

  • 骨子裡是使用 CDO 元件 ( Microsoft CDO for Windows 2000 ) ( CDONTS ),包裝的功能陽春到不行
  • 無法將郵件的附件檔案設定為 Inline Attachment

使用 System.Net.Mail 命名空間發信的問題 ( .NET 2.0 )

  • 傳送 Big5 編碼的郵件,有些中文字在 Outlook 裡會變成問號 (例如:奇, 寶)

    註1:因為 System.Net.Mail 在設定 Envelop Header 時只能使用的 Quoted-Printable 編碼,如果可以選擇 Base64 問題就會迎刃而解!可惜到 .NET 3.5 還是沒有將這問題解決!

    註2:微軟是建議使用 System.Net.Mail 來發信,但若真的要使用就比需要強迫使用 UTF-8 來發送郵件才不會出現問號。

其實 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]

執行完後去收信,就會發現以下的錯誤,郵件中只要出現「奇」或「寶」等字,都一定會變成亂碼,其他的中文字也可能會這樣:

特定文字變成亂碼的圖示

相關連結

留言評論