這個話題是在閱讀http://www.cnblogs.com/techborther/archive/2011/11/23/2260627.html的時候,自己通過qq郵箱來實現該功能的,不過我只是想把該篇博客的做法在流程化一下。
一:QQ設置郵箱的設置
首先進入自己的qq郵箱當中,這個qq郵箱就是網站作為回復那些注冊用戶的郵箱。然后進行設置:

往下拖動,你會看見“POP3/IMAP/SMTP/Exchange服務”的設置,把第一項選上。如果你的qq郵箱不滿14天就暫時不能使用它來做相關的設置。

二:到現在為止已經將郵箱設置好了,可以使用它來執行用戶注冊的郵件回復通知功能。假設我的qq號是10000,那么qq郵箱就為10000@qq.com,另外我的密碼為10000。
三:新建一個Asp.Net MVC3的項目EmailReply,其中項目模板為InternetApplication,視圖引擎為Razor,其實就是自動生成的那個項目。下面就是希望在用戶注冊的時候,能夠往用戶填寫的郵箱地址中發送一份注冊通知郵件,所以要在AccountController的Register方法上去改動。
四:在EmailReply項目的配置文件中,將我們的郵件服務器的信息添加到<appSettings>配置節中,這些信息將會在程序中讀取。
<appSettings>
<add key="smtpServer" value="smtp.qq.com"/> <add key="smtpPort" value="25"/> <add key="smtpUser" value="10000@qq.com"/> <add key="smtpPass" value="10000"/> <add key="adminEmail" value="10000@qq.com"/> </appSettings>
下面是qq郵箱的配置信息:

五:和參考博客一樣在項目中創建一個Uitls文件夾,然后放一個靜態類去實現郵件功能:
namespace MVCRecipe.Uitls { public static class MailClient { private static readonly SmtpClient Client; static MailClient() { Client = new SmtpClient { Host = ConfigurationManager.AppSettings["SmtpServer"], Port = Convert.ToInt32(ConfigurationManager.AppSettings["SmtpPort"]), DeliveryMethod = SmtpDeliveryMethod.Network }; Client.UseDefaultCredentials = false; Client.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["SmtpUser"], ConfigurationManager.AppSettings["SmtpPass"]); } private static bool SendMessage(string from, string to, string subject, string body) { MailMessage mm = null; bool isSent = false; try { mm = new MailMessage(from, to, subject, body); mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; mm.BodyEncoding = System.Text.Encoding.UTF8; mm.IsBodyHtml = true; Client.Send(mm); isSent = true; } catch (Exception ex) { var exMsg = ex.Message; } finally { mm.Dispose(); } return isSent; } public static bool SendWelcome(RegisterModel registerModel) { string body = "<p><b>尊敬的用戶" + registerModel.UserName + "</b></p>"; body += "<p>祝賀您成功注冊tt網(www.tt.com)。請您妥善保管好賬號信息,以免給您帶來不必要的損失!</P>"; return SendMessage(ConfigurationManager.AppSettings["adminEmail"], registerModel.Email, "歡迎加入tt網", body); } } }
六:修改Register注冊方法
[HttpPost] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { MembershipCreateStatus createStatus; Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus); if (createStatus == MembershipCreateStatus.Success) { try { MailClient.SendWelcome(model); } catch { } FormsAuthentication.SetAuthCookie(model.UserName, false); return RedirectToAction("Index", "Home"); } else { ModelState.AddModelError("", ErrorCodeToString(createStatus)); } } return View(model); }
七:這樣,如果某個注冊用戶在注冊頁面輸入如下信息:
User Name:Saber
EmailAddress:34444@qq.com
Password:98Q)_wwA
Confirm Password:98Q)_wwA
那么該用戶輸入的郵箱中就會接收到下面一封郵件

