[.NET] MailMessage 的 Sender 和 From? 傻傻分不清楚~

今天在使用 MailMessage 和 SmtpClient 寫寄信程式,按照平常的寫法去做,Compile 沒有問題,但發信時卻出現了 "必須指定來源位址" 的訊息,但原程式和以前沒什麼變啊 (當下看的),後來我去查了一下 MSDN Library,發現了兩個很模棱兩可的屬性...

今天在使用 MailMessage 和 SmtpClient 寫寄信程式,按照平常的寫法去做,Compile 沒有問題,但發信時卻出現了 "必須指定來源位址" 的訊息,但原程式和以前沒什麼變啊 (當下看的),後來我去查了一下 MSDN Library,發現了兩個很模棱兩可的屬性:

image

因為看不懂這兩個的區別 (說明都一模一樣 Orz),所以我就開了 Reflector 去解了 System.dll 中的 System.Net.Mail.SmtpClient 中的 Send() 方法,發現它會檢查 From 屬性是否存在,而我程式中只設定了 Sender,所以才會一直丟錯,後來我將 Sender 改設為 From 就解決問題了,不過我還是很好奇這兩個有什麼差別,所以做了一下實驗,發現:

  • 當 Sender 和 From 有同時指定時,SmtpClient 會以 Sender 為主。
  • 當 Sender 和 From 之間若有無效 Email Address (或兩者都是無效 Email Address) 時,Mail Server 會自動以登入帳戶的 Email Address 為主。
  • 當 Sender 和 From 使用的名稱不同時,SmtpClient 會取用 From 的名稱。

簡單的說,當 Sender 與 From 都有設定時,Mail Server 會取用 Sender 的設定發信,但郵件上的名稱會使用 From 的設定,而若不需要 Sender 和 From 同時設定時,則 Sender 可以免設,但 From 一定要設。

PS: 我使用的是 Gmail,若是其他郵件系統可能會有不同的行為。

Reference:

MSDN MailMessage Class: http://msdn.microsoft.com/zh-tw/library/system.net.mail.mailmessage.aspx