﻿# 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 就可以測試了：

```csharp
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();
        }
    }
}
```

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

> ![特定文字變成亂碼的圖示](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/945450b6e7995047f7b2-Screenshot-080202-142230.png "特定文字變成亂碼的圖示")

**相關連結**

-   關於 MailMessage 寄信後部分中文字會出現問號的問題(在Big5編碼下)
