设计收发邮件的表结构
邮件服务器表
邮件表
邮件内容解析表,可根据自己的需求配置表字段
邮件附件表,这里根据解析邮件,是否存在附件,如果有则存在此表中。
这里需要配置默认的邮件服务器
收发邮件公共方法
using Common;
using MailKit.Net.Pop3;
using MailKit.Net.Smtp;
using MailKit.Security;
using Mapster;
using MimeKit;
using NPOI.HPSF;
using NPOI.SS.Formula.Functions;
using OSCFinancial.Core.Common.Extensions;
using OSCFinancial.Core.Common.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OSCFinancial.Core.Common.Helper
{
public class EmailHelper
{
/// <summary>
/// SMTP 发送邮件
/// </summary>
/// <param name="email">email 配置</param>
/// <param name="subject">主题</param>
/// <param name="textBody">文本内容</param>
/// <param name="htmlBody">Html内容</param>
/// <param name="originalMessage">原始邮件</param>
public static void SendEmail(EmailModel email, string subject, string textBody, string htmlBody, MimeMessage originalMessage = null)
{
// 创建邮件消息对象
var message = new MimeMessage();
// 设置发件人
message.From.Add(new MailboxAddress(email.DefaultFromEmail, email.DefaultFromEmail));
// 设置收件人
if (!string.IsNullOrEmpty(email.DefaultToEmail))
{
email.DefaultToEmail.Split(",").ToList().ForEach(to =>
{
message.To.Add(new MailboxAddress(to, to));
});
}
// 设置邮件主题
message.Subject = subject;
//// 创建邮件内容
var bodyBuilder = new BodyBuilder
{
TextBody = textBody,
HtmlBody = htmlBody
};
// 将邮件内容添加到消息对象中
message.Body = bodyBuilder.ToMessageBody();
if (originalMessage != null)
{
Reply(message, originalMessage, false);
}
// 创建并配置SMTP客户端
using var client = new SmtpClient();
try
{
// 连接到SMTP服务器,使用STARTTLS进行加密
client.Connect(email.Host, email.Port, email.EnableSsl);
// 使用邮箱账号和密码进行身份验证
client.Authenticate(email.UserName, email.Password);
// 发送邮件
client.Send(message);
// 输出发送成功的提示信息
Console.WriteLine("邮件发送成功!");
}
catch (Exception ex)
{
// 如果发生异常,输出错误信息
Console.WriteLine($"发送邮件时发生错误:{ex.Message}");
throw;//向上抛出一个异常,表示发送邮件失败
}
finally
{
// 断开与SMTP服务器的连接
client.Disconnect(true);
}
}
/// <summary>
/// POP3 接收邮件
/// </summary>
/// <param name="email">email 配置</param>
public static List<MimeMessage> ReceiveEmail(EmailModel email)
{
var result = new List<MimeMessage>();
using var client = new Pop3Client();
try
{
// 连接到POP3服务器
client.Connect(email.Host, email.Port, email.EnableSsl);
client.Authenticate(email.UserName, email.Password);
// 获取邮件数量
int count = client.GetMessageCount();
Console.WriteLine("Total emails: " + count);
// 遍历所有邮件
for (int i = 0; i < count; i++)
{
var message = client.GetMessage(i); // 获取邮件内容
Console.WriteLine("MessageID: " + message.MessageId); // 输出邮件MessageId
Console.WriteLine("Subject: " + message.Subject); // 输出邮件主题
Console.WriteLine("From: " + message.From); // 输出发件人信息
Console.WriteLine("Date: " + message.Date); // 输出邮件日期
Console.WriteLine("TextBody: " + message.TextBody);
Console.WriteLine("HtmlBody: " + message.HtmlBody);
if (message.Attachments != null && message.Attachments.Any())
{
message.Attachments.ForEach(a =>
{
var filename = a.ContentDisposition?.FileName ?? a.ContentType.Name; // 获取文件名或使用默认名
Console.WriteLine("Attachment: " + filename);
//下载附件到本地
using (var stream = File.Create(filename))
{
if (a is MimePart part)
{
part.Content.DecodeTo(stream);
}
}
});
}
result.Add(message);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
finally
{
// 断开连接
client.Disconnect(true); // true 表示从服务器删除邮件
}
return result;
}
/// <summary>
/// 加载本地邮件
/// </summary>
/// <param name="localPath"></param>
/// <returns></returns>
public static MimeMessage GetLocalEmail(string localPath)
{
using (var stream = File.OpenRead(localPath))
{
// 解析EML文件内容为MimeMessage对象
var message = MimeMessage.Load(stream);
// 输出邮件的头部信息,例如主题和发件人
Console.WriteLine("Subject: " + message.Subject);
Console.WriteLine("From: " + message.From);
Console.WriteLine("To: " + string.Join(", ", message.To));
return message;
}
}
/// <summary>
/// 生成回复邮件
/// </summary>
/// <param name="reply">新邮件</param>
/// <param name="message">原始邮件</param>
/// <param name="replyToAll">是否发送给抄送人</param>
public static void Reply(MimeMessage reply, MimeMessage message, bool replyToAll)
{
if (message.ReplyTo.Count > 0)
{
reply.To.AddRange(message.ReplyTo);
}
else if (message.From.Count > 0)
{
reply.To.AddRange(message.From);
}
else if (message.Sender != null)
{
reply.To.Add(message.Sender);
}
if (replyToAll)
{
reply.To.AddRange(message.To);
reply.Cc.AddRange(message.Cc);
}
if (!message.Subject.StartsWith("Re:", StringComparison.OrdinalIgnoreCase))
reply.Subject = "Re:" + message.Subject;
else
reply.Subject = message.Subject;
if (!string.IsNullOrEmpty(message.MessageId))
{
reply.InReplyTo = message.MessageId;
foreach (var id in message.References)
reply.References.Add(id);
reply.References.Add(message.MessageId);
}
var messageInfo = GetEmailHeader(message);
var multipart = new Multipart("mixed");
//回复的邮件内容
multipart.Add(new TextPart("html")
{
Text = reply.TextBody
});
multipart.Add(new TextPart("html")
{
Text = reply.HtmlBody
});
multipart.Add(new TextPart("html")
{
Text = messageInfo
});
//reply.BodyParts.ForEach(part =>
//{
// multipart.Add(part);
//});
//原始邮件内容
//multipart.Add(new TextPart("plain")
//{
// Text = message.TextBody
//});
//multipart.Add(new TextPart("html")
//{
// Text = message.HtmlBody
//});
message.BodyParts.ForEach(part =>
{
multipart.Add(part);
});
//var bodyBuilder = new BodyBuilder
//{
// TextBody = reply.TextBody,
// HtmlBody = reply.HtmlBody + "<div style='margin-top:20px'></div>" + messageInfo + "<div style='margin-top:20px'></div>" + message.HtmlBody
//};
//reply.Body = bodyBuilder.ToMessageBody();
reply.Body = multipart;
}
/// <summary>
/// 获取邮件发送信息
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static string GetEmailHeader(MimeMessage message)
{
var messageInfo = "<div style='margin-top:20px'></div><div>---Original---</div>";
messageInfo += "<div style='background-color:#EFEFEF'><div><b>From:</b>" + message.From + "</div>";
messageInfo += "<div><b>Date:</b>" + message.Date + "</div>";
messageInfo += "<div><b>To:</b>" + message.To + "</div>";
messageInfo += "<div><b>Cc:</b>" + message.Cc + "</div>";
messageInfo += "<div><b>Subject:</b>" + message.Subject + "</div></div><div style='margin-top:20px'></div>";
return messageInfo;
}
}
}
获取邮件
/// <summary>
/// Pop3获取邮件
/// </summary>
private List<MailItem> FetchServiceMail(DataAccessor dal)
{
var FetchList = new List<MailItem>();
try
{
using (Pop3Client pop3 = new Pop3Client())
{
var POP3Server = dal.GetMany<TOrderMailServer>(x => x.ServerType == 0 && x.IsDeleted != "Y").FirstOrDefault();
pop3.Connect(POP3Server.Server, POP3Server.Port, POP3Server.UseSSL ? SecureSocketOptions.Auto : SecureSocketOptions.None);
pop3.Authenticate(POP3Server.UserName, POP3Server.Password);
//if (!pop3.Capabilities.HasFlag(Pop3Capabilities.UIDL))
//{
// throw new Exception("The POP3 server does not support UIDs!");
//}
int cnt = pop3.GetMessageCount();
if (cnt > 0)
{
IList<string> UIDList = pop3.GetMessageUids().ToList();
//已经存储的邮件
Dictionary<string, int> ExistedUID = dal.GetMany<TOrderMail>(x => x.IsDeleted != "Y")
.ToDictionary(v => v.UID, v => 0);
for (int i = 0; i < UIDList.Count; i++)
{
string UID = UIDList[i];
if (!ExistedUID.ContainsKey(UID))
{
MailItem item = new MailItem();
item.Index = i;
item.UID = UID;
FetchList.Add(item);
}
}
if (FetchList.Any())
{
foreach (MailItem item in FetchList)
{
try
{
MimeMessage msg = pop3.GetMessage(item.Index);
if (msg.Date > POP3Server.StartDate && msg.Date < POP3Server.EndDate)
{
item.Message = msg;
item.IsSuccess = true;
}
}
catch (Exception ex)
{
//某一封邮件收取失败不能影响已经收下的邮件
//标识邮件的uid,并设置该邮件在数据库中的字段为异常
item.IsSuccess = false;
_logger.Information("FetchServiceMail GetMessage Error:" + ex.Message);
}
}
}
}
}
}
catch (Exception ex)
{
_logger.Information("FetchServiceMail Connect Error:" + ex.Message);
}
return FetchList;
}
/// <summary>
/// 下载并解析邮件,
/// </summary>
private async Task<OrderResult> SaveMail(List<MailItem> MailList, OrderModifyPara dataQueryParams)
{
var result = new OrderResult();
using (DataAccessor dal = await DataAccessor.Create<OSCFinancialOrderDataContext>()
.ChangeDataBaseAndTable(typeof(TAtmOrder), dataQueryParams.EnterpriseId))
{
try
{
DateTime now = DateTime.Now;
string RPath = string.Format("OrderMail\\{0}", now.ToString("yyyy-MM-dd")); //相对路径
string LocalPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, RPath);
if (!Directory.Exists(LocalPath))
{
Directory.CreateDirectory(LocalPath);
}
foreach (MailItem kp in MailList)
{
try
{
string UID = kp.UID;
MimeMessage msg = kp.Message;
string rfn = "";
var mainID = IdGenerater.GetNextId();
string errinfo = string.Empty;
#region 保存邮件到本地
var FPath = RPath + string.Format("\\{0}", UID);
LocalPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, FPath);
if (!Directory.Exists(LocalPath))
{
Directory.CreateDirectory(LocalPath);
}
string bfn = UID + ".eml";
rfn = Path.Combine(FPath, bfn);
string fn = Path.Combine(LocalPath, bfn);
using (FileStream fs = new FileStream(fn, FileMode.Create, FileAccess.Write))
{
msg.WriteTo(fs);
}
#endregion
#region 保存附件到本地
//下载邮件的附件--用于Rep订单的生成
foreach (var Attachment in msg.Attachments)
{
var part = (MimePart)Attachment;
bfn = part.FileName;
if (bfn.Contains(".xls") || bfn.Contains(".xlsx"))
{
string filefn = Path.Combine(LocalPath, bfn);
string filerfn = Path.Combine(FPath, bfn);
using (FileStream fs = new FileStream(filefn, FileMode.Create, FileAccess.Write))
{
part.Content.DecodeTo(fs);
}
#region 保存邮件附件表
TOrderMailFile mailfile = new TOrderMailFile();
mailfile.ID = IdGenerater.GetNextId();
mailfile.OrderMailID = mainID;
mailfile.FilePath = filerfn;
mailfile.EnterpriseId = dataQueryParams.EnterpriseId;
mailfile.CreateDate = now;
mailfile.CreateUserId = dataQueryParams.OperatorId;
mailfile.UpdateDate = now;
mailfile.UpdateUserId = dataQueryParams.OperatorId;
mailfile.Remark = "";
mailfile.IsDeleted = "N";
dal.Add(mailfile);
#endregion
}
}
#endregion
#region 保存邮件子表
errinfo = await SetDetailMail(dataQueryParams, dal, now, msg, rfn, mainID);
#endregion
#region 保存邮件主表
SetMainMail(dataQueryParams, dal, now, UID, msg, rfn, errinfo, mainID);
#endregion
result.Success = await dal.SaveAsync() > 0;
}
catch (Exception ex)
{
_logger.Information("SaveMail one Error:" + ex.Message);
}
}
}
catch (Exception ex)
{
result.Success = false;
_logger.Information("SaveMail Error:" + ex.Message);
}
}
return result;
}
/// <summary>
/// 设置邮件子表
/// </summary>
private async Task<string> SetDetailMail(OrderModifyPara dataQueryParams, DataAccessor dal, DateTime now, MimeMessage msg, string rfn, long mainID)
{
List<Dictionary<string, string>> ValueTableList = GetValueTable(rfn);
string errinfo = "";
if (ValueTableList.Count == 0)
{
errinfo += "邮件里没有指定格式的数据";
}
bool err = false;
foreach (var ValueTable in ValueTableList)
{
var detail = new TOrderMailDetail();
detail.ID = IdGenerater.GetNextId();
detail.OrderTime = msg.Date.DateTime;
detail.OrderMailID = mainID;
detail.EnterpriseId = dataQueryParams.EnterpriseId;
detail.CreateDate = now;
detail.CreateUserId = dataQueryParams.OperatorId;
detail.UpdateDate = now;
detail.UpdateUserId = dataQueryParams.OperatorId;
detail.IsDeleted = "N";
string json = JsonConvert.SerializeObject(ValueTable);
detail.RequestDataJSON = json;
string key;
#region 解析具体数据
//不同模板数据键值不同,所以分开解析
#region FLM模板
if (ValueTable["EmailType"] == "FLM")
{
#region CustomerJobID
if (!err)
{
key = "CustomerJobID";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
detail.ClientJobID = ValueTable[key];
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region OrderType
if (!err)
{
key = "OrderType";
if (ValueTable.ContainsKey(key))
{
if (ValueTable[key].Contains("FLM"))
{
detail.OrderFlg = 20;
}
else if (ValueTable[key].Contains("SLM"))
{
detail.OrderFlg = 10;
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region ExecutionDate
if (!err)
{
key = "ExecutionDate";
if (ValueTable.ContainsKey(key))
{
DateTime ExecutionDate = new DateTime();
if (DateTime.TryParse(ValueTable[key], out ExecutionDate))
{
detail.ExecutionDate = ExecutionDate;
}
else
{
errinfo += string.Format("{0}数据项的值{1}错误", key, ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region SLATime
if (!err)
{
key = "SLATime";
if (ValueTable.ContainsKey(key))
{
DateTime SLATime = new DateTime();
if (DateTime.TryParse(ValueTable[key], out SLATime))
{
detail.SLATime = SLATime;
}
else
{
errinfo += string.Format("{0}数据项的值{1}错误", key, ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region ATM Code
if (!err)
{
key = "ATMCode";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var atmInfo = await GrpcProvider.GetGrpcClient<IATMInfoClient>(RpcConsts.BasicData, _interceptor)
.GetATMSiteByNo(new AtmRequest()
{
AtmNo = ValueTable[key],
EnterpriseId = dataQueryParams.EnterpriseId
});
if (atmInfo != null)
{
detail.AtmId = atmInfo.ID;
detail.AtmNo = atmInfo.AtmNo;
detail.Location = atmInfo.Location;
detail.ServiceBranchID = atmInfo.ServiceBranchId;
detail.BranchID = atmInfo.BranchId;
detail.BusinessId = atmInfo.BusinessId;
detail.OpenTime = atmInfo.OpenTime;
detail.CloseTime = atmInfo.CloseTime;
detail.SubZone = atmInfo.SubZone;
detail.MainZone = atmInfo.MainZone;
detail.AtmModelID = atmInfo.AtmModelId;
detail.AtmModelName = atmInfo.AtmModelName;
detail.CustomerId = atmInfo.ID;
detail.CustomerName = atmInfo.CustomerName;
detail.ConfirmedBy = atmInfo.StaffID;
detail.ConfirmedByName = atmInfo.StaffName;
}
else
{
errinfo += string.Format("数据库里找不到{0}的值为{1}的ATM", key, ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
}
#endregion
#region OrderRemark
if (!err)
{
key = "OrderRemark";
if (ValueTable.ContainsKey(key))
{
detail.Remark = ValueTable[key];
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region FaultType
if (!err)
{
key = "FaultType";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var FaultTypeList = await GrpcProvider.GetGrpcClient<IBaseDataClient>(RpcConsts.BasicData, _interceptor)
.GetFaultTypeList(new BaseParam() { EnterpriseId = dataQueryParams.EnterpriseId, SearchIDS = detail.CustomerId.ToString() });
var FaultType = FaultTypeList.Where(x => x.FaultName.Contains(ValueTable[key])).FirstOrDefault();
var OtherFaultType = FaultTypeList.Where(x => x.FaultName.Contains("OTHERS")).FirstOrDefault();
if (FaultType != null)
{
detail.FaultType = FaultType.Code;
detail.FaultTypeName = FaultType.FaultName;
}
else if (OtherFaultType != null)
{
detail.FaultType = OtherFaultType.Code;
detail.FaultTypeName = OtherFaultType.FaultName;
}
else
{
errinfo += string.Format("数据库里找不到值为{0}的FaultType,并且没有类型为OTHERS的FaultType", ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
}
#endregion
#region SLM-1模板
if (ValueTable["EmailType"] == "SLM1")
{
#region TID
if (!err)
{
key = "TID";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var atmInfo = await GrpcProvider.GetGrpcClient<IATMInfoClient>(RpcConsts.BasicData, _interceptor)
.GetATMSiteByNo(new AtmRequest()
{
AtmNo = ValueTable[key],
EnterpriseId = dataQueryParams.EnterpriseId
});
if (atmInfo != null)
{
detail.AtmId = atmInfo.ID;
detail.AtmNo = atmInfo.AtmNo;
detail.Location = atmInfo.Location;
detail.ServiceBranchID = atmInfo.ServiceBranchId;
detail.BranchID = atmInfo.BranchId;
detail.BusinessId = atmInfo.BusinessId;
detail.OpenTime = atmInfo.OpenTime;
detail.CloseTime = atmInfo.CloseTime;
detail.SubZone = atmInfo.SubZone;
detail.MainZone = atmInfo.MainZone;
detail.AtmModelID = atmInfo.AtmModelId;
detail.AtmModelName = atmInfo.AtmModelName;
detail.CustomerId = atmInfo.CustomerId;
detail.CustomerName = atmInfo.CustomerName;
detail.ConfirmedBy = atmInfo.StaffID;
detail.ConfirmedByName = atmInfo.StaffName;
}
else
{
errinfo += string.Format("数据库里找不到{0}的值为{1}的ATM", key, ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
}
#endregion
#region Error
if (!err)
{
key = "Error";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var FaultTypeList = await GrpcProvider.GetGrpcClient<IBaseDataClient>(RpcConsts.BasicData, _interceptor)
.GetFaultTypeList(new BaseParam() { EnterpriseId = dataQueryParams.EnterpriseId, SearchIDS = detail.CustomerId.ToString() });
var FaultType = FaultTypeList.Where(x => x.FaultName.Contains(ValueTable[key])).FirstOrDefault();
var OtherFaultType = FaultTypeList.Where(x => x.FaultName.Contains("OTHERS")).FirstOrDefault();
if (FaultType != null)
{
detail.FaultType = FaultType.Code;
detail.FaultTypeName = FaultType.FaultName;
}
else if (OtherFaultType != null)
{
detail.FaultType = OtherFaultType.Code;
detail.FaultTypeName = OtherFaultType.FaultName;
}
else
{
errinfo += string.Format("数据库里找不到值为{0}的FaultType,并且没有类型为OTHERS的FaultType", ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region EN Ticket
if (!err)
{
key = "EN Ticket #";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
detail.ClientJobID = ValueTable[key];
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region DateTime
if (!err)
{
key = "DateTime";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var DateTime = ParseDateTime(ValueTable[key]);
if (DateTime.HasValue)
{
detail.ExecutionDate = DateTime.Value.Date;
detail.SLATime = DateTime.Value;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
detail.OrderFlg = 20;
}
#endregion
#region SLM-2模板
if (ValueTable["EmailType"] == "SLM2")
{
#region TID
if (!err)
{
key = "TID";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var atmInfo = await GrpcProvider.GetGrpcClient<IATMInfoClient>(RpcConsts.BasicData, _interceptor)
.GetATMSiteByNo(new AtmRequest()
{
AtmNo = ValueTable[key],
EnterpriseId = dataQueryParams.EnterpriseId
});
if (atmInfo.ID != 0)
{
detail.AtmId = atmInfo.ID;
detail.AtmNo = atmInfo.AtmNo;
detail.Location = atmInfo.Location;
detail.ServiceBranchID = atmInfo.ServiceBranchId;
detail.BranchID = atmInfo.BranchId;
detail.BusinessId = atmInfo.BusinessId;
detail.OpenTime = atmInfo.OpenTime;
detail.CloseTime = atmInfo.CloseTime;
detail.SubZone = atmInfo.SubZone;
detail.MainZone = atmInfo.MainZone;
detail.AtmModelID = atmInfo.AtmModelId;
detail.AtmModelName = atmInfo.AtmModelName;
detail.CustomerId = atmInfo.CustomerId;
detail.CustomerName = atmInfo.CustomerName;
detail.ConfirmedBy = atmInfo.StaffID;
detail.ConfirmedByName = atmInfo.StaffName;
}
else
{
errinfo += string.Format("数据库里找不到{0}的值为{1}的ATM", key, ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
}
#endregion
#region Error
if (!err)
{
key = "ACTIVITY";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var FaultTypeList = await GrpcProvider.GetGrpcClient<IBaseDataClient>(RpcConsts.BasicData, _interceptor)
.GetFaultTypeList(new BaseParam() { EnterpriseId = dataQueryParams.EnterpriseId, SearchIDS = detail.CustomerId.ToString() });
var FaultType = FaultTypeList.Where(x => x.FaultName.Contains(ValueTable[key])).FirstOrDefault();
var OtherFaultType = FaultTypeList.Where(x => x.FaultName.Contains("OTHERS")).FirstOrDefault();
if (FaultType != null)
{
detail.FaultType = FaultType.Code;
detail.FaultTypeName = FaultType.FaultName;
}
else if (OtherFaultType != null)
{
detail.FaultType = OtherFaultType.Code;
detail.FaultTypeName = OtherFaultType.FaultName;
}
else
{
errinfo += string.Format("数据库里找不到值为{0}的FaultType,并且没有类型为OTHERS的FaultType", ValueTable[key]);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region Ticket
if (!err)
{
key = "Ticket";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
detail.ClientJobID = ValueTable[key];
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
#region DateTime
if (!err)
{
key = "DateTime";
if (ValueTable.ContainsKey(key))
{
if (!string.IsNullOrEmpty(ValueTable[key]))
{
var DateTime = ParseDateTime(ValueTable[key]);
if (DateTime.HasValue)
{
detail.ExecutionDate = DateTime.Value.Date;
detail.SLATime = DateTime.Value;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
else
{
errinfo += string.Format("邮件里找不到{0}的对应的数据项", key);
err = true;
}
}
#endregion
detail.OrderFlg = 20;
}
#endregion
#endregion
dal.Add(detail);
}
return errinfo;
}
/// <summary>
/// 设置邮件主表
/// </summary>
private static void SetMainMail(OrderModifyPara dataQueryParams, DataAccessor dal, DateTime now, string UID, MimeMessage msg, string rfn, string errinfo, long mainID)
{
TOrderMail item = new TOrderMail();
item.ID = mainID;
item.Subject = msg.Subject;
item.ReceiveTime = msg.Date.DateTime;
item.UID = UID;
item.Path = rfn;
item.Content = string.Empty;
item.ErrorInfo = errinfo;
item.Invalid = false;
item.TryCount = 0;
item.Stage = 1;//解析邮件
if (!string.IsNullOrEmpty(errinfo))
{
item.Status = 1;//解析失败
}
else
{
item.Status = 2;//解析成功
}
item.EnterpriseId = dataQueryParams.EnterpriseId;
item.CreateDate = now;
item.CreateUserId = dataQueryParams.OperatorId;
item.UpdateDate = now;
item.UpdateUserId = dataQueryParams.OperatorId;
item.IsDeleted = "N";
dal.Add(item);
}