當程式需要寄送 e-mail 時,我原本是透過 Hinet 郵件伺服器發送,程式碼大概長這樣:
smtpMail.DeliveryMethod = SmtpDeliveryMethod.Network;
但由於 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.DeliveryMethod = SmtpDeliveryMethod.Network;
NetworkCredential cred = new NetworkCredential("使用者名稱", "使用者密碼");
smtpMail.Credentials = cred;
我還試了 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;
程式碼稍微多一點,其實如果沒有碰到特別的問題,用前面的方法就好了。
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);
從 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.DeliveryMethod = SmtpDeliveryMethod.Network;
NetworkCredential cred = new NetworkCredential("使用者名稱", "使用者密碼");
smtpMail.Credentials = cred;
smtpMail.Send(msg);
網路上有的文件說,透過 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);
程式碼稍微多一點,其實如果沒有碰到特別的問題,用前面的方法就好了。
請問如何多增加一些要填的欄位做成像是意見表表單,然後以smtpMail方式寄出?
回覆刪除Hi,
回覆刪除看你是寫 Windows 還是 ASP.NET 程式,但基本上都一樣,你在畫面(或網頁)上拉一些輸入欄位,當使用者按下[寄送]鈕時,程式去呼叫寄信的函式即可。你可以將這篇文章的程式碼修改成可重覆使用的 SendMail 函式。