ASP.NET MVC 模塊與組件(一)——發送郵件


   

  我的見解:

  模塊化與組件化是編程的一種思想:提高代碼的重用性,提高開發效率。

  常見的模塊化就是函數與各種類型的封裝,若是代碼具有更高的重用價值(能夠提供給別人使用),建議可以考慮封裝成動態鏈接庫(dll),直接引用使用。

  常見的組件化就是將各種需求功能封裝成一系列完整的文檔(比模塊化要求更高、更完整),要用的時候直接引用對應的文件就可以使用。

 

  說了那么多,我們就直奔今天的主題:在用ASP.NET 技術開發Web網站的時候,如何實現發送郵件的功能?

  下面的是一個專門用來發送郵件的類(封裝好了,可以直接編譯成動態鏈接庫,方便以后重復使用)(默認是以Html格式發送的郵件)

using System;
using System.IO;
using System.Net.Mail;
using System.Net.Mime;

namespace DllLibrary.SendEmail
{
    /// <summary>
    /// 發送郵件的類
    /// </summary>
    public class Email
    {
        private MailMessage mMailMessage;   //主要處理發送郵件的內容(如:收發人地址、標題、主體、圖片等等)
        private SmtpClient mSmtpClient; //主要處理用smtp方式發送此郵件的配置信息(如:郵件服務器、發送端口號、驗證方式等等)
        private int mSenderPort;   //發送郵件所用的端口號(htmp協議默認為25)
        private string mSenderServerHost;    //發件箱的郵件服務器地址(IP形式或字符串形式均可)
        private string mSenderPassword;    //發件箱的密碼
        private string mSenderUsername;   //發件箱的用戶名(即@符號前面的字符串,例如:hello@163.com,用戶名為:hello)
        private bool mEnableSsl;    //是否對郵件內容進行socket層加密傳輸
        private bool mEnablePwdAuthentication;  //是否對發件人郵箱進行密碼驗證

        ///<summary>
        /// 構造函數
        ///</summary>
        ///<param name="server">發件箱的郵件服務器地址</param>
        ///<param name="toMail">收件人地址(可以是多個收件人,程序中是以“;"進行區分的)</param>
        ///<param name="fromMail">發件人地址</param>
        ///<param name="subject">郵件標題</param>
        ///<param name="emailBody">郵件內容(可以以html格式進行設計)</param>
        ///<param name="username">發件箱的用戶名(即@符號前面的字符串,例如:hello@163.com,用戶名為:hello)</param>
        ///<param name="password">發件人郵箱密碼</param>
        ///<param name="port">發送郵件所用的端口號(htmp協議默認為25)</param>
        ///<param name="sslEnable">true表示對郵件內容進行socket層加密傳輸,false表示不加密</param>
        ///<param name="pwdCheckEnable">true表示對發件人郵箱進行密碼驗證,false表示不對發件人郵箱進行密碼驗證</param>
        public Email(string server, string toMail, string fromMail, string subject, string emailBody, string username, string password, string port, bool sslEnable, bool pwdCheckEnable)
        {
            try
            {
                mMailMessage = new MailMessage();
                mMailMessage.To.Add(toMail);
                mMailMessage.From = new MailAddress(fromMail);
                mMailMessage.Subject = subject;
                mMailMessage.Body = emailBody;
                mMailMessage.IsBodyHtml = true;
                mMailMessage.BodyEncoding = System.Text.Encoding.UTF8;
                mMailMessage.Priority = MailPriority.Normal;
                this.mSenderServerHost = server;
                this.mSenderUsername = username;
                this.mSenderPassword = password;
                this.mSenderPort = Convert.ToInt32(port);
                this.mEnableSsl = sslEnable;
                this.mEnablePwdAuthentication = pwdCheckEnable;
            }
            catch (Exception ex)
            {
                throw ex;
                //Console.WriteLine(ex.ToString());
            }
        }

