C#发送邮件工具类

public class MailHelper
    {
        private string _smtpServer;
        private int _port;
        private string _mailFrom;
        private string _password;
        private int _timeout;
        private string _mailTo;
        private string _mailCc;
        private string _mailBcc;
        private string _mailSubject;
        private string _mailBody;
        private bool _hasAttachment=false;
        private ArrayList  _attachmentPathList;
        private decimal _attachmentMaxSize;

        /// <summary>
        /// 属性:邮件SMTP服务器
        /// </summary>
        public string SMTPServer
        {
            set { _smtpServer = value; }
            get { return _smtpServer; }
        }

        /// <summary>
        /// 属性:邮件SMTP服务器端口号
        /// </summary>
        public int Port
        {
            set { _port = value; }
            get { return _port; }
        }

        /// <summary>
        /// 属性:邮件发送人
        /// </summary>
        public string MailFrom
        {
            set { _mailFrom = value; }
            get { return _mailFrom; }
        }

        /// <summary>
        /// 属性:发件人邮件SMTP服务器认证密码
        /// </summary>
        public string Password
        {
            set { _password = value; }
            get { return _password; }
        }

        /// <summary>
        /// 邮件发送超时间
        /// </summary>
        public int Timeout
        {
            set { _timeout = value; }
            get { return _timeout; }
        }

        /// <summary>
        /// 属性:邮件收件人列表
        /// </summary>
        public string MailTo
        {
            set { _mailTo = value; }
            get { return _mailTo; }
        }

        /// <summary>
        /// 属性:邮件抄送人列表
        /// </summary>
        public string MailCc
        {
            set { _mailCc = value; }
            get { return _mailCc; }
        }

        /// <summary>
        /// 属性:邮件密送人列表
        /// </summary>
        public string MailBcc
        {
            set { _mailBcc = value; }
            get { return _mailBcc; }
        }

        /// <summary>
        /// 属性:邮件主题
        /// </summary>
        public string MailSubject
        {
            set { _mailSubject = value; }
            get { return _mailSubject; }
        }
         
        /// <summary>
        /// 属性:邮件内容
        /// </summary>
        public string MailBody
        {
            set { _mailBody = value; }
            get { return _mailBody; }
        }

        /// <summary>
        /// 是否包含附件
        /// </summary>
        public bool HasAttachment
        {
            set { _hasAttachment = value; }
            get { return _hasAttachment; }
        }

        /// <summary>
        /// 附件文件路径列表
        /// </summary>
        public ArrayList AttachmentPathList
        {
            set { _attachmentPathList = value; }
            get { return _attachmentPathList; }
        }

        /// <summary>
        /// 附件最大的大小
        /// </summary>
        public decimal AttachmentMaxSize
        {
            get { return _attachmentMaxSize; }
            set { _attachmentMaxSize = value; }
 
        }

        /// <summary>
        /// 空白构造函数
        /// </summary>
        public MailHelper()
        {
            Initialization();
        }

        #region 检测附件大小
        private bool ValidateAttachmentSize(string AttachmentPath, decimal AttchmentMaxSize)
        {

                FileStream FileStream_my = new FileStream(AttachmentPath, FileMode.Open);
                string name = FileStream_my.Name;
                decimal size = (decimal)(FileStream_my.Length / 1024 / 1024);
                FileStream_my.Close();
                FileStream_my.Dispose();
                //控制文件大小不大于10M
                if (size > AttchmentMaxSize)
                {
                    return false;
                }
                else
                {
                    return true;
                }
           

        }
        #endregion

        #region 获取邮件地址中用户名部分
        /// <summary>
        /// 获取邮件地址中用户名部分
        /// </summary>
        /// <param name="MailAddress">邮件地址</param>
        /// <returns></returns>
        private string GetMailUserName(string MailAddress)
        {
            MailAddress = MailAddress.Trim();
            int separatorPos = MailAddress.IndexOf('@');
            string userName = MailAddress.Substring(1, separatorPos - 1);
            return userName;
        }
        #endregion

        #region  验证输入字符串为E-mail地址
        public bool ValidateEmail(string EmailAddress)
        {
            EmailAddress = EmailAddress.Trim();
            string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
            Regex re = new Regex(strRegex);
            if (re.IsMatch(EmailAddress))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion


        #region 将EMAIL地址字符串转换成EMAIL地址列表
        /// <summary>
        /// 将EMAIL地址字符串转换成EMAIL地址列表
        /// </summary>
        /// <param name="MailAddressString">EMAIL地址字符串</param>
        /// <returns>EMAIL地址列表</returns>
        private List<MailAddress> ConvertToMailAdress(string MailAddressString)
        {
            List<MailAddress> myAddressList = new List<MailAddress>();
            string displayName = "";
            string address = "";
            if (string.IsNullOrEmpty(MailAddressString))
            {
                throw new Exception("输入的邮件地址字符串为空");
            }
            MailAddressString=MailAddressString.Trim().TrimEnd(new char[]{';',','});
            string[] mailString = MailAddressString.Split(new char[] { ';', ',' });
            for (int i = 0; i < mailString.Length; i++)
            {
                int speratorStartPos = mailString[i].IndexOf('<');
                int speratorEndPos = mailString[i].LastIndexOf('>');
                //如果地址中存在格式1234<6789@123.com>
                if (speratorStartPos != -1 && speratorEndPos != -1)
                {
                    if (speratorEndPos < speratorStartPos)
                    {
                        throw new Exception("邮件地址:" + mailString[i] + "格式不正确");
                    }
                    displayName = mailString[i].Substring(0, speratorStartPos).Trim();
                    address = mailString[i].Substring(speratorStartPos + 1, speratorEndPos - speratorStartPos-1).Trim();
                    if (!this.ValidateEmail(address))
                    {
                        throw new Exception("邮件地址:" + mailString[i] + "格式不正确");
                    }
                    else
                    {
                        MailAddress myMailAdree = new MailAddress(address, displayName);
                        myAddressList.Add(myMailAdree);
                    }
                }
                else
                {
                    //否则直接认为是EMAIL地址
                    if (!this.ValidateEmail(mailString[i].Trim()))
                    {
                        throw new Exception("邮件地址:" + mailString[i] + "格式不正确");
                    }
                    else if (mailString[i].Trim()!="")
                    {
                        
                        MailAddress myMailAdree = new MailAddress(mailString[i].Trim());
                        myAddressList.Add(myMailAdree);
                    }
 
                }
            }

            return myAddressList;
        }
        #endregion

        #region 发送邮件
        /// <summary>
        /// 发送邮件
        /// </summary>
        public void SendMail()
        {
            SmtpClient smtpClient = null;  //设置SMTP协议
            List<MailAddress> myAdressList = new List<MailAddress>();
            MailAddress mailAddressFrom = null; //设置发信人地址  当然还需要密码
            MailMessage mailMessageMail = new MailMessage();

            //检测附件大小 发件必需小于10M 否则返回  不会执行以下代码
            if (_attachmentPathList!=null && _hasAttachment && _attachmentMaxSize > 0)
            {
                for (int i = 0; i < _attachmentPathList.Count; i++)
                {
                    string attachmentPath = _attachmentPathList[i].ToString().Trim();
                    if (!ValidateAttachmentSize(attachmentPath, _attachmentMaxSize))
                    {
                        throw new Exception("附件" + attachmentPath + "超出了预设的文件大小,无法发送");
                    }

                }

            }

            if (string.IsNullOrEmpty(_smtpServer.Trim()))
            {
                throw new Exception("SMTP服务器地址为空");
            }

            if (_port.Equals(decimal.Zero))
            {
                throw new Exception("SMTP服务器端口号为空");
            }

            if (string.IsNullOrEmpty(_mailFrom.Trim()))
            {
                throw new Exception("发件人信息为空");
            }
            if (string.IsNullOrEmpty(_mailTo.Trim()))
            {
                throw new Exception("收件人列表为空");
            }

            //实例化发件人地址

            myAdressList = this.ConvertToMailAdress(_mailFrom);
            if (myAdressList.Count > 1)
            {
                throw new Exception("发件人地址:" + _mailFrom + "有多个邮件地址");
            }
            else
            {
                mailAddressFrom = myAdressList[0];
            }

            //添加收件人邮箱地址
            myAdressList = this.ConvertToMailAdress(_mailTo.Trim());
            foreach (MailAddress myAddressTo in myAdressList)
            {
                mailMessageMail.To.Add(myAddressTo);
            }
            //添加抄送人邮件地址
            if (!string.IsNullOrEmpty(_mailCc))
            {
                myAdressList = this.ConvertToMailAdress(_mailCc.Trim());
                foreach (MailAddress myAddressCc in myAdressList)
                {
                    mailMessageMail.CC.Add(myAddressCc);
                }

            }

            //添加密送人邮件地址
            if (!string.IsNullOrEmpty(_mailBcc))
            {
                myAdressList = this.ConvertToMailAdress(_mailBcc.Trim());
                foreach (MailAddress myAddressBcc in myAdressList)
                {
                    mailMessageMail.Bcc.Add(myAddressBcc);
                }
            }
            //发件人邮箱
            mailMessageMail.From = mailAddressFrom;
            //邮件主题
            mailMessageMail.Subject = _mailSubject;
            mailMessageMail.SubjectEncoding = System.Text.Encoding.UTF8;
            //邮件正文
            mailMessageMail.Body = _mailBody;
            mailMessageMail.BodyEncoding = System.Text.Encoding.UTF8;
            mailMessageMail.IsBodyHtml = true;
            //清空历史附件  以防附件重复发送
            if (mailMessageMail.Attachments != null)
            {
                mailMessageMail.Attachments.Clear();
            }
            //如果附件列表不为空,则添加附件
            if (_attachmentPathList != null)
            {
                foreach (object attachmentPath in _attachmentPathList)
                {
                    mailMessageMail.Attachments.Add(new Attachment(attachmentPath.ToString().Trim(), MediaTypeNames.Application.Octet));
                }
            }

          
            try
            {

                //初始化Smtp服务器信息
                smtpClient = new SmtpClient();
                smtpClient.Host = _smtpServer;//指定SMTP服务名  例如QQ邮箱为 smtp.qq.com 新浪cn邮箱为 smtp.sina.cn等
                smtpClient.Port = _port; //指定端口号
                smtpClient.Timeout = _timeout;  //超时时间
                              
                //验证发件邮箱地址和密码
                //创建服务器认证
                NetworkCredential NetworkCredential_my = new NetworkCredential(mailMessageMail.From.Address, _password);
                //指定发件人信息  包括邮箱地址和邮箱密码
                smtpClient.Credentials = new NetworkCredential(mailMessageMail.From.Address, _password);
                smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
         
            }
            catch (Exception Ex)
            {
                throw new Exception("邮件发送失败,请确定发件邮箱地址和密码的正确性!" + "\n" + "技术信息:\n" + Ex.Message);
            }
            //发送邮件
            smtpClient.Send(mailMessageMail);

            }
        #endregion 

        /// <summary>
        /// 初始化
        /// </summary>
        protected void Initialization()
        {
            string smtpServer = ConfigurationManager.AppSettings["SMTPServer"].ToString().Trim();
            string port = ConfigurationManager.AppSettings["Port"] == "" ? "25" : ConfigurationManager.AppSettings["Port"].ToString().Trim();
            string mailFrom = ConfigurationManager.AppSettings["MailFrom"].ToString().Trim();
            string mailFromName = ConfigurationManager.AppSettings["MailFromName"].ToString().Trim();
            string password = ConfigurationManager.AppSettings["Password"].ToString().Trim();
            string timeout = ConfigurationManager.AppSettings["MailTimeout"].ToString().Trim();

            if (string.IsNullOrEmpty(smtpServer))
            {
                throw new Exception("邮件信息初始化失败,SMTPServer信息在配置文件App.config未配置");
            }

            if (string.IsNullOrEmpty(mailFrom))
            {
                throw new Exception("邮件信息初始化失败,MailFrom信息在配置文件App.config未配置");
            }

            if (string.IsNullOrEmpty(timeout))
            {
                throw new Exception("邮件信息初始化失败,MailTimeout信息在配置文件App.config未配置");
            }

            if (!string.IsNullOrEmpty(mailFromName))
            {
                mailFrom = mailFromName + "<" + mailFrom + ">";
            }

            this._smtpServer= smtpServer;
            this._port =string.IsNullOrEmpty(port)?0: int.Parse(port);
            this._mailFrom = mailFrom;
            this._password = password;
            this._timeout = string.IsNullOrEmpty(timeout) ? 0 : int.Parse(timeout);


        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值