[.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);


程式碼稍微多一點,其實如果沒有碰到特別的問題,用前面的方法就好了。
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor