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; }
}
}