[.NET Code] 在 .NET 程式中透過 Gmail 伺服器發信

當程式需要寄送 e-mail 時,我原本是透過 Hinet 郵件伺服器發送,程式碼大概長這樣:

Encoding enc = Encoding.GetEncoding("BIG5");

MailMessage msg = new MailMessage();

msg.From = new MailAddress("寄信人@culala.com", "寄信人姓名", enc);

msg.To.Add(new MailAddress("收信人@wulala.com", "收信人姓名", enc));

msg.Subject = "使用者意見回報";

msg.SubjectEncoding = enc; // 設定標題編碼

msg.Body = "Bug 好多 Orz....";

msg.BodyEncoding = enc; //設定內文編碼


SmtpClient smtpMail = new SmtpClient();

smtpMail.Host = "msa.hinet.net";

smtpMail.Port = 25;

smtpMail.UseDefaultCredentials = true;
smtpMail.DeliveryMethod = SmtpDeliveryMethod.Network;

smtpMail.Send(msg);


但由於 Hinet 只允許自家客戶使用它們的伺服器發信,所以當我的程式部署到別的網路環境時,就無法寄送信件(錯誤訊息是 ....relaying denied)。當然,我可以將寄送郵件的參數儲存在應用程式組態檔中,並且在部署到目標環境時,根據當時的網路環境調整相關參數。但我想,何不試試 Gmail?這樣不管到哪裡都可以用同一組設定了。

從 Gmail 官方網站的說明文件可以得知相關參數,包括:SMTP host 、必須啟用 SSL 連線、使用的 port、必須驗證使用者的帳號密碼等等。其中比較值得注意的,是依郵件用戶端軟體的不同,有的 SMTP port 必須用 465(如 Outlook 2003)、有的則是 587(如 Outlook 2007)。

我試的結果,如果 port 用 465,.NET 的 SmtpClient 類別在寄送郵件時就會發生 timeout 錯誤。用 587 則可以成功寄送。程式碼如下:

SmtpClient smtpMail = new SmtpClient();
smtpMail.Host = "smtp.gmail.com";

smtpMail.Port = 587;
smtpMail.EnableSSL = true;

smtpMail.UseDefaultCredentials = false;
smtpMail.DeliveryMethod = SmtpDeliveryMethod.Network;
NetworkCredential cred = new NetworkCredential("使用者名稱", "使用者密碼");
smtpMail.Credentials = cred;

smtpMail.Send(msg);


我還試了 port 25,發現也可以成功寄送。這倒有點意外,Gmail 官方網站上似乎沒有提到可以用這個 port。

網路上有的文件說,透過 Gmail 發信時,傳入 NetworkCredential 建構元的"使用者名稱"必須使用完整的 e-mail 帳號(也就是後面要加上 @gmail.com),我試的結果是無論有沒有加 domain 名稱都可以。

另外,你也可以用 CredentialCache 類別來指定驗證的帳號密碼,像這樣:

......
NetworkCredential
cred = new NetworkCredential("使用者名稱", "使用者密碼");
CredentialCache credCache = new CredentialCache();
credCache.Add(smtpMail.Host, smtpMail.Port, "login", cred);
smtpMail.Credentials = credCache;

smtpMail.Send(msg);


程式碼稍微多一點,其實如果沒有碰到特別的問題,用前面的方法就好了。

2 則留言:

  1. 請問如何多增加一些要填的欄位做成像是意見表表單,然後以smtpMail方式寄出?

    回覆刪除
  2. Hi,

    看你是寫 Windows 還是 ASP.NET 程式,但基本上都一樣,你在畫面(或網頁)上拉一些輸入欄位,當使用者按下[寄送]鈕時,程式去呼叫寄信的函式即可。你可以將這篇文章的程式碼修改成可重覆使用的 SendMail 函式。

    回覆刪除

技術提供:Blogger.
回頂端⬆️