C#操作qq邮箱SMTP服务器来为你的网站实现用户注册的邮件回复功能


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM