这个话题是在阅读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);

