You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

430 lines
18 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// 发送邮件辅助类
/// </summary>
public static class MailHelper
{
private static ILog logger = LogManager.GetLogger("MailHelper");
/// <summary>
/// 使用随机邮箱发送邮件
/// </summary>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
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;
}
/// <summary>
/// 使用指定的邮箱发送邮件
/// </summary>
/// <param name="configId">指定smtp配置的id</param>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
/// <param name="showName">显示名称</param>
/// <param name="sender">自定义发件人(只有小部分邮箱支持)</param>
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;
}
/// <summary>
/// 使用默认发件地址发送邮件
/// </summary>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
/// <returns></returns>
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);
}
/// <summary>
/// 使用马士基发件地址发送邮件
/// </summary>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
/// <returns></returns>
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);
}
/// <summary>
/// 使用发票转发发件地址发送邮件
/// </summary>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
/// <returns></returns>
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);
}
/// <summary>
/// 使用余额不足通知发件地址发送邮件
/// </summary>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
/// <returns></returns>
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);
}
/// <summary>
/// 发送发票邮件
/// </summary>
/// <param name="invId">发票记录Id</param>
/// <returns></returns>
public static bool SendMailInvoiceRecord(string invId)
{
return SendMailInvoiceRecordOther(invId, null);
}
/// <summary>
/// 发送发票邮件
/// </summary>
/// <param name="invId">发票记录Id</param>
/// <param name="email">优先使用参数的邮箱若参数未null时使用发票记录的邮箱</param>
/// <param name="cfgUserId">读取发件标题配置所属的用户,默认使用发票所有人的配置数据</param>
/// <returns></returns>
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<string[]>(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("yyyyMMdd")}";
}
//读取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;
}
/// <summary>
/// 发送邮件-运踪
/// </summary>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
/// <param name="showName">发件人显示名称</param>
/// <param name="sender">发件人显示邮箱地址(部分邮箱支持)</param>
/// <returns></returns>
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);
}
/// <summary>
/// 转发邮件
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 使用noreplay发件地址发送邮件
/// </summary>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件内容</param>
/// <param name="sendTo">接收人(多个接收人用英文逗号或分号隔开)</param>
/// <returns></returns>
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<string, string> dict = new Dictionary<string, string>();
// 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
{
/// <summary>
/// 文件显示名称
/// </summary>
public string FileName { get; set; }
/// <summary>
/// 文件存放完整路径
/// </summary>
public string FilePath { get; set; }
}
}