八:拓展
其實這樣做具體的應用價值還不夠,一般我們注冊一個網站的時候會先接收一個注冊確認的郵件。
在Register控制器中,不將用戶寫入用戶表當中,而將該操作推遲到用戶點擊郵件確認的時候。所以,我們在Register控制器中僅僅進行用戶注冊郵件的回復,但在這個回復當中包含一個注冊確認的鏈接。這個鏈接可以導航到RegisterConfirm控制器中,這個控制器才是我們把用戶填入用戶表的地方。
然而回復確認鏈接一般使用/Account/RegisterConfirm?UserName=加密&Email=加密&Password=加密的形式來做,這樣用戶只要點擊這個連接,我們在RegisterConfirm的方法中接收並解密,然后才把用戶添加到數據庫當中,跳轉相應的頁面即可。
還存在的一個做法是,在用戶提交注冊的時候已經將用戶添加到用戶表當中,不過郵件確認為激活確認。這樣就很容易想到,用戶表中,每個用戶都有激活和未激活的狀態,這樣做激活郵件僅僅包含一個用戶ID。
---------------------------------------------------------------華麗的分割線------------------------------------------------------------
最近又要用到發送郵件的功能,卻發現上面的方法發送不了了。
使用QQ郵箱生成動態授權碼,不要使用登錄密碼了。

下面OutLook配置也是密碼中,也是使用這個授權碼才可以。
WebConfig
<appSettings> <add key="MailServer" value="smtp.qq.com"/> <add key="Port" value="587"/> <add key="EnableSSL" value="true"/> <add key="EmailFromAddress" value="XXX@qq.com"/> <add key="MailAuthUser" value="XXX@qq.com"/> <add key="MailAuthPass" value="授權碼"/> </appSettings>
幫助類
public class MailHelper { private const int Timeout = 180000; private readonly string _host; private readonly int _port; private readonly string _user; private readonly string _pass; private readonly bool _ssl; public string Sender { get; set; } public string Recipient { get; set; } public string RecipientCC { get; set; } public string Subject { get; set; } public string Body { get; set; } public string AttachmentFile { get; set; } public MailHelper() { //MailServer - Represents the SMTP Server _host = ConfigurationManager.AppSettings["MailServer"]; //Port- Represents the port number _port = int.Parse(ConfigurationManager.AppSettings["Port"]); //MailAuthUser and MailAuthPass - Used for Authentication for sending email _user = ConfigurationManager.AppSettings["MailAuthUser"]; _pass = ConfigurationManager.AppSettings["MailAuthPass"]; _ssl = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableSSL"]); } public void Send() { try { // We do not catch the error here... let it pass direct to the caller Attachment att = null; var message = new MailMessage(Sender, Recipient, Subject, Body) { IsBodyHtml = true }; if (RecipientCC != null) { message.Bcc.Add(RecipientCC); } var smtp = new SmtpClient(_host, _port); if (!String.IsNullOrEmpty(AttachmentFile)) { if (File.Exists(AttachmentFile)) { att = new Attachment(AttachmentFile); message.Attachments.Add(att); } } if (_user.Length > 0 && _pass.Length > 0) { smtp.UseDefaultCredentials = false; smtp.Credentials = new NetworkCredential(_user, _pass); smtp.EnableSsl = _ssl; } smtp.Send(message); if (att != null) att.Dispose(); message.Dispose(); smtp.Dispose(); } catch (Exception ex) { } } }
public static class MailClient { public static bool SendBug(BugDataModel bugDataModel) { string s = string.Empty; EmplayeeDataModel[] models; using (EmplayeeServiceClient svc = new EmplayeeServiceClient()) { models = svc.GetEmployeeDataList("where empBase.empId='" + bugDataModel.DealerId + "'", "order by empBase.empId desc", 0, 10, ref s); } if (models.Length > 0 && !string.IsNullOrEmpty(models[0].Email)) { string body = "<p><b>" + models[0].Name + "</b></p>"; body += "<p>屬於你的缺陷發生變化,缺陷標題:" + bugDataModel.Title + "</p>"; MailHelper mailHelper = new MailHelper() { Sender = ConfigurationManager.AppSettings["EmailFromAddress"], Recipient = models[0].Email, RecipientCC = null, Subject = "缺陷通知", Body = body }; mailHelper.Send(); return true; } else { return false; } } }
調用和效果
MailClient.SendBug(bugDataModel);

