using Model;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Net.Mail;
using System.IO;
using System.Text;

namespace BLL.Common
{
    public class MailHelper
    {
        /// <summary>
        /// 私有构造方法,不允许创建实例
        /// </summary>
        private MailHelper()
        {
            // TODO: Add constructor logic here
        }

        /// <summary>
        /// SendNetMail(须配置SMTP服务器地址)(多个收件人、抄送人、附件其参数用";"隔开,最后一个不能有";")
        /// </summary>
        /// <param name="mailFrom">发件人</param>
        /// <param name="mailTo">收件人(多个收件人用";"隔开,最后一个不能有";")</param>
        /// <param name="mailSubject">主题</param>
        /// <param name="mailBody">内容</param>
        /// <param name="mailAttch">附件(多个附件用";"隔开,最后一个不能有";")</param>
        /// <param name="mailCode">密码(对加密过的)</param>
        /// <param name="mailPriority">优先级</param>
        /// <param name="mailCC">抄送(多个抄送人用";"隔开,最后一个不能有";")</param>
        /// <param name="resultMessage">输出信息</param>
        public static bool SendNetMail1(EmailPop ps, string mailFrom, string[] mailTo, string mailSubject, string mailBody, string mailAttch, string mailCode, string mailPriority, string[] mailCC, List<EmailUser> emailUser, out string resultMessage)
        {
            var englishmonth = DateTime.Now.ToString("MMMM", CultureInfo.CreateSpecificCulture("en-GB"));
            bool result = true;
            //初始化输出参数
            resultMessage = string.Empty;
            List<Model.SendEmail> sendList = new List<Model.SendEmail>();
            //发件人和收件人不为空
            if (string.IsNullOrEmpty(ps.EmailYx) || mailTo == null)
            {
                resultMessage = "Please Fill Email Addresser Or Addressee!";
                return false;
            }
            if (mailTo == null || mailTo.Length == 0)
            {
                resultMessage = "The recipient is empty!";
                return false;
            }
            if (!string.IsNullOrEmpty(ps.EmailYx)) mailFrom = ps.EmailYx;

            MailMessage email = new MailMessage();
            //发件人地址
            email.From = new MailAddress(mailFrom, ps.EmailYx);

            //收件人 
            if (mailTo != null && mailTo.Length > 0)
            {
                foreach (string send in mailTo)
                {
                    if (!String.IsNullOrEmpty(send))
                    {
                        email.To.Add(send);
                    }
                }
            }

            //加抄送
            if (mailCC != null && mailCC.Length > 0)
            {

                foreach (string cc in mailCC)
                {
                    if (!String.IsNullOrEmpty(cc))
                    {
                        //email.To.Add(cc);
                        email.CC.Add(cc);
                    }
                }
            }

            //email.To.Add(send);
            //主题
            email.Subject = mailSubject;
            //附件
            if (!string.IsNullOrEmpty(mailAttch))
            {
                string[] attachments = mailAttch.Split(';');
                foreach (string file in attachments)
                {
                    Attachment attach = new Attachment(file, System.Net.Mime.MediaTypeNames.Application.Octet);
                    //为附件添加发送时间
                    System.Net.Mime.ContentDisposition disposition = attach.ContentDisposition;
                    disposition.CreationDate = System.IO.File.GetCreationTime(file);
                    disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
                    disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
                    //添加附件
                    email.Attachments.Add(attach);
                }
            }
            //优先级
            email.Priority = (mailPriority == "High") ? System.Net.Mail.MailPriority.High : System.Net.Mail.MailPriority.Normal;
            //内容编码、格式
            email.BodyEncoding = Encoding.UTF8;
            email.IsBodyHtml = true;
            //SMTP服务器
            SmtpClient client = new SmtpClient(ps.EmailFwq);
            client.UseDefaultCredentials = true;
            //验证(Credentials 凭证)
            client.Credentials = new System.Net.NetworkCredential(mailFrom, ps.EmailPass);
            //处理待发的电子邮件的方法 (Delivery 发送,传输)
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;

            if (!string.IsNullOrEmpty(mailCode))
            {
                string[] parm = mailCode.Split('|');
                //内容
                email.Body = mailBody.Replace("{FO No}", parm[0]).Replace("{Discipline}", parm[1]).Replace("{Contractor}", parm[2]).Replace("{Buyer}", parm[3]).Replace("{Contract Administrator}", parm[4]).Replace("{Main Coordinator}", parm[5]).Replace("{User Representative}", parm[6]).Replace("{Expire Date}", parm[7]);
            }
            else
            {
                email.Body = mailBody;
            }
            //循环发送邮件
            try
            {
                //发送邮件
                client.Send(email);
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = mailSubject;
                            if (string.IsNullOrEmpty(mailCode))
                            {
                                newSendEmail.EmailContent = ReplaceHtmlTag(mailBody);
                            }
                            else
                            {
                                string[] parm = mailCode.Split('|');
                                newSendEmail.EmailContent = ReplaceHtmlTag(mailBody).Replace("{FO No}", parm[0]).Replace("{Discipline}", parm[1]).Replace("{Contractor}", parm[2]).Replace("{Buyer}", parm[3]).Replace("{Contract Administrator}", parm[4]).Replace("{Main Coordinator}", parm[5]).Replace("{User Representative}", parm[6]).Replace("{Expire Date}", parm[7]);
                            }
                           
                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送成功";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result= true;
                }
            }
            catch (Exception ex)
            {
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = mailSubject;
                            if (string.IsNullOrEmpty(mailCode))
                            {
                                newSendEmail.EmailContent = ReplaceHtmlTag(mailBody);
                            }
                            else
                            {
                                string[] parm = mailCode.Split('|');
                                newSendEmail.EmailContent = ReplaceHtmlTag(mailBody).Replace("{FO No}", parm[0]).Replace("{Discipline}", parm[1]).Replace("{Contractor}", parm[2]).Replace("{Buyer}", parm[3]).Replace("{Contract Administrator}", parm[4]).Replace("{Main Coordinator}", parm[5]).Replace("{User Representative}", parm[6]).Replace("{Expire Date}", parm[7]);
                            }
                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送失败";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                            resultMessage = ex.Message;
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result= false;
                }
            }
            finally
            {
                if (email.Attachments.Count > 0)
                {
                    //及时释放占用的资源  
                    email.Attachments.Clear();
                    email.Attachments.Dispose();
                }
            }

