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