using log4net; using Quartz; using System; using System.Data; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Text; using MailKit.Net.Smtp; using MimeKit; using HtmlAgilityPack; namespace JobSendAgentMail { public class JobSendBooking : IJob { private ILog log = LogManager.GetLogger(typeof(JobSendBooking)); public void Execute(IJobExecutionContext context) { string connStr = context.JobDetail.JobDataMap.GetString("ConnectString"); string querySql = context.JobDetail.JobDataMap.GetString("QuerySql"); string hblquerySql = context.JobDetail.JobDataMap.GetString("HblQuerySql"); string DocType = context.JobDetail.JobDataMap.GetString("DocType"); string D7FilePath = context.JobDetail.JobDataMap.GetString("D7FilePath"); 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"); string MAILTEMPLATE = context.JobDetail.JobDataMap.GetString("MAILTEMPLATE"); string MAILTITLE = context.JobDetail.JobDataMap.GetString("MAILTITLE"); log.Debug($"开始执行代理发送邮件"); using (SqlConnection dbcon = new SqlConnection(connStr)) { SqlDataAdapter adapter = new SqlDataAdapter(querySql, dbcon); DataTable table = new DataTable(); adapter.Fill(table); if (table.Columns.Contains("MBLNO") && table.Columns.Contains("AGENTID")) { if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { if (row["MBLNO"].ToString() != "" && row["AGENTID"].ToString() != "") { var htmlFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, MAILTEMPLATE); var content = File.ReadAllText(htmlFile); var REMARKSTR = row["BLREMARK"].ToString(); REMARKSTR = REMARKSTR.Replace("\r\n", "
"); REMARKSTR = REMARKSTR.Replace("\n", "
"); REMARKSTR = REMARKSTR.Replace("\r", ""); content = content.Replace("$MBLNO$", row["MBLNO"].ToString()); content = content.Replace("$ETD$", row["ETD"].ToString()); content = content.Replace("$BLFRT$", row["BLFRT"].ToString()); content = content.Replace("$PORTLOAD$", row["PORTLOAD"].ToString()); content = content.Replace("$PORTDISCHARGE$", row["PORTDISCHARGE"].ToString()); content = content.Replace("$DESTINATION$", row["DESTINATION"].ToString()); content = content.Replace("$ATD$", row["ATD"].ToString()); content = content.Replace("$HBLNO$", row["HBLNO"].ToString()); content = content.Replace("$ORDERNO$", row["ORDERNO"].ToString()); content = content.Replace("$ETA$", row["ETA"].ToString()); content = content.Replace("$CNTRTOTAL$", row["CNTRTOTAL"].ToString()); content = content.Replace("$CARRIERID$", row["CARRIERID"].ToString()); content = content.Replace("$ISSUETYPE$", row["ISSUETYPE"].ToString()); content = content.Replace("$BLREMARK$", REMARKSTR); MAILTITLE = MAILTITLE.Replace("$MBLNO$", row["MBLNO"].ToString()); MAILTITLE = MAILTITLE.Replace("$ETD$", row["ETD"].ToString()); MAILTITLE = MAILTITLE.Replace("$BLFRT$", row["BLFRT"].ToString()); MAILTITLE = MAILTITLE.Replace("$PORTLOAD$", row["PORTLOAD"].ToString()); MAILTITLE = MAILTITLE.Replace("$PORTDISCHARGE$", row["PORTDISCHARGE"].ToString()); MAILTITLE = MAILTITLE.Replace("$DESTINATION$", row["DESTINATION"].ToString()); MAILTITLE = MAILTITLE.Replace("$ATD$", row["ATD"].ToString()); MAILTITLE = MAILTITLE.Replace("$HBLNO$", row["HBLNO"].ToString()); MAILTITLE = MAILTITLE.Replace("$ORDERNO$", row["ORDERNO"].ToString()); MAILTITLE = MAILTITLE.Replace("$ETA$", row["ETA"].ToString()); MAILTITLE = MAILTITLE.Replace("$CNTRTOTAL$", row["CNTRTOTAL"].ToString()); MAILTITLE = MAILTITLE.Replace("$CARRIERID$", row["CARRIERID"].ToString()); MAILTITLE = MAILTITLE.Replace("$ISSUETYPE$", row["ISSUETYPE"].ToString()); MAILTITLE = MAILTITLE.Replace("$BLREMARK$", row["BLREMARK"].ToString()); SqlDataAdapter hbladapter = new SqlDataAdapter(hblquerySql + " where BSNO='" + row["BSNO"].ToString() + "'", dbcon); DataTable hbltable = new DataTable(); hbladapter.Fill(hbltable); var hblstr = ""; if (hbltable.Rows.Count > 0) { foreach (DataRow hblrow in hbltable.Rows) { hblstr = hblstr + "HB/L:" + hblrow["HBLNO"].ToString() + "-" + hblrow["ISSUETYPE"].ToString() + ":hold
"; } } content = content.Replace("$HBLCONTENT$", hblstr); StringWriter writer = new StringWriter(); HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(content); htmlDoc.Save(writer); string str = writer.ToString(); try { var message = new MimeMessage(); message.From.Add(new MailboxAddress(row["OPNAME"].ToString(), row["OPEMAIL"].ToString())); var maillist = row["AGENTEMAIL"].ToString().Split(';'); foreach (var mailaddr in maillist) { message.To.Add(MailboxAddress.Parse(mailaddr)); } message.To.Add(MailboxAddress.Parse(row["OPEMAIL"].ToString())); // message.Subject = "Pre-alert/" + row["ORDERNO"].ToString() + "/" + row["HBLNO"].ToString(); message.Subject = MAILTITLE; var html = new TextPart("html") { Text = str }; MimeEntity entity = html; //SendEmail se = new SendEmail(row["AGENTEMAIL"].ToString(), row["OPEMAIL"].ToString(), "", row["OPNAME"].ToString(), "Pre-alert/" + row["ORDERNO"].ToString() + "/" + row["HBLNO"].ToString(), str,true); SqlDataAdapter fileadapter = new SqlDataAdapter("SELECT * FROM Receipt_Doc where RECEIPTTYPE='" + DocType + "' and BSNO='" + row["BSNO"].ToString() + "'", dbcon); DataTable filetable = new DataTable(); fileadapter.Fill(filetable); if (filetable.Rows.Count > 0) { var mult = new Multipart("mixed") { html }; foreach (DataRow filerow in filetable.Rows) { var attfile = filerow["Driect_URL"].ToString(); if (!string.IsNullOrEmpty(attfile)) { attfile = attfile.Replace("../../", D7FilePath); while ((attfile.IndexOf("/") >= 0)) { attfile = attfile.Replace("/", @"\"); } if (File.Exists(attfile)) { var tmpDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "temp"); if (!Directory.Exists(tmpDir)) { Directory.CreateDirectory(tmpDir); } var tmpFile = Path.Combine(tmpDir, filerow["URL"].ToString()); File.Copy(attfile, tmpFile, true); var attPart = new MimePart(); attPart.Content = new MimeContent(new FileStream(attfile, FileMode.Open)); attPart.ContentDisposition = new ContentDisposition(ContentDisposition.Attachment); attPart.FileName = filerow["URL"].ToString(); mult.Add(attPart); //se.Attachments(attfile); } else { log.Debug($"附件文件:{attfile}不存在"); // logger.Error($"邮件{sendMail.GID}的附件文件{att.FilePath}不存在"); } } } entity = mult; } //se.SetSmtp(MAILSENDACCOUNT, MAILSENDPASSWORD, MAILSENDSERVICE, Convert.ToInt16(MAILSENDPORT), Convert.ToBoolean(MAILISSSL), System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法 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); } log.Debug($"邮件发送成功"); } catch (Exception ex) { log.Debug($"邮件发送失败:错误信息{ex.Message}"); } } else { log.Debug($"资料不全:{row["BSNO"].ToString()}"); } } } else { log.Debug($"未查询到数据,SQL语句:{querySql}"); } } else { log.Error($"未包含所需的列(mblno,carrierid,portloadid),SQL语句:{querySql}"); } } } } }