using DSWeb.Common.DB; using log4net; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; namespace DSWeb.Common.Helper { /// /// 发送邮件辅助类 /// public static class MailHelper { private static ILog logger = LogManager.GetLogger("MailHelper"); /// /// 使用随机邮箱发送邮件 /// /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) public static bool SendMail(string title, string body, string sendTo) { bool succ = false; CommonDataContext commonDataContext = new CommonDataContext(); var smtpList = commonDataContext.MailSendSmtp.AsNoTracking().ToList(); MailSendSmtp smtp = null; if (smtpList.Count > 0) { Random rnd = new Random(); int idx = rnd.Next(smtpList.Count); smtp = smtpList[idx]; } MailSend mailSend = new MailSend(); mailSend.SendTo = sendTo; mailSend.Title = title; mailSend.Body = body; if (smtp != null) { mailSend.SendStatus = MailSend.MailSendStatusCreate; mailSend.SmtpConfig = smtp.GID; succ = true; } else { mailSend.SendStatus = MailSend.MailSendStatusFail; logger.Error("没有配置发送邮箱,邮件将不会发送"); } commonDataContext.MailSend.Add(mailSend); commonDataContext.SaveChanges(); return succ; } /// /// 使用指定的邮箱发送邮件 /// /// 指定smtp配置的id /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) /// 显示名称 /// 自定义发件人(只有小部分邮箱支持) public static bool SendMail(string configId, string title, string body, string sendTo, string ccTo = null, string showName = null, string sender = null, bool customerSend = false, params AttachFileModel[] attachFiles) { bool succ = false; CommonDataContext commonDataContext = new CommonDataContext(); MailDataContext mailData = new MailDataContext(); MailSend mailSend = new MailSend(); mailSend.SendTo = sendTo; mailSend.CCTo = ccTo; mailSend.Title = title; mailSend.Body = body; mailSend.ShowName = showName; mailSend.Sender = sender; if (attachFiles != null && attachFiles.Length > 0) { mailSend.AttachFiles = JsonConvert.SerializeObject(attachFiles); } //使用大简云配置的smtp发邮件 if (!customerSend) { var smtp = commonDataContext.MailSendSmtp.AsNoTracking().FirstOrDefault(c => c.GID == configId); if (smtp != null) { mailSend.SendStatus = MailSend.MailSendStatusCreate; mailSend.SmtpConfig = smtp.GID; succ = true; } else { mailSend.SendStatus = MailSend.MailSendStatusFail; logger.Error("没有配置发送邮箱,邮件将不会发送"); succ = false; } } else //使用客户的邮箱发邮件 { mailSend.CustomerSend = true; var userMail = mailData.UserAccounts.AsNoTracking().FirstOrDefault(ua => ua.GID == configId); if (userMail != null) { mailSend.SendStatus = MailSend.MailSendStatusCreate; mailSend.SmtpConfig = userMail.GID; succ = true; } else { mailSend.SendStatus = MailSend.MailSendStatusFail; logger.Error("未找到邮箱账号配置,邮件将不会发送"); succ = false; } } commonDataContext.MailSend.Add(mailSend); commonDataContext.SaveChanges(); return succ; } /// /// 使用默认发件地址发送邮件 /// /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) /// public static bool SendMailCommon(string title, string body, string sendTo, params AttachFileModel[] attachFiles) { return SendMail("4AB9E4EE-7E62-4E95-9168-F7CF0605E088", title, body, sendTo, attachFiles: attachFiles); } /// /// 使用马士基发件地址发送邮件 /// /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) /// public static bool SendMailMaersk(string title, string body, string sendTo, params AttachFileModel[] attachFiles) { return SendMail("37F7BF61-41F1-4B77-A1B8-41BAFEDF5AF1", title, body, sendTo, attachFiles: attachFiles); } /// /// 使用发票转发发件地址发送邮件 /// /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) /// public static bool SendMailInvoice(string title, string body, string sendTo, params AttachFileModel[] attachFiles) { return SendMail("4E07BC66-0E0A-4A97-A3B5-EC6516FAE24A", title, body, sendTo, showName: "大简云发票平台", attachFiles: attachFiles); } /// /// 使用余额不足通知发件地址发送邮件 /// /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) /// public static bool SendMailService(string title, string body, string sendTo, params AttachFileModel[] attachFiles) { return SendMail("0D6D86A5-B341-4317-94D7-435C868F780C", title, body, sendTo, attachFiles: attachFiles); } /// /// 发送发票邮件 /// /// 发票记录Id /// public static bool SendMailInvoiceRecord(string invId) { return SendMailInvoiceRecordOther(invId, null); } /// /// 发送发票邮件 /// /// 发票记录Id /// 优先使用参数的邮箱,若参数未null时使用发票记录的邮箱 /// 读取发件标题配置所属的用户,默认使用发票所有人的配置数据 /// public static bool SendMailInvoiceRecordOther(string invId, string email, string cfgUserId = null) { InvoiceDbContext invDB = new InvoiceDbContext(); CommonDataContext comDB = new CommonDataContext(); var inv = invDB.Invoices.AsNoTracking().FirstOrDefault(i => i.GID == invId); if (inv != null && inv.Status == InvoiceRecord.StatusIssued && (!string.IsNullOrEmpty(email) || !string.IsNullOrEmpty(inv.Email))) { var cfgUid = string.IsNullOrEmpty(cfgUserId) ? inv.UserId : cfgUserId; var cfg = comDB.ConfigDatas.AsNoTracking().FirstOrDefault(cd => cd.Module == ConfigData.ModuleInvoice && cd.Category == ConfigData.CateMailSubject && cd.UserId == cfgUid); var title = ""; if (cfg != null) { var subjectArr = JsonConvert.DeserializeObject(cfg.JsonData); #region 标题拼接 string mailTitle = string.Empty; if (subjectArr.Contains("SalerName")) { mailTitle += "销售方:" + inv.SalerName; } if (subjectArr.Contains("Total")) { if (mailTitle.Length > 0) { mailTitle += "---"; } mailTitle += "金额:" + inv.Total; } if (subjectArr.Contains("InvoiceDate")) { if (mailTitle.Length > 0) { mailTitle += "---"; } mailTitle += "开票日期:" + inv.InvoiceDate.Value.ToString("yyyy年MM月dd日"); } if (subjectArr.Contains("InvNum")) { if (mailTitle.Length > 0) { mailTitle += "---"; } mailTitle += "发票号码:" + inv.InvNum; } if (subjectArr.Contains("InvoiceLine")) { if (mailTitle.Length > 0) { mailTitle += "---"; } switch (inv.InvoiceLine) { case "p": mailTitle += "发票种类:普通发票(电票)"; break; case "c": mailTitle += "发票种类:普通发票(纸票)"; break; case "s": mailTitle += "发票种类:专用发票"; break; case "e": mailTitle += "发票种类:收购发票(电票)"; break; case "f": mailTitle += "发票种类:收购发票(纸质)"; break; } } if (subjectArr.Contains("Clerk")) { if (mailTitle.Length > 0) { mailTitle += "---"; } mailTitle += "开票人:" + inv.Clerk; } if (subjectArr.Contains("BuyerName")) { if (mailTitle.Length > 0) { mailTitle += "---"; } mailTitle += "购货方名称:" + inv.BuyerName; } if (subjectArr.Contains("MBLNO")) { if (mailTitle.Length > 0) { mailTitle += "---"; } mailTitle += "提单号:" + inv.MBLNO; } #endregion title = $"您收到一张电子发票:{mailTitle}"; } else { title = $"您收到一张电子发票:销售方:{inv.SalerName}---金额:{inv.Total}---开票日期:{inv.InvoiceDate.Value.ToString("yyyy年MM月dd日")}"; } //读取html模板,填充数据 var htmlFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Areas/Invoice/Content/InvoiceMailTemplate.html"); var content = File.ReadAllText(htmlFile); content = content.Replace("$VIEW_URL$", inv.PictureUrl); content = content.Replace("$CUST_NAME$", inv.BuyerName); content = content.Replace("$INV_DATA$", inv.InvoiceDate.Value.ToString("yyyy年MM月dd日")); content = content.Replace("$TOTAL$", inv.Total.ToString()); content = content.Replace("$INV_NUM$", inv.InvNum); content = content.Replace("$INV_CODE$", inv.InvCode); content = content.Replace("$PDF_URL$", inv.PdfUrl); var att = new AttachFileModel() { FileName = $"{invId}.pdf", FilePath = inv.PdfUrl }; SendMailInvoice(title, content, string.IsNullOrEmpty(email) ? inv.Email : email, attachFiles: att); return true; } return false; } /// /// 发送邮件-运踪 /// /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) /// 发件人显示名称 /// 发件人显示邮箱地址(部分邮箱支持) /// public static bool SendMailBillTrace(string title, string body, string sendTo, string showName = null, string sender = null, params AttachFileModel[] attachFiles) { return SendMail("F48AA7593827456BB0DC12D4D8D13976", title, body, sendTo, showName, sender, attachFiles: attachFiles); } /// /// 转发邮件 /// /// public static bool TransmitMail(string configId, string sendTo, string emlFile, string dbConn = "DongShengDB") { CommonDataContext commonDataContext = new CommonDataContext(dbConn); MailSend mailSend = new MailSend(); mailSend.SendTo = sendTo; mailSend.Title = string.Empty; mailSend.Body = string.Empty; mailSend.CustomerSend = true; mailSend.SendStatus = MailSend.MailSendStatusCreate; mailSend.SmtpConfig = configId; mailSend.EmlFile = emlFile; mailSend.IsTransmit = true; commonDataContext.MailSend.Add(mailSend); commonDataContext.SaveChanges(); return true; } /// /// 使用noreplay发件地址发送邮件 /// /// 邮件标题 /// 邮件内容 /// 接收人(多个接收人用英文逗号或分号隔开) /// public static bool SendMailNoReplay(string title, string body, string sendTo, params AttachFileModel[] attachFiles) { return SendMail("CAF0C46C-D85F-45E6-8383-25889818F2FC", title, body, sendTo, attachFiles: attachFiles); } //public static bool SendMailUseTemplate() //{ // var template = commonData.MailSendTemplates.AsNoTracking().First(t => t.GID == "3CF45513-F996-4FBF-9A57-6E7851E389D8"); // Dictionary dict = new Dictionary(); // var propList = order.GetType().GetProperties(); // foreach (var prop in propList) // { // var valObj = prop.GetValue(order); // if (valObj == null) // { // dict.Add($"ORDER.{prop.Name.ToUpper()}", string.Empty); // } // else // { // dict.Add($"ORDER.{prop.Name.ToUpper()}", valObj.ToString()); // } // } // var strRegex = "\\{\\{[A-Za-z0-9.]+\\}\\}"; // var title = template.Title; // var mch = Regex.Match(title, strRegex); // while (mch.Success) // { // var key = mch.Value.Replace("{{", "").Replace("}}", "").Trim().ToUpper(); // title = title.Replace(mch.Value, dict[key]); // mch = Regex.Match(title, strRegex); // } // var body = template.Body; // mch = Regex.Match(body, strRegex); // while (mch.Success) // { // var key = mch.Value.Replace("{{", "").Replace("}}", "").Trim().ToUpper(); // body = body.Replace(mch.Value.ToUpper(), dict[key]); // mch = Regex.Match(title, strRegex); // } //} } public class AttachFileModel { /// /// 文件显示名称 /// public string FileName { get; set; } /// /// 文件存放完整路径 /// public string FilePath { get; set; } } }