            return result;
        }



        /// <summary>
        /// SendNetMail(须配置SMTP服务器地址)(多个收件人、抄送人、附件其参数用";"隔开,最后一个不能有";")
        /// </summary>
        /// <param name="mailFrom">发件人</param>
        /// <param name="mailTo">收件人(多个收件人用";"隔开,最后一个不能有";")</param>
        /// <param name="mailSubject">主题</param>
        /// <param name="mailBody">内容</param>
        /// <param name="mailAttch">附件(多个附件用";"隔开,最后一个不能有";")</param>
        /// <param name="mailCode">密码(对加密过的)</param>
        /// <param name="mailPriority">优先级</param>
        /// <param name="mailCC">抄送(多个抄送人用";"隔开,最后一个不能有";")</param>
        /// <param name="sendNum">发送次数</param>
        /// <param name="resultMessage">输出信息</param>
        public static bool SendNetMail2(EmailPop ps, string mailFrom, string[] mailTo, string mailSubject, string mailBody,  string mailPriority, string[] mailCC,  string sendNum, out string resultMessage)
        {
            var englishmonth = DateTime.Now.ToString("MMMM", CultureInfo.CreateSpecificCulture("en-GB"));
            bool result = true;
            //初始化输出参数
            resultMessage = string.Empty;
            List<Model.SendEmail> sendList = new List<Model.SendEmail>();
            //发件人和收件人不为空
            if (string.IsNullOrEmpty(ps.EmailYx) || mailTo == null)
            {
                resultMessage = "Please Fill Email Addresser Or Addressee!";
                return false;
            }
            if (mailTo == null || mailTo.Length == 0)
            {
                resultMessage = "The recipient is empty!";
                return false;
            }
            if (!string.IsNullOrEmpty(ps.EmailYx)) mailFrom = ps.EmailYx;

            MailMessage email = new MailMessage();
            //发件人地址
            email.From = new MailAddress(mailFrom, ps.EmailYx);

            //收件人 
            if (mailTo != null && mailTo.Length > 0)
            {
                foreach (string send in mailTo)
                {
                    if (!String.IsNullOrEmpty(send))
                    {
                        email.To.Add(send);
                    }
                }
            }

            //加抄送
            if (mailCC != null && mailCC.Length > 0)
            {

                foreach (string cc in mailCC)
                {
                    if (!String.IsNullOrEmpty(cc))
                    {
                        //email.To.Add(cc);
                        email.CC.Add(cc);
                    }
                }
            }

            //email.To.Add(send);
            //主题
            email.Subject = mailSubject;
            //附件
            
            //优先级
            email.Priority = (mailPriority == "High") ? System.Net.Mail.MailPriority.High : System.Net.Mail.MailPriority.Normal;
            //内容编码、格式
            email.BodyEncoding = Encoding.UTF8;
            email.IsBodyHtml = true;
            //SMTP服务器
            SmtpClient client = new SmtpClient(ps.EmailFwq);
            client.UseDefaultCredentials = true;
            //验证(Credentials 凭证)
            client.Credentials = new System.Net.NetworkCredential(mailFrom, ps.EmailPass);
            //处理待发的电子邮件的方法 (Delivery 发送,传输)
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;

            email.Body = mailBody;
            //循环发送邮件
            try
            {
                //发送邮件
                client.Send(email);
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = mailSubject + sendNum;
                            newSendEmail.EmailContent = ReplaceHtmlTag(mailBody) + sendNum;

                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送成功";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result = true;
                }
            }
            catch (Exception ex)
            {
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = mailSubject + sendNum;
                            newSendEmail.EmailContent = ReplaceHtmlTag(mailBody);
                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送失败";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                            resultMessage = ex.Message;
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result = false;
                }
            }
            finally
            {
                if (email.Attachments.Count > 0)
                {
                    //及时释放占用的资源  
                    email.Attachments.Clear();
                    email.Attachments.Dispose();
                }
            }

            return result;
        }

        /// <summary>
        ///  SendNetMail(须配置SMTP服务器地址)(多个收件人、抄送人、附件其参数用";"隔开,最后一个不能有";")
        /// </summary>
        /// <param name="ps">配置SMTP的服务器</param>
        /// <param name="myPram">参数</param>
        /// <param name="title"></param>
        /// <param name="mailTo">收件人(多个收件人用";"隔开,最后一个不能有";")</param>
        /// <param name="mailCC">抄送(多个抄送人用";"隔开,最后一个不能有";")</param>
        /// <param name="resultMessage"></param>
        /// <returns></returns>
        public static bool SendPunishSesMail(EmailPop ps, NameValueCollection myPram, string title, string[] mailTo, string[] mailCC, out string resultMessage)
        {
            var emailTemplate = Funs.DB.SendEmailTemplate.Where(x => x.EmailName.Contains(title));
            bool result = true;
            //初始化输出参数
            resultMessage = string.Empty;
            List<Model.SendEmail> sendList = new List<Model.SendEmail>();
            //发件人和收件人不为空
            if (string.IsNullOrEmpty(ps.EmailYx) || mailTo == null)
            {
                resultMessage = "Please Fill Email Addresser Or Addressee!";
                return false;
            }
            if (mailTo == null || mailTo.Length == 0)
            {
                resultMessage = "The recipient is empty!";
                return false;
            }

            string mailFrom = string.Empty;
            if (!string.IsNullOrEmpty(ps.EmailYx)) mailFrom = ps.EmailYx;

            MailMessage email = new MailMessage();
            //发件人地址
            email.From = new MailAddress(mailFrom, ps.EmailYx);

            //收件人 
            if (mailTo != null && mailTo.Length > 0)
            {
                foreach (string send in mailTo)
                {
                    if (!String.IsNullOrEmpty(send))
                    {
                        email.To.Add(send);
                    }
                }
            }

            //email.To.Add("408299694@qq.com");

            //加抄送
            if (mailCC != null && mailCC.Length > 0)
            {

                foreach (string cc in mailCC)
                {
                    if (!String.IsNullOrEmpty(cc))
                    {
                        //email.To.Add(cc);
                        email.CC.Add(cc);
                    }
                }
            }

            //优先级
            email.Priority = System.Net.Mail.MailPriority.Normal;
            //内容编码、格式
            email.BodyEncoding = Encoding.UTF8;
            email.IsBodyHtml = true;
            //SMTP服务器
            SmtpClient client = new SmtpClient(ps.EmailFwq);
            client.UseDefaultCredentials = true;
            //验证(Credentials 凭证)
            client.Credentials = new System.Net.NetworkCredential(mailFrom, ps.EmailPass);
            //处理待发的电子邮件的方法 (Delivery 发送,传输)
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;

            //string[] parm = mailCode.Split('|');
             //内容
            string emailContext = emailTemplate.Select(x => x.EmailContext).FirstOrDefault();
            email.Body = FineUIPro.Web.common.TemplateHelper.BulidByFile2(emailContext, myPram);

            //主题 
            string mailSubject= emailTemplate.Select(x => x.EmailName).FirstOrDefault();
            email.Subject = FineUIPro.Web.common.TemplateHelper.BulidByFile2(mailSubject, myPram);
           
            
            //循环发送邮件
            try
            {
                //发送邮件
                client.Send(email);
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = email.Subject;
                            newSendEmail.EmailContent = email.Body;
                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送成功";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result = true;
                }
            }
            catch (Exception ex)
            {
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = email.Subject;
                            newSendEmail.EmailContent = email.Body;
                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送失败";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                            resultMessage = ex.Message;
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result = false;
                }
            }
            finally
            {
                if (email.Attachments.Count > 0)
                {
                    //及时释放占用的资源  
                    email.Attachments.Clear();
                    email.Attachments.Dispose();
                }
            }

            return result;
        }


        /// <summary>
        /// SendNetMail(须配置SMTP服务器地址)(多个收件人、抄送人、附件其参数用";"隔开,最后一个不能有";")
        /// </summary>
        /// <param name="mailFrom">发件人</param>
        /// <param name="mailTo">收件人(多个收件人用";"隔开,最后一个不能有";")</param>
        /// <param name="mailSubject">主题</param>
        /// <param name="mailBody">内容</param>
        /// <param name="mailAttch">附件(多个附件用";"隔开,最后一个不能有";")</param>
        /// <param name="mailCode">密码(对加密过的)</param>
        /// <param name="mailPriority">优先级</param>
        /// <param name="mailCC">抄送(多个抄送人用";"隔开,最后一个不能有";")</param>
        /// <param name="resultMessage">输出信息</param>
        public static bool SendPunishMail(EmailPop ps, string mailFrom, string[] mailTo, string mailSubject, string mailBody, string mailAttch, string mailCode, string mailPriority, string[] mailCC,List<View_EMC_Punishment> pList,  out string resultMessage)
        {
            bool result = true;
            //初始化输出参数
            resultMessage = string.Empty;
            List<Model.SendEmail> sendList = new List<Model.SendEmail>();
            //发件人和收件人不为空
            if (string.IsNullOrEmpty(ps.EmailYx) || mailTo == null)
            {
                resultMessage = "Please Fill Email Addresser Or Addressee!";
                return false;
            }
            if (mailTo == null || mailTo.Length == 0)
            {
                resultMessage = "The recipient is empty!";
                return false;
            }
            if (!string.IsNullOrEmpty(ps.EmailYx)) mailFrom = ps.EmailYx;

            MailMessage email = new MailMessage();
            //发件人地址
            email.From = new MailAddress(mailFrom, ps.EmailYx);

            //收件人 
            if (mailTo != null && mailTo.Length > 0)
            {
                foreach (string send in mailTo)
                {
                    if (!String.IsNullOrEmpty(send))
                    {
                        email.To.Add(send);
                    }
                }
            }

            //email.To.Add("408299694@qq.com");

            //加抄送
            if (mailCC != null && mailCC.Length > 0)
            {

                foreach (string cc in mailCC)
                {
                    if (!String.IsNullOrEmpty(cc))
                    {
                        //email.To.Add(cc);
                        email.CC.Add(cc);
                    }
                }
            }

            //附件
            if (!string.IsNullOrEmpty(mailAttch))
            {
                string[] attachments = mailAttch.Split(';');
                foreach (string file in attachments)
                {
                    Attachment attach = new Attachment(file, System.Net.Mime.MediaTypeNames.Application.Octet);
                    //Attachment attach = new Attachment(Directory.GetCurrentDirectory );
                    //email.Attachments.Add(newAttachment("Hydrangeas.jpg"));

                    //为附件添加发送时间
                    System.Net.Mime.ContentDisposition disposition = attach.ContentDisposition;
                    disposition.CreationDate = System.IO.File.GetCreationTime(file);
                    disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
                    disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
                    //添加附件
                    email.Attachments.Add(attach);
                }
            }
            //优先级
            email.Priority = (mailPriority == "High") ? System.Net.Mail.MailPriority.High : System.Net.Mail.MailPriority.Normal;
            //内容编码、格式
            email.BodyEncoding = Encoding.UTF8;
            email.IsBodyHtml = true;
            //SMTP服务器
            SmtpClient client = new SmtpClient(ps.EmailFwq);
            client.UseDefaultCredentials = true;
            //验证(Credentials 凭证)
            client.Credentials = new System.Net.NetworkCredential(mailFrom, ps.EmailPass);
            //处理待发的电子邮件的方法 (Delivery 发送,传输)
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;

            //string[] parm = mailCode.Split('|');
            string enDate = string.Empty;
            string pDate = string.Empty;
            string chDate = string.Empty;
            string punishList = string.Empty;
            if (mailBody != string.Empty)
            {
                DateTime date = Convert.ToDateTime(mailCode);
                enDate = date.ToString("MMMM.yyyy", System.Globalization.CultureInfo.CreateSpecificCulture("en-GB"));
                pDate = date.ToString("yyyy-MM");
                chDate = string.Format("{0:Y}", date);

                punishList = "<table border=1><tr><td> Date</td><td>Time</td><td>Contract No.</td><td>Contractor</td><td>Discipline</td><td>Location</td><td>Violation Description</td><td>Company(RMB)</td><td>Individual(RMB)</td><td>Backcharge(RMB)</td><td>Violation Degree</td><td>Contract Admin</td><td>Main Coordinator</td><td>M.C.Dept</td><td>User Representative</td><td>BYC RU</td><td>Violation Inspector</td><td>Inspection Department</td><td>Backcharge SES No.</td><td>Backcharge Completion Date</td> </tr> ";
                foreach (var p in pList)
                {
                    string company = p.Company.HasValue ? p.Company.Value.ToString("0.00") : "";
                    string individual= p.Individual.HasValue ? p.Individual.Value.ToString("0.00") : "";
                    punishList = punishList + "<tr><td>"+ p.PunishDate.Value.ToString("yyyy/MM/dd") + "</td><td>" + p.PunishTime + "</td><td>" + p.FO_NO + "</td><td>" + p.Contractor + "</td><td>" + p.Discipline + "</td><td>" + p.Location + "</td><td>" + p.Description + "</td><td>" + company + "</td><td>" + individual + "</td><td>" + p.Backcharge.Value.ToString("0.00") + "</td><td>" + p.ViolationDegree + "</td><td>" + p.Contract_Admin + "</td><td>" + p.Main_Coordinator + "</td><td>" + p.MCDept + "</td><td>" + p.User_Representative + "</td><td>" + p.BYCRU + "</td><td>" + p.Violation_Inspector_Name + "</td><td>" + p.InspectionDep + "</td><td>" + p.SES_No + "</td><td>" + p.CompletionDate + "</td></tr>";
                    //punishList = punishList + "<p> Date:" + p.PunishDate + ";Time:" + p.PunishTime + ";Contract No.:" + p.FO_NO + ";Contractor:" + p.Contractor + ";Discipline:" + p.Discipline + ";Location:" + p.Location + ";Violation Description:" + p.Description + ";Company(RMB):" + p.Company.ToString("0.00") + ";Individual(RMB):" + p.Individual.ToString("0.00") + ";Backcharge(RMB):" + p.Backcharge.Value.ToString("0.00") + ";Violation Degree:" + p.ViolationDegree + ";Contract Admin:" + p.Contract_Admin + ";Main Coordinator:" + p.Main_Coordinator + ";M.C.Dept:" + p.MCDept + ";User Representative:" + p.User_Representative + ";BYC RU:" + p.BYCRU + ";Violation Inspector:" + p.Violation_Inspector_Name + ";Inspection Department:" + p.InspectionDep + ";Backcharge SES No.:" + p.SES_No + ";Backcharge Completion Date:" + p.CompletionDate + "</p>";
                }

                punishList = punishList + "</table>";
            }
            //主题
            email.Subject = mailSubject.Replace("{PDate}", pDate);
            //内容
            email.Body = mailBody.Replace("{EnDate}", enDate).Replace("{ChDate}", chDate).Replace("{PunishList}", punishList);

            //循环发送邮件
            try
            {
                //发送邮件
                client.Send(email);
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = mailSubject.Replace("{PDate}", pDate);
                            newSendEmail.EmailContent = ReplaceHtmlTag(mailBody).Replace("{EnDate}", enDate).Replace("{ChDate}", chDate).Replace("{PunishList}", punishList);
                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送成功";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result = true;
                }
            }
            catch (Exception ex)
            {
                if (mailTo != null && mailTo.Length > 0)
                {
                    foreach (string send in mailTo)
                    {
                        if (!String.IsNullOrEmpty(send))
                        {
                            Model.SendEmail newSendEmail = new Model.SendEmail();
                            newSendEmail.EmailId = Guid.NewGuid().ToString();
                            newSendEmail.EmailTile = mailSubject.Replace("{PDate}", pDate);
                            newSendEmail.EmailContent = ReplaceHtmlTag(mailBody).Replace("{EnDate}", enDate).Replace("{ChDate}", chDate).Replace("{PunishList}", punishList);
                            newSendEmail.EmailURL = send;
                            newSendEmail.EmailName = send;
                            newSendEmail.EmailStatus = "发送失败";
                            newSendEmail.CreateTime = DateTime.Now;
                            newSendEmail.CreateName = "sys";
                            sendList.Add(newSendEmail);
                            resultMessage = ex.Message;
                        }
                    }
                    SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
                    result = false;
                }
            }
            finally
            {
                if (email.Attachments.Count > 0)
                {
                    //及时释放占用的资源  
                    email.Attachments.Clear();
                    email.Attachments.Dispose();
                }
            }

            return result;
        }

        /// <summary>
        /// SendNetMail(须配置SMTP服务器地址)(多个收件人、抄送人、附件其参数用";"隔开,最后一个不能有";")
        /// </summary>
        /// <param name="mailFrom">发件人</param>
        /// <param name="mailTo">收件人(多个收件人用";"隔开,最后一个不能有";")</param>
        /// <param name="mailSubject">主题</param>
        /// <param name="mailBody">内容</param>
        /// <param name="mailAttch">附件(多个附件用";"隔开,最后一个不能有";")</param>
        /// <param name="mailCode">密码(对加密过的)</param>
        /// <param name="mailPriority">优先级</param>
        /// <param name="mailCC">抄送(多个抄送人用";"隔开,最后一个不能有";")</param>
        /// <param name="resultMessage">输出信息</param>
        public static bool SendNetMail(EmailPop ps, string mailFrom, string[] mailTo, string mailSubject, string mailBody, string mailAttch, string mailCode, string mailPriority, string[] mailCC, List<EmailUser> emailUser, out string resultMessage)
        {
            var englishmonth = DateTime.Now.ToString("MMMM", CultureInfo.CreateSpecificCulture("en-GB"));
            bool result = true;
            //初始化输出参数
            resultMessage = string.Empty;
            List<Model.SendEmail> sendList = new List<Model.SendEmail>();
            //发件人和收件人不为空
            if (string.IsNullOrEmpty(ps.EmailYx) || mailTo == null)
            {
                resultMessage = "Please Fill Email Addresser Or Addressee!";
                return false;
            }
            if (mailTo == null || mailTo.Length == 0)
            {
                resultMessage = "The recipient is empty!";
                return false;
            }
            if (!string.IsNullOrEmpty(ps.EmailYx)) mailFrom = ps.EmailYx;

            MailMessage email;
            //SMTP服务器
            SmtpClient client = new SmtpClient(ps.EmailFwq);
            client.UseDefaultCredentials = true;
            //验证(Credentials 凭证)
            client.Credentials = new System.Net.NetworkCredential(mailFrom, ps.EmailPass);
            //处理待发的电子邮件的方法 (Delivery 发送,传输)
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;

            //循环发送邮件
            foreach (var send in mailTo)
            {
                email = new MailMessage();
                //加抄送
                if (mailCC != null && mailCC.Length > 0)
                {
                    // 经理邮箱
                    string leaderMail = string.Empty;
                    // 总监邮箱
                    string directorMail = string.Empty;
                    var user = from x in Funs.DB.Sys_User where x.Email == send select x;
                    var depart = (from x in Funs.DB.Base_Depart where x.DepartId == user.FirstOrDefault().DepartId select x).ToList();
                    if (depart.Count() > 0 && depart.FirstOrDefault().DepartLeader != null && depart.FirstOrDefault().DepartLeader != "")
                    {
                        var leader = from x in Funs.DB.Sys_User where x.UserId == depart.FirstOrDefault().DepartLeader select x;
                        leaderMail = leader.FirstOrDefault().Email;
                    }
                    var departCode = depart.Select(p => p.DepartCode.Substring(0, 3)).Distinct().ToArray();
                    var director = from x in Funs.DB.Sys_User
                                   join y in Funs.DB.Base_Depart on x.DepartId equals y.DepartId
                                   where x.RoleId == Const.Role_DirectorId 
                                        && departCode.Contains(y.DepartCode)
                                   select x;
                    if (director.Count() > 0 && director.FirstOrDefault().Email != null && director.FirstOrDefault().Email != "")
                    {
                        directorMail = director.FirstOrDefault().Email;
                    }

                    foreach (string cc in mailCC)
                    {
                        if (!string.IsNullOrEmpty(cc) && (cc == leaderMail || cc == directorMail))
                        {
                            email.CC.Add(cc);
                        }
                    }
                }
                //发件人地址
                email.From = new MailAddress(mailFrom, ps.EmailYx);
                //主题
                email.Subject = mailSubject;
                //附件
                if (!string.IsNullOrEmpty(mailAttch))
                {
                    string[] attachments = mailAttch.Split(';');
                    foreach (string file in attachments)
                    {
                        Attachment attach = new Attachment(file, System.Net.Mime.MediaTypeNames.Application.Octet);
                        //为附件添加发送时间
                        System.Net.Mime.ContentDisposition disposition = attach.ContentDisposition;
                        disposition.CreationDate = System.IO.File.GetCreationTime(file);
                        disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
                        disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
                        //添加附件
                        email.Attachments.Add(attach);
                    }
                }
                //优先级
                email.Priority = (mailPriority == "High") ? System.Net.Mail.MailPriority.High : System.Net.Mail.MailPriority.Normal;
                //内容编码、格式
                email.BodyEncoding = Encoding.UTF8;
                email.IsBodyHtml = true;
                email.To.Add(send);
                string enUserName = string.Empty;
                string ch_User_Dep = string.Empty;
                string en_User_Dep = string.Empty;
                //string safetyEva = string.Empty;
                //获取用户
                var userName = emailUser.Count(p => p.Email == send) > 0 ? emailUser.FirstOrDefault(p => p.Email == send).UserName : send;

                if (!string.IsNullOrEmpty(userName))
                {
                    var emailUserSend = Funs.DB.EmailUserView.Where(p => p.EmailType != 2 && p.IsEvaluateType != 1 && p.UserName== userName);
                    var emailLeaderSend = Funs.DB.EmailUserLeaderView.Where(p => p.EmailType != 2 && p.IsEvaluateType != 1 && p.UserName == userName);
                    var user = BLL.Sys_UserService.GetUserByAccount(userName);
                    enUserName = user.UserName;
                    //string enUser = string.Empty;
                    //string chUser = string.Empty;
                    //string depName = string.Empty;

                    //if (emailUserSend!=null && emailUserSend.Count()>0)
                    //{
                    //    enUser = "User";
                    //    chUser = "用户";
                    //}
                    //if (emailLeaderSend != null && emailLeaderSend.Count() > 0)
                    //{
                    //    var dep = BLL.DepartService.GetDepartById(user.DepartId);
                    //    if (dep != null)
                    //    {
                    //        depName = dep.DepartName;
                    //    }
                    //}

                    if (emailUserSend != null && emailUserSend.Count() > 0 && emailLeaderSend != null && emailLeaderSend.Count() > 0)
                    {
                        en_User_Dep = "User/Dep" ;
                        ch_User_Dep = "用户/部门";
                    }
                    else if ((emailUserSend != null && emailUserSend.Count() > 0) && (emailLeaderSend == null || emailLeaderSend.Count() == 0))
                    {
                        en_User_Dep = "User";
                        ch_User_Dep = "用户";
                    }
                    else if ((emailUserSend == null || emailUserSend.Count() == 0) && (emailLeaderSend != null && emailLeaderSend.Count() > 0))
                    {
                        en_User_Dep = "Dep";
                        ch_User_Dep = "部门";
                    }
                    

                    //内容
                    email.Body = mailBody.Replace("{month}", DateTime.Now.Month.ToString()).Replace("{name}", enUserName).Replace("{englishmonth}", englishmonth).Replace("{En_User_Dep}", en_User_Dep).Replace("{Ch_User_Dep}", ch_User_Dep);
                }

                try
                {
                    //发送邮件
                    client.Send(email);

                    Model.SendEmail newSendEmail = new Model.SendEmail();
                    newSendEmail.EmailId = Guid.NewGuid().ToString();
                    newSendEmail.EmailTile = mailSubject;
                    newSendEmail.EmailContent = ReplaceHtmlTag(mailBody).Replace("{month}", DateTime.Now.Month.ToString()).Replace("{name}", enUserName).Replace("{englishmonth}", englishmonth);
                    newSendEmail.EmailURL = send;
                    newSendEmail.EmailName = send;
                    newSendEmail.EmailStatus = "发送成功";
                    newSendEmail.CreateTime = DateTime.Now;
                    newSendEmail.CreateName = "sys";
                    sendList.Add(newSendEmail);
                    result = true;
                }
                catch (Exception ex)
                {
                    //错误日志
                    Model.SendEmail newSendEmail = new Model.SendEmail();
                    newSendEmail.EmailId = Guid.NewGuid().ToString();
                    newSendEmail.EmailTile = mailSubject;
                    newSendEmail.EmailContent = ReplaceHtmlTag(mailBody).Replace("{month}", DateTime.Now.Month.ToString()).Replace("{name}", enUserName).Replace("{englishmonth}", englishmonth);
                    newSendEmail.EmailURL = send;
                    newSendEmail.EmailName = send;
                    newSendEmail.EmailStatus = "发送失败";
                    newSendEmail.CreateTime = DateTime.Now;
                    newSendEmail.CreateName = "sys";
                    sendList.Add(newSendEmail);

                    resultMessage = ex.Message;
                    result = false;
                }
                finally
                {
                    //及时释放占用的资源
                    if (email.Attachments.Count > 0)
                    {
                        email.Attachments.Clear();
                        email.Attachments.Dispose();
                    }
                }
            }
            SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "SendEmail", sendList);
            return result;
        }



        /// <summary>
        /// 去除html
        /// </summary>
        /// <returns></returns>
        public static string ReplaceHtmlTag(string html)
        {
            string strText = System.Text.RegularExpressions.Regex.Replace(html, "<[^>]+>", "");
            strText = System.Text.RegularExpressions.Regex.Replace(strText, "&[^;]+;", "");

            return strText;
        }

        /// <summary>
        /// 根据主键获取信息
        /// </summary>
        /// <param name="EmailID"></param>
        /// <returns></returns>
        public static EmailPop getEmailPop(string EmailID)
        {
            return Funs.DB.EmailPop.FirstOrDefault(x => x.EmailID == EmailID);
        }
    }
}