using System.Text;
using JNPF.Common.Configuration;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using MailKit.Net.Pop3;
using MailKit.Net.Smtp;
using MimeKit;
using MimeKit.Text;
using Yitter.IdGenerator;
namespace JNPF.Extras.Thirdparty.Email;
///
/// 邮箱帮助类.
///
public class MailUtil
{
private static string mailFilePath = FileVariable.EmailFilePath;
///
/// 发送:协议Smtp.
///
/// 配置
/// 信息
public static void Send(MailParameterInfo mailConfig, MailInfo 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();
foreach (var item in mailModel.To.Split(','))
{
toAddress.Add(new MailboxAddress(item));
}
message.To.AddRange(toAddress.ToArray());
}
// 抄送人
if (!string.IsNullOrEmpty(mailModel.CC))
{
List ccAddress = new List();
foreach (var item in mailModel.CC.Split(','))
{
ccAddress.Add(new MailboxAddress(item));
}
message.Cc.AddRange(ccAddress.ToArray());
}
// 密送人
if (!string.IsNullOrEmpty(mailModel.Bcc))
{
List bccAddress = new List();
foreach (var item in mailModel.Bcc.Split(','))
{
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(Path.Combine(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(MailParameterInfo 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 MailInfo()
{
UID = message.MessageId,
To = from.Address,
ToName = from.Name,
Subject = message.Subject,
BodyText = message.HtmlBody,
Attachment = GetEmailAttachments(attachment, message.MessageId),
Date = message.Date.ToString().ParseToDateTime(),
});
}
client.Disconnect(true);
}
return resultList;
}
///
/// 删除:协议Pop3.
///
/// 配置.
/// messageId.
public static void Delete(MailParameterInfo 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(MailParameterInfo 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 = Path.Combine(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 MailFileParameterInfo { fileId = fileId, fileName = fileName, fileSize = FileHelper.ToFileSize(mailFileInfo.Length) });
}
}
return resultList;
}
///
/// 转换为Base64.
///
///
///
///
private static string ConvertToBase64(string inputStr, Encoding encoding)
{
return Convert.ToBase64String(encoding.GetBytes(inputStr));
}
///
/// 转换报头为Base64.
///
///
///
///
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
}