using System.Data.Entity; using log4net; using MailKit.Net.Smtp; using MimeKit; using Quartz; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; namespace JobSendAgentMail { /* 注意 依赖于几个表 * * //待发邮件表 自动发出其中 sendstatus=create的 CREATE TABLE [dbo].[Mail_Send]( [GID] [nvarchar](128) NOT NULL, [SendTo] [nvarchar](max) NULL, [CCTo] [nvarchar](max) NULL, [Title] [nvarchar](max) NULL, [Body] [nvarchar](max) NULL, [SendStatus] [nvarchar](40) NULL, [SendTime] [datetime] NULL, [TryCount] [int] NOT NULL, [CreateTime] [datetime] NOT NULL, [RelativeId] [nvarchar](max) NULL, [SmtpConfig] [varchar](36) NULL, [Sender] [varchar](64) NULL, [ShowName] [nvarchar](50) NULL, CONSTRAINT [PK_dbo.Mail_Send] PRIMARY KEY CLUSTERED ( [GID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO //发送日志记录 CREATE TABLE [dbo].[op_mail_log]( [GID] [varchar](60) NOT NULL, [BSNO] [varchar](60) NULL, [BLTYPE] [varchar](20) NULL, [RECEIVER] [varchar](100) NULL, [SUBJECT] [varchar](300) NULL, [DESCRIPTION] [varchar](max) NULL, [ATTACHMENT] [varchar](600) NULL, [SENDTIME] [datetime] NULL, [SENDER] [varchar](10) NULL, [SENDUSER] [varchar](60) NULL, CCTo varchar(500) null, CONSTRAINT [PK_op_mail_log] PRIMARY KEY CLUSTERED ( [GID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO */ /// /// 发送邮件任务 /// public class SendMailJob : IJob { private const int MailSendTryTimes = 3; private ILog logger = LogManager.GetLogger(typeof(SendMailJob)); public void Execute(IJobExecutionContext context) { string connStr = context.JobDetail.JobDataMap.GetString("ConnectString"); string MAILSENDACCOUNT = context.JobDetail.JobDataMap.GetString("MAILSENDACCOUNT"); string MAILSENDPASSWORD = context.JobDetail.JobDataMap.GetString("MAILSENDPASSWORD"); string MAILSENDSERVICE = context.JobDetail.JobDataMap.GetString("MAILSENDSERVICE"); string MAILSENDPORT = context.JobDetail.JobDataMap.GetString("MAILSENDPORT"); string MAILISSSL = context.JobDetail.JobDataMap.GetString("MAILISSSL"); MailDataContext commonDataContext = new MailDataContext(connStr); var sendMailList = commonDataContext.MailSend.Where(sm => sm.SendStatus == MailSend.MailSendStatusCreate).OrderBy(sm => sm.CreateTime).Take(20).ToList(); if (sendMailList.Count > 0) { //先更改状态,防止其他线程重复发送 foreach (var sendMail in sendMailList) { logger.Debug($"mail ready to send:{sendMail.GID} {sendMail.Title}"); sendMail.SendStatus = MailSend.MailSendStatusSending; sendMail.SendTime = DateTime.Now; sendMail.TryCount++; commonDataContext.SaveChanges(); } //逐个发送 foreach (var sendMail in sendMailList) { try { var message = new MimeMessage(); message.From.Add(MailboxAddress.Parse(MAILSENDACCOUNT)); if (sendMail.SendTo.IndexOf(",") > -1) { var arrSendTo = sendMail.SendTo.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (var s in arrSendTo) { message.To.Add(MailboxAddress.Parse(s)); } } else if (sendMail.SendTo.IndexOf(";") > -1) { var arrSendTo = sendMail.SendTo.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (var s in arrSendTo) { message.To.Add(MailboxAddress.Parse(s)); } } else { message.To.Add(MailboxAddress.Parse(sendMail.SendTo)); } if (!string.IsNullOrWhiteSpace(sendMail.CCTo)) { if (sendMail.CCTo.IndexOf(",") > -1) { var arrSendTo = sendMail.CCTo.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (var s in arrSendTo) { message.To.Add(MailboxAddress.Parse(s)); } } else if (sendMail.CCTo.IndexOf(";") > -1) { var arrSendTo = sendMail.CCTo.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (var s in arrSendTo) { message.To.Add(MailboxAddress.Parse(s)); } } else { message.To.Add(MailboxAddress.Parse(sendMail.CCTo)); } } message.Subject = sendMail.Title; var html = new TextPart("html") { Text = sendMail.Body }; MimeEntity entity = html; //if (!string.IsNullOrEmpty(sendMail.Sender)) //{ // message.Sender = MailboxAddress.Parse(sendMail.Sender); //} message.Body = entity; using (var client = new SmtpClient()) { client.Connect(MAILSENDSERVICE, Convert.ToInt16(MAILSENDPORT), Convert.ToBoolean(MAILISSSL)); client.Authenticate(MAILSENDACCOUNT, MAILSENDPASSWORD); client.Send(message); client.Disconnect(true); } logger.Debug($"发送成功:{sendMail.GID} {sendMail.Title}"); sendMail.SendStatus = MailSend.MailSendStatusSuccess; //commonDataContext.SaveChanges(); var OpMailLog = new OpMailLog(); OpMailLog.SUBJECT = sendMail.Title; OpMailLog.RECEIVER = sendMail.SendTo; OpMailLog.BSNO = sendMail.RelativeId; OpMailLog.DESCRIPTION = sendMail.Body; OpMailLog.SENDUSER = MAILSENDACCOUNT; OpMailLog.BLTYPE = "舱单回执转发"; commonDataContext.OpMailLogs.Add(OpMailLog); commonDataContext.SaveChanges(); logger.Debug($"mail send success:{sendMail.GID} {sendMail.Title}"); } catch (Exception ex) { if (sendMail.TryCount < MailSendTryTimes) { sendMail.SendStatus = MailSend.MailSendStatusCreate; //会再次尝试发送 } else { sendMail.SendStatus = MailSend.MailSendStatusFail; } commonDataContext.SaveChanges(); logger.Error($"mail send fail:{sendMail.GID} {sendMail.Title},times:{sendMail.TryCount}"); logger.Error(ex.Message); logger.Error(ex.StackTrace); } } } } } }