zoukankan      html  css  js  c++  java
  • Email 发送

    namespace 99999
    {
        /// <summary>
        /// Common interfaces to connect mail server to process e-mail.
        /// </summary>
        public static class MailClient
        {
            /// <summary>
            /// Process mail queue in database. Call by web service just for schedule process.
            /// </summary>
            /// <param name="processId"></param>
            public static void ProcessQueue( string processId )
            {
                try
                {
                    //Lock and fetch all mail items in queue.
                    StringBuilder sqlText = new StringBuilder()
                    .AppendFormat("UPDATE dbmail_send_task SET MailFrom = '{0}' WHERE Status=0 AND MailFrom IS NULL ", processId)
                    .AppendFormat("SELECT * FROM dbmail_send_task WHERE Status=0 AND MailFrom ='{0}'", processId);
    
                    System.Diagnostics.Debug.WriteLine(sqlText.ToString());
    
                    DataTable dt = Database.SqlHelper.RunQuery(sqlText.ToString());
    
                    string mailServer = AppSettings.MailServer;
                    if (string.IsNullOrEmpty(mailServer))
                    {
                        return;
                    }
                                   
                    foreach (DataRow dr in dt.Rows)
                    {
                        int taskId = Convert.ToInt32(dr["TaskID"]);
    
                        System.Diagnostics.Debug.WriteLine(string.Format("Send item:{0}", taskId));
    
                        try
                        {
                            //Send mail item using smtp.
                            System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();                        
                            mail.Subject = Convert.ToString(dr["Title"]);
                            mail.Body = Convert.ToString(dr["Body"]);
    
                            //using reply to instead of mail from because of no mail from fields on UI.
                            string replyTo = Convert.ToString(dr["ReplyTo"]);
                            if (!string.IsNullOrEmpty(replyTo))
                            {
                                mail.Sender = new System.Net.Mail.MailAddress(replyTo);
                                mail.From = new System.Net.Mail.MailAddress(replyTo);                           
                            }
                            else
                            {
                                mail.Sender = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
                                mail.From = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
                            }
    
                            string mailTo = Convert.ToString(dr["MailTo"]);
                            foreach(string sTemp in mailTo.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.To.Add(sTemp);
                                }
                            }
    
                            string mailCc = Convert.ToString(dr["MailCc"]);
                            foreach (string sTemp in mailCc.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.CC.Add(sTemp);
                                }
                            }
    
                            string mailBcc = Convert.ToString(dr["MailBcc"]);
                            foreach (string sTemp in mailBcc.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.Bcc.Add(sTemp);
                                }
                            }
    
                            string attachment = Convert.ToString(dr["Attachments"]);
                            foreach (string sTemp in attachment.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.Attachments.Add(new System.Net.Mail.Attachment(sTemp));
                                }
                            }
    
                            mail.IsBodyHtml = true;
                            mail.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnFailure;
    
                            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(mailServer);
                            smtp.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(smtp_SendCompleted); 
                            smtp.SendAsync(mail, taskId);
                        }
                        catch (Exception ex)
                        {
                            Logging.LogWriter.Write(ex);
                            
                            string sqlText1 = string.Format("UPDATE dbmail_send_task SET [Status]=-1, Remark=N'{0}', SendTime=GETDATE(), MailFrom='ERROR' WHERE TaskID={1} ",ex.Message,taskId);
                            System.Diagnostics.Debug.WriteLine(sqlText1.ToString());
                            Database.SqlHelper.RunCommand(sqlText1);
                        }
                    }
                }
                catch (Exception ex)
                { 
                    Logging.LogWriter.Write(ex);
                }
            }
    
            /// <summary>
            /// Process failed mail queue in database. Call by web service just for schedule process.
            /// </summary>
            /// <param name="processId"></param>
            public static void ResendFailedMails(string processId)
            {
                try
                {
                    //Lock and fetch all mail items in queue.
                    StringBuilder sqlText = new StringBuilder()
                    .AppendFormat("UPDATE dbmail_send_task SET MailFrom = '{0}' WHERE Status=-1 AND MailFrom<>'{0}' AND MailFrom<>'ERROR' ", processId)
                    .AppendFormat("SELECT * FROM dbmail_send_task WHERE Status=-1 AND MailFrom='{0}' AND MailFrom<>'ERROR' ", processId);
    
                    System.Diagnostics.Debug.WriteLine(sqlText.ToString());
    
                    DataTable dt = Database.SqlHelper.RunQuery(sqlText.ToString());
    
                    string mailServer = AppSettings.MailServer;
                    if (string.IsNullOrEmpty(mailServer))
                    {
                        return;
                    }
                    
                    foreach (DataRow dr in dt.Rows)
                    {
                        int taskId = Convert.ToInt32(dr["TaskID"]);
    
                        System.Diagnostics.Debug.WriteLine(string.Format("Resend item:{0}",taskId));
    
                        try
                        {
                            //Send mail item using smtp.
                            System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
                            mail.Subject = Convert.ToString(dr["Title"]);
                            mail.Body = Convert.ToString(dr["Body"]);
    
                            //using reply to instead of mail from because of no mail from fields on UI.
                            string replyTo = Convert.ToString(dr["ReplyTo"]);
                            if (!string.IsNullOrEmpty(replyTo))
                            {
                                mail.Sender = new System.Net.Mail.MailAddress(replyTo);
                                mail.From = new System.Net.Mail.MailAddress(replyTo);                            
                            }
                            else
                            {
                                mail.Sender = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
                                mail.From = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
                            }
    
                            string mailTo = Convert.ToString(dr["MailTo"]);
                            foreach (string sTemp in mailTo.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.To.Add(sTemp);
                                }
                            }
    
                            string mailCc = Convert.ToString(dr["MailCc"]);
                            foreach (string sTemp in mailCc.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.CC.Add(sTemp);
                                }
                            }
    
                            string mailBcc = Convert.ToString(dr["MailBcc"]);
                            foreach (string sTemp in mailBcc.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.Bcc.Add(sTemp);
                                }
                            }
    
                            string attachment = Convert.ToString(dr["Attachments"]);
                            foreach (string sTemp in attachment.Split(';'))
                            {
                                if (!string.IsNullOrEmpty(sTemp))
                                {
                                    mail.Attachments.Add(new System.Net.Mail.Attachment(sTemp));
                                }
                            }
    
                            mail.IsBodyHtml = true;
                            mail.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnFailure;
    
                            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(mailServer);
                            smtp.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(smtp_SendCompleted);
                            smtp.SendAsync(mail, taskId);
                        }
                        catch (Exception ex)
                        {
                            Logging.LogWriter.Write(ex);
    
                            string sqlText1 = string.Format("UPDATE dbmail_send_task SET [Status]=-1, Remark=N'{0}', MailFrom='ERROR', SendTime=GETDATE(), MailFrom='ERROR' WHERE TaskID={1} ", ex.Message, taskId);
                            System.Diagnostics.Debug.WriteLine(sqlText1.ToString());
                            Database.SqlHelper.RunCommand(sqlText1);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logging.LogWriter.Write(ex);
                }
            }
    
    
            static void smtp_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
            {
                try
                {
                    int taskId = Convert.ToInt32(e.UserState);
                    if (e.Error != null)
                    {
                        string sqlText = string.Format("UPDATE dbmail_send_task SET [Status]=-1, Remark=N'{0}',SendTime=GETDATE(), MailFrom='ERROR' WHERE TaskID={1} ", e.Error.Message, taskId);
                        System.Diagnostics.Debug.WriteLine(sqlText.ToString());
                        Database.SqlHelper.RunCommand(sqlText);
                    }
                    else
                    {
                        string sqlText = string.Format("UPDATE dbmail_send_task SET [Status]=1, SendTime=GETDATE(), Remark=NULL WHERE TaskID={0} ", taskId);
                        System.Diagnostics.Debug.WriteLine(sqlText.ToString());
                        Database.SqlHelper.RunCommand(sqlText);
                    }
                }
                catch (Exception ex)
                {
                    Logging.LogWriter.Write(ex);
                }
            }
    
            /// <summary>
            /// Send out a mail, write log file but no warning returned if any exception 
            /// </summary>
            /// <param name="mailAddress">Include To, CC, BCC mail address</param>
            /// <param name="mailContent"></param>
            /// <returns></returns>
            public static bool SendMessage(MailAddress mailAddress, MailEntity mailContent)
            {
                string profile = Configuration.AppSettings.MailUserDeliveryProfile;
                if (string.IsNullOrEmpty(profile))
                {
                    throw new ArgumentNullException("MailUserDeliveryProfile", "Value of configuration item is required.");
                }
    
                if (string.IsNullOrEmpty(mailAddress.To))
                {
                    throw new ArgumentNullException("MailAddress.To", "Value of MailTo is required.");
                }
    
                string sqlText = "sp_HtmlMail_Send @profile=@P0,@mailto=@P1,@mailcc=@P2,@mailbcc=@P3,@replyto=@P4,@title=@P5,@body=@P6,@attachments=@P7,@UserAccountID=@P8,@Remark=@P9";
    
                IDataParameter P0 = new SqlParameter("@P0", SqlDbType.VarChar);
                P0.Value = profile;
                IDataParameter P1 = new SqlParameter("@P1", SqlDbType.VarChar);
                P1.Value = mailAddress.To;
                IDataParameter P2 = new SqlParameter("@P2", SqlDbType.VarChar);
                P2.Value = mailAddress.Cc;
                IDataParameter P3 = new SqlParameter("@P3", SqlDbType.VarChar);
                P3.Value = mailAddress.Bcc;
                IDataParameter P4 = new SqlParameter("@P4", SqlDbType.VarChar);
                P4.Value = mailAddress.ReplyTo;
                IDataParameter P5 = new SqlParameter("@P5", SqlDbType.NVarChar);
                P5.Value = mailContent.Subject;            
                IDataParameter P6 = new SqlParameter("@P6", SqlDbType.NVarChar);           
                P6.Value = CleanHtml(mailContent.Body);
                IDataParameter P7 = new SqlParameter("@P7", SqlDbType.NVarChar);
                P7.Value = mailContent.Attachments;
                IDataParameter P8 = new SqlParameter("@P8", SqlDbType.Int);
                if (mailAddress.SendBy > 0)
                {
                    P8.Value = mailAddress.SendBy;
                }
                else
                {
                    P8.Value = Security.UserAuthentication.GetCurrentOperator();
                }
                IDataParameter P9 = new SqlParameter("@P9", SqlDbType.NVarChar);
                P9.Value = mailContent.Remark;
    
                int result = Database.SqlHelper.RunCommand(sqlText, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9);
                if (result > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
    
            }
    
    
            /// <summary>
            /// Clean up html text
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            private static string CleanHtml(string input)
            {
                string output = string.Empty;
                output = input.Replace(@"
    ", "<br>");
                return output;
            }
    
            ///// <summary>
            ///// Encode input string to Unicode
            ///// </summary>
            ///// <param name="input"></param>
            ///// <returns></returns>
            //private static string UTF8Str(string input)
            //{
            //    byte[] bs = System.Text.Encoding.Default.GetBytes(input);
            //    string output = System.Text.Encoding.GetEncoding("UTF-8").GetString(bs);
            //    return output;
            //}
    
            //private static string ANSIStr(string input)
            //{
            //    byte[] bs = System.Text.Encoding.Default.GetBytes(input);
            //    string output = System.Text.Encoding.ASCII.GetString(bs);
            //    return output;
            //}
    
            ///// <summary>
            ///// Convert ununicode string to unicode string.
            ///// </summary>
            ///// <param name="str"></param>
            ///// <returns></returns>
            //private static string ConvertToUnicodeString(string str)
            //{
            //    StringBuilder outStr = new StringBuilder();
            //    if (!string.IsNullOrEmpty(str))
            //    {
    
            //        for (int i = 0; i < str.Length; i++)
            //        {
            //            if (str[i] > 0xff)
            //            {
            //                outStr.AppendFormat("&#{0}", ((int)str[i]).ToString());
            //            }
            //            else
            //            {
            //                outStr.Append(str[i]);
            //            }
            //        }
            //    }
            //    return outStr.ToString();
            //}
    
    
        }
    
    
    
    
        #region Mail Entity
    
        /// <summary>
        /// Build mail entity, include subject,body, attachments and options. 
        /// </summary>
        public class MailEntity
        {
            /// <summary>
            /// Build a mail entity with template id, you may use -1 if no template id.
            /// </summary>
            /// <param name="templateId">template id, you may use -1 if no template id.</param>
            public MailEntity(int templateId)
            {
                if (templateId == -1)
                {
                    return;
                }
                else
                {
                    //Load mail template from database according to special template id
                    string sqlText = string.Format("select * from tb_MailTemplate where ID={0}", templateId);
                    DataTable dt = Database.SqlHelper.RunQuery(sqlText);
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        object o = dt.Rows[0]["Content"];
                        if (o != null)
                        {
                            _body = o.ToString();
                        }
    
                        object title = dt.Rows[0]["Title"];
    
                        if (title != null)
                        {
                            _subject = title.ToString();
                        }
                    }
                }
            }
    
            private string _subject = "";
    
            /// <summary>
            /// Mail title
            /// </summary>
            public string Subject
            {
                get { return _subject; }
                set { _subject = value; }
            }
    
            private string _body = "";
    
            /// <summary>
            /// Mail body, html string
            /// </summary>
            public string Body
            {
                get { return _body; }
                set { _body = value; }
            }
    
            private string _attachments = "";
    
            /// <summary>
            /// Mail attachments, split by "|" if multiple files
            /// </summary>
            public string Attachments
            {
                get { return _attachments; }
            }
    
            private string _attachmentFilePath = "";
    
            public string AttachmentFilePath
            {
                get { return _attachmentFilePath; }
            }
    
            private string _remark = "";
    
            /// <summary>
            /// Remark
            /// </summary>
            public string Remark
            {
                get { return _remark; }
                set { _remark = value; }
            }
    
    
            /// <summary>
            /// Merge field into template
            /// </summary>
            /// <param name="fieldName"></param>
            /// <param name="fieldValue"></param>
            public void MergeField(string fieldName, string fieldValue)
            {
                if (!string.IsNullOrEmpty(_body))
                {
                    _body = _body.Replace(fieldName, fieldValue);
                    _subject = _subject.Replace(fieldName, fieldValue);
                }
    
            }
    
            /// <summary>
            /// Add file as attachment
            /// </summary>
            /// <param name="fileName"></param>
            public void AttachFile(string fileName)
            {
                if (string.IsNullOrEmpty(_attachments))
                {
                    _attachments = fileName;
                }
                else
                {
                    _attachments += "|" + fileName;
                }
            }
    
        }
    
        #endregion
    
    
        #region Mail Address
    
        /// <summary>
        /// Build mail address entity, include To, Cc, Bcc 
        /// </summary>
        [Serializable]
        public class MailAddress
        {
            private string _to = "";
    
            /// <summary>
            /// Address of mail to
            /// </summary>
            public string To
            {
                get { return _to.TrimStart(';'); }
            }
    
            private string _cc = "";
    
            /// <summary>
            /// Address of mail cc
            /// </summary>
            public string Cc
            {
                get { return _cc.TrimStart(';'); }
                set { _cc = value; }
            }
    
            private string _bcc = "";
    
            /// <summary>
            /// Address of mail bcc
            /// </summary>
            public string Bcc
            {
                get { return _bcc.TrimStart(';'); }
            }
    
            private string _replyTo = "";
    
            /// <summary>
            /// Address of mail receiver reply to
            /// </summary>
            public string ReplyTo
            {
                get { return _replyTo; }
                set { _replyTo = value; }
            }
    
            private int _sendBy = 0;
    
            /// <summary>
            /// Address of mail send by
            /// </summary>
            public int SendBy
            {
                get { return _sendBy; }
                set { _sendBy = value; }
            }
    
            /// <summary>
            /// Address of mail sender
            /// </summary>
            public string From
            {
                get { return Configuration.AppSettings.MailDeliveryFrom; }
            }
    
    
            /// <summary>
            /// Add new address to recipients, copy recipients or blind recipients
            /// </summary>
            /// <param name="address"></param>
            /// <param name="addressType"></param>
            public void Add(string address, MailAddressType addressType)
            {
                switch (addressType)
                {
                    case MailAddressType.To:
                        {
                            _to = _to + ";" + address;
                            break;
                        }
                    case MailAddressType.Cc:
                        {
                            _cc = _cc + ";" + address;
                            break;
                        }
                    case MailAddressType.Bcc:
                        {
                            _bcc = _bcc + ";" + address;
                            break;
                        }
                    default: break;
                }
            }
    
            /// <summary>
            /// Add new address to recipients, copy recipients or blind recipients
            /// </summary>
            /// <param name="address"></param>
            /// <param name="addressType"></param>
            public void Add(string toAddress, string ccAddress, string bccAddress)
            {
                if (!string.IsNullOrEmpty(toAddress))
                {
                    _to = _to + ";" + toAddress;
                }
    
                if (!string.IsNullOrEmpty(ccAddress))
                {
                    _cc = _cc + ";" + ccAddress;
                }
    
                if (!string.IsNullOrEmpty(bccAddress))
                {
                    _bcc = _bcc + ";" + bccAddress;
                }
            }
        }
    
        #endregion
    
        #region Mail Address Type
    
        /// <summary>
        /// Mail address type, include To, Cc, Bcc
        /// </summary>
        public enum MailAddressType
        {
            To,
            Cc,
            Bcc
        }
    
    
        #endregion
    
    }
  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/muxueyuan/p/6625558.html
Copyright © 2011-2022 走看看