using NCC.Common.Configuration;
using NCC.Common.Extension;
using NCC.Common.Helper;
using NCC.Dependency;
using NCC.Expand.Thirdparty.Email.Model;
using MailKit.Net.Pop3;
using MailKit.Net.Smtp;
using MimeKit;
using MimeKit.Text;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Yitter.IdGenerator;
namespace NCC.Expand.Thirdparty.Email
{
///
/// 基于MailKit的邮件帮助类
/// 版 本:V1.20.15
/// 版 权:Wesley(https://www.NCCsoft.com)
/// 作 者:NCC开发平台组
///
[SuppressSniffer]
public class Mail
{
private static string mailFilePath = FileVariable.EmailFilePath;
///
/// 发送:协议Smtp
///
/// 配置
/// 信息
public static void Send(MailAccount mailConfig, MailModel mailModel)
{
MimeMessage message = new MimeMessage();
//发送方信息
message.From.AddRange(new MailboxAddress[] { new MailboxAddress(mailConfig.AccountName, mailConfig.Account) });
//发件人
if (!string.IsNullOrEmpty(mailModel.To))
{
List toAddress = new List();
var toArray = mailModel.To.Split(',');
foreach (var item in toArray)
{
toAddress.Add(new MailboxAddress(item));
}
message.To.AddRange(toAddress.ToArray());
}
//抄送人
if (!string.IsNullOrEmpty(mailModel.CC))
{
List ccAddress = new List();
var ccArray = mailModel.CC.Split(',');
foreach (var item in ccArray)
{
ccAddress.Add(new MailboxAddress(item));
}
message.Cc.AddRange(ccAddress.ToArray());
}
//密送人
if (!string.IsNullOrEmpty(mailModel.Bcc))
{
List bccAddress = new List();
var bccArray = mailModel.Bcc.Split(',');
foreach (var item in bccArray)
{
bccAddress.Add(new MailboxAddress(item));
}
message.Bcc.AddRange(bccAddress.ToArray());
}
message.Subject = mailModel.Subject;
TextPart body = new TextPart(TextFormat.Html) { Text = mailModel.BodyText };
MimeEntity entity = body;
//附件
if (mailModel.Attachment != null)
{
var mult = new Multipart("mixed") { body };
foreach (var attachment in mailModel.Attachment)
{
var file = new FileInfo(mailFilePath + attachment.fileId);
if (file.Exists)
{
var mimePart = new MimePart();
mimePart.Content = new MimeContent(file.OpenRead());
mimePart.ContentDisposition = new ContentDisposition(ContentDisposition.Attachment);
mimePart.ContentTransferEncoding = ContentEncoding.Base64;
mimePart.FileName = attachment.fileName;
mult.Add(mimePart);
}
}
entity = mult;
}
message.Body = entity;
message.Date = DateTime.Now;
using (var client = new SmtpClient())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(mailConfig.SMTPHost, mailConfig.SMTPPort, mailConfig.Ssl);
client.Authenticate(mailConfig.Account, mailConfig.Password);
client.Send(message);
client.Disconnect(true);
}
}
///
/// 获取:协议Pop3
///
/// 配置
/// 已收邮件数、注意:如果已收邮件数和邮件数量一致则不获取
///
public static List Get(MailAccount mailConfig, int receiveCount)
{
var resultList = new List();
using (var client = new Pop3Client())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(mailConfig.POP3Host, mailConfig.POP3Port, mailConfig.Ssl);
client.Authenticate(mailConfig.Account, mailConfig.Password);
if (receiveCount == client.Count)
return resultList;
for (int i = client.Count - 1; receiveCount <= i; i--)
{
var message = client.GetMessage(i);
var from = (MailboxAddress)message.From[0];
var attachment = message.Attachments;
resultList.Add(new MailModel()
{
UID = message.MessageId,
To = from.Address,
ToName = from.Name,
Subject = message.Subject,
BodyText = message.HtmlBody,
Attachment = GetEmailAttachments(attachment, message.MessageId),
Date = message.Date.ToDate(),
});
}
client.Disconnect(true);
}
return resultList;
}
///
/// 删除:协议Pop3
///
/// 配置
/// messageId
public static void Delete(MailAccount mailConfig, string messageId)
{
using (var client = new Pop3Client())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(mailConfig.POP3Host, mailConfig.POP3Port, mailConfig.Ssl);
client.Authenticate(mailConfig.Account, mailConfig.Password);
for (int i = 0; i < client.Count; i++)
{
if (client.GetMessage(i).MessageId == messageId)
{
client.DeleteMessage(i);
}
}
}
}
///
/// 验证连接:协议Smtp、Pop3
///
/// 配置
///
public static bool CheckConnected(MailAccount mailConfig)
{
try
{
if (!string.IsNullOrEmpty(mailConfig.SMTPHost))
{
using (var client = new SmtpClient())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(mailConfig.SMTPHost, mailConfig.SMTPPort, mailConfig.Ssl);
client.Authenticate(mailConfig.Account, mailConfig.Password);
client.Disconnect(true);
return true;
}
}
if (!string.IsNullOrEmpty(mailConfig.POP3Host))
{
using (var client = new Pop3Client())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(mailConfig.POP3Host, mailConfig.POP3Port, mailConfig.Ssl);
client.Authenticate(mailConfig.Account, mailConfig.Password);
client.Disconnect(true);
return true;
}
}
return false;
}
catch (Exception ex)
{
Console.Write("邮箱验证失败原因:" + ex + ",失败详情:" + ex.StackTrace);
return false;
}
}
#region Method
private static List GetEmailAttachments(IEnumerable attachments, string messageId)
{
var resultList = new List();
foreach (var attachment in attachments)
{
if (attachment.IsAttachment)
{
var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;
var fileId = YitIdHelper.NextId().ToString() + "_" + fileName;
var filePath = mailFilePath + fileId;
using (var stream = File.Create(filePath))
{
if (attachment is MessagePart rfc822)
{
rfc822.Message.WriteTo(stream);
}
else
{
var part = (MimePart)attachment;
part.Content.DecodeTo(stream);
}
}
var mailFileInfo = new FileInfo(filePath);
resultList.Add(new MailFile { fileId = fileId, fileName = fileName, fileSize = FileHelper.ToFileSize(mailFileInfo.Length) });
}
}
return resultList;
}
private static string ConvertToBase64(string inputStr, Encoding encoding)
{
return Convert.ToBase64String(encoding.GetBytes(inputStr));
}
private static string ConvertHeaderToBase64(string inputStr, Encoding encoding)
{
var encode = !string.IsNullOrEmpty(inputStr) && inputStr.Any(c => c > 127);
if (encode)
{
return "=?" + encoding.WebName + "?B?" + ConvertToBase64(inputStr, encoding) + "?=";
}
return inputStr;
}
#endregion
}
}