        ///<summary>
        /// 添加附件
        ///</summary>
        ///<param name="attachmentsPath">附件的路徑集合,以分號分隔</param>
        public void AddAttachments(string attachmentsPath)
        {
            try
            {
                string[] path = attachmentsPath.Split(';'); //以什么符號分隔可以自定義
                Attachment data;
                ContentDisposition disposition;
                for (int i = 0; i < path.Length; i++)
                {
                    data = new Attachment(path[i], MediaTypeNames.Application.Octet);
                    disposition = data.ContentDisposition;
                    disposition.CreationDate = File.GetCreationTime(path[i]);
                    disposition.ModificationDate = File.GetLastWriteTime(path[i]);
                    disposition.ReadDate = File.GetLastAccessTime(path[i]);
                    mMailMessage.Attachments.Add(data);
                }
            }
            catch (Exception ex)
            {
                throw ex;
                //Console.WriteLine(ex.ToString());
            }
        }


        /// <summary>
        /// 郵件的發送
        /// </summary>
        /// <returns>發送成功返回true,否則返回false</returns>
        public bool Send()
        {
            try
            {
                if (mMailMessage != null)
                {
                    mSmtpClient = new SmtpClient();
                    //mSmtpClient.Host = "smtp." + mMailMessage.From.Host;
                    mSmtpClient.Host = this.mSenderServerHost;
                    mSmtpClient.Port = this.mSenderPort;
                    mSmtpClient.UseDefaultCredentials = false;
                    mSmtpClient.EnableSsl = this.mEnableSsl;
                    if (this.mEnablePwdAuthentication)
                    {
                        System.Net.NetworkCredential nc = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
                        //mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
                        //NTLM: Secure Password Authentication in Microsoft Outlook Express
                        mSmtpClient.Credentials = nc.GetCredential(mSmtpClient.Host, mSmtpClient.Port, "NTLM");
                    }
                    else
                    {
                        mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
                    }
                    mSmtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
                    mSmtpClient.Send(mMailMessage);
                }
            }
            catch
            {
                return false;
            }
            return true;
        }
    }
}
View Code

  使用這個發送郵箱類的實例代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using Test.Models;
using DllLibrary.SendEmail;//引入對應命名空間

namespace Test.Controllers
{
    public class HomeController : Controller
    {
    
        /// <summary>
        /// 發送郵件
        /// </summary>
        /// <param name="title">郵件主題</param>
        /// <param name="email">要發送對象的郵箱</param>
        /// <param name="content">郵件內容</param>
        /// <returns></returns>
         public ActionResult SendMail(string title, string email, string content)
        {
                string senderServerIp = "smtp.163.com";   //使用163代理郵箱服務器(也可是使用qq的代理郵箱服務器,但需要與具體郵箱對相應)
                string toMailAddress = email;              //要發送對象的郵箱
                string fromMailAddress = "XXXXXX@163.com";//你的郵箱
                string subjectInfo = title;                  //主題
                string bodyInfo = "<p>" + content  + "</p>";//以Html格式發送的郵件
                string mailUsername = "XXX";              //登錄郵箱的用戶名
                string mailPassword = "xomeagyungxzhsxf"; //對應的登錄郵箱的第三方密碼(你的郵箱不論是163還是qq郵箱,都需要自行開通stmp服務)
                string mailPort = "25";                      //發送郵箱的端口號
                //string attachPath = "E:\\123123.txt; E:\\haha.pdf";

                //創建發送郵箱的對象
                Email myEmail = new Email(senderServerIp, toMailAddress, fromMailAddress, subjectInfo, bodyInfo, mailUsername, mailPassword, mailPort, false, false);
                
                //添加附件
                //email.AddAttachments(attachPath);
                
                if (myEmail.Send())
                {
                    return Content("<script>alert('郵件已成功發送!')</script>");
                }
                else
                {
                    return Content("<script>alert('郵件發送失敗!')</script>");
                }

        }
        
    }
}
View Code

  簡單說明:要發送郵件,需要開通一個stmp服務的郵箱號。(可以到163官網申請一個163郵箱,並且開通stmp服務就可以了(注:示例代碼中所使用的密碼是在開通stmp服務時,單獨發送的第三方登錄密碼,而不是登錄郵箱的密碼))

  好了,這次分享就到這里了,下次繼續。。。

  <我的博客主頁>:http://www.cnblogs.com/forcheng/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM