c# POP3,IMAP,SMTP 收发邮件设计

设计收发邮件的表结构

邮件服务器表
在这里插入图片描述
邮件表
在这里插入图片描述
邮件内容解析表,可根据自己的需求配置表字段
在这里插入图片描述
邮件附件表,这里根据解析邮件,是否存在附件,如果有则存在此表中。
在这里插入图片描述

这里需要配置默认的邮件服务器

在这里插入图片描述

收发邮件公共方法

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值