2014年2月1日 星期六

自行架設smtp server,透過ASP.NET程式傳送電子郵件

我想要自己做一個功能:使用者申請新帳號後,由系統發送認證的Email到使用者填寫的信箱。本來是想說用Gmail發信試試看,但是一直不成功(還沒找出原因),後來想想既然自己有Server,何不乾脆自己架個Mail Server?於是乎研究了一下,還蠻簡單的。

架設smtp server可利用免費軟體hMailServer(http://www.hmailserver.com)達成。參考以下網誌:

3分鐘輕鬆擁有自己的Mail Server
http://blog.xuite.net/sendohshih/blog/41958216

使用hMailServer步驟:



  1. 新增網域(Domain):因為只是作為系統發送郵件之用,故直接使用伺服器的IP作為domain name即可。例如140.112.X.X
  2. 在網域底下新增帳號:設定好帳號密碼,Administration level選擇User即可。等一下在程式碼中要使用這組帳號密碼。
  3. 接下來要到設定Settings>Protocols>SMTP,第二個頁籤"Delivery of e-mail",裡面有一個Local host name需要填寫東西。好像隨便填什麼都可以,不知道填什麼就填IP吧。
  4. **要注意的是防火牆需要允許Port 25(預設)連入。像我的的作業系統是windows server 2012,預設是沒有開啟的,需要到「具有進階安全性的Windows防火牆」裡面去新增規則,允許port 25。
ASP.NET程式碼(C#):

首先要using System.Net.Mail;
接下來這個function是從這邊copy過來的再稍微修改 http://www.codeproject.com/Questions/254743/sending-email-in-asp-net-using-smtp-gmail-server


/// <summary>
/// 發Email的功能。回傳成功或錯誤訊息。
/// </summary>
/// <param name="toList">收件者地址,一個以上可以分號分隔</param>
/// <param name="from">寄件者地址</param>
/// <param name="ccList">副本地址</param>
/// <param name="subject">主旨</param>
/// <param name="body">信件內容</param>
/// <returns></returns>
public string SendMail(string toList, string from, string ccList, string subject, string body)
{
            MailMessage message = new MailMessage();
            SmtpClient smtpClient = new SmtpClient();
            string msg = string.Empty;
            try
            {
                MailAddress fromAddress = new MailAddress(from);
                message.From = fromAddress;
                message.To.Add(toList);
                if (ccList != null && ccList != string.Empty)
                    message.CC.Add(ccList);
                message.Subject = subject;
                message.IsBodyHtml = true;
                message.Body = body;
                smtpClient.Host = "140.112.X.X"; //您的IP!!
                smtpClient.Port = 25;
                smtpClient.EnableSsl = false;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials = new System.Net.NetworkCredential("剛剛設定的帳戶", "密碼");

                smtpClient.Send(message);
                msg = "寄送成功";
            }
            catch (Exception ex)
            {
                   msg = ex.Message;
            }
     return msg;
}


設定好這個function,就可以愉快的寄送email了。
有趣的是可以隨便設定寄件者地址,所以我們可以知道E-mail的寄件者地址不一定是可靠的。例如說也可以設定類似 no-reply@mycompany.com作為寄件者地址,註明「此為系統信件請勿回覆!」因為這個地址根本是亂寫的~回了也不會有人收到~


沒有留言:

張貼留言

跟我說說話吧!