Extend MailServices (#35)

This commit is contained in:
milimoe 2023-06-24 01:33:40 +08:00 committed by GitHub
parent b4ce65a35b
commit 5e3767036f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 283 additions and 30 deletions

View File

@ -8,26 +8,70 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
{ {
public class MailSender : IDisposable public class MailSender : IDisposable
{ {
/// <summary>
/// 邮件服务内部ID
/// </summary>
public Guid MailSenderID { get; } public Guid MailSenderID { get; }
/// <summary>
/// Smtp客户端信息
/// </summary>
public SmtpClientInfo SmtpClientInfo => _SmtpClientInfo; public SmtpClientInfo SmtpClientInfo => _SmtpClientInfo;
/// <summary>
/// 上一个邮件发送的结果
/// </summary>
public MailSendResult LastestResult => _LastestResult; public MailSendResult LastestResult => _LastestResult;
/// <summary>
/// 上一个邮件的发送错误信息(如果发送失败)
/// </summary>
public string ErrorMsg => _ErrorMsg; public string ErrorMsg => _ErrorMsg;
/**
*
*/
private readonly SmtpClientInfo _SmtpClientInfo; private readonly SmtpClientInfo _SmtpClientInfo;
private MailSendResult _LastestResult = MailSendResult.NotSend; private MailSendResult _LastestResult = MailSendResult.NotSend;
private string _ErrorMsg = ""; private string _ErrorMsg = "";
/// <summary>
/// 创建邮件服务
/// </summary>
/// <param name="SenderMailAddress"></param>
/// <param name="SenderName"></param>
/// <param name="SenderPassword"></param>
/// <param name="Host"></param>
/// <param name="Port"></param>
/// <param name="OpenSSL"></param>
public MailSender(string SenderMailAddress, string SenderName, string SenderPassword, string Host, int Port, bool OpenSSL) public MailSender(string SenderMailAddress, string SenderName, string SenderPassword, string Host, int Port, bool OpenSSL)
{ {
MailSenderID = Guid.NewGuid(); MailSenderID = Guid.NewGuid();
_SmtpClientInfo = new SmtpClientInfo(SenderMailAddress, SenderName, SenderPassword, Host, Port, OpenSSL); _SmtpClientInfo = new SmtpClientInfo(SenderMailAddress, SenderName, SenderPassword, Host, Port, OpenSSL);
if (!MailManager.MailSenders.ContainsKey(MailSenderID)) MailManager.MailSenders.Add(MailSenderID, this);
} }
/// <summary>
/// 创建完整邮件对象
/// </summary>
/// <param name="Subject"></param>
/// <param name="Body"></param>
/// <param name="Priority"></param>
/// <param name="HTML"></param>
/// <param name="ToList"></param>
/// <param name="CCList"></param>
/// <param name="BCCList"></param>
/// <returns></returns>
public MailObject CreateMail(string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[]? CCList = null, string[]? BCCList = null) public MailObject CreateMail(string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[]? CCList = null, string[]? BCCList = null)
{ {
return new MailObject(this, Subject, Body, Priority, HTML, ToList, CCList, BCCList); return new MailObject(this, Subject, Body, Priority, HTML, ToList, CCList, BCCList);
} }
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="Mail"></param>
/// <returns></returns>
public MailSendResult Send(MailObject Mail) public MailSendResult Send(MailObject Mail)
{ {
_LastestResult = MailManager.Send(this, Mail, out _ErrorMsg); _LastestResult = MailManager.Send(this, Mail, out _ErrorMsg);
@ -36,12 +80,19 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
private bool IsDisposed = false; private bool IsDisposed = false;
/// <summary>
/// 关闭邮件服务
/// </summary>
public void Dispose() public void Dispose()
{ {
Dispose(true); Dispose(true);
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
/// <summary>
/// 关闭邮件服务
/// </summary>
/// <param name="Disposing"></param>
protected void Dispose(bool Disposing) protected void Dispose(bool Disposing)
{ {
if (!IsDisposed) if (!IsDisposed)

View File

@ -1,20 +1,127 @@
using System.Net.Mail; using System.Net.Mail;
using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Library.Common.Network namespace Milimoe.FunGame.Core.Library.Common.Network
{ {
public class MailObject public class MailObject
{ {
/// <summary>
/// 发件人邮箱
/// </summary>
public string Sender { get; } = ""; public string Sender { get; } = "";
public string SenderName { get; } = "";
public string Subject { get; } = "";
public string Body { get; } = "";
public MailPriority Priority { get; } = MailPriority.Normal;
public bool HTML { get; } = false;
public string[] ToList { get; } = Array.Empty<string>();
public string[]? CCList { get; } = Array.Empty<string>();
public string[]? BCCList { get; } = Array.Empty<string>();
/// <summary>
/// 发件人名称
/// </summary>
public string SenderName { get; } = "";
/// <summary>
/// 邮件主题
/// </summary>
public string Subject { get; } = "";
/// <summary>
/// 邮件内容
/// </summary>
public string Body { get; } = "";
/// <summary>
/// 邮件优先级
/// </summary>
public MailPriority Priority { get; } = MailPriority.Normal;
/// <summary>
/// 内容是否支持HTML
/// </summary>
public bool HTML { get; } = true;
/// <summary>
/// 收件人列表
/// </summary>
public List<string> ToList { get; } = new();
/// <summary>
/// 抄送列表
/// </summary>
public List<string> CCList { get; } = new();
/// <summary>
/// 密送列表
/// </summary>
public List<string> BCCList { get; } = new();
public MailObject()
{
}
/// <summary>
/// 使用MailSender工具类创建邮件对象
/// </summary>
/// <param name="Sender"></param>
public MailObject(MailSender Sender)
{
this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
this.SenderName = Sender.SmtpClientInfo.SenderName;
}
/// <summary>
/// 使用地址和名称创建邮件对象
/// </summary>
/// <param name="Sender"></param>
/// <param name="SenderName"></param>
public MailObject(string Sender, string SenderName)
{
this.Sender = Sender;
this.SenderName = SenderName;
}
/// <summary>
/// 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人
/// </summary>
/// <param name="Sender"></param>
/// <param name="Subject"></param>
/// <param name="Body"></param>
/// <param name="To"></param>
public MailObject(MailSender Sender, string Subject, string Body, string To)
{
this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
this.SenderName = Sender.SmtpClientInfo.SenderName;
this.Subject = Subject;
this.Body = Body;
ToList.Add(To);
}
/// <summary>
/// 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人、单个抄送
/// </summary>
/// <param name="Sender"></param>
/// <param name="Subject"></param>
/// <param name="Body"></param>
/// <param name="To"></param>
/// <param name="CC"></param>
public MailObject(MailSender Sender, string Subject, string Body, string To, string CC)
{
this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
this.SenderName = Sender.SmtpClientInfo.SenderName;
this.Subject = Subject;
this.Body = Body;
ToList.Add(To);
CCList.Add(CC);
}
/// <summary>
/// 完整的创建邮件对象
/// </summary>
/// <param name="Sender"></param>
/// <param name="Subject"></param>
/// <param name="Body"></param>
/// <param name="Priority"></param>
/// <param name="HTML"></param>
/// <param name="ToList"></param>
/// <param name="CCList"></param>
/// <param name="BCCList"></param>
public MailObject(MailSender Sender, string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[]? CCList = null, string[]? BCCList = null) public MailObject(MailSender Sender, string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[]? CCList = null, string[]? BCCList = null)
{ {
this.Sender = Sender.SmtpClientInfo.SenderMailAddress; this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
@ -23,9 +130,74 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
this.Body = Body; this.Body = Body;
this.Priority = Priority; this.Priority = Priority;
this.HTML = HTML; this.HTML = HTML;
this.ToList = ToList; AddTo(ToList);
this.CCList = CCList; if (CCList != null) AddCC(CCList);
this.BCCList = BCCList; if (BCCList != null) AddBCC(BCCList);
}
/// <summary>
/// 发送邮件
/// -- 适合创建一次性邮件并发送 --
/// </summary>
/// <param name="sender"></param>
/// <returns></returns>
public MailSendResult Send(MailSender sender)
{
return sender.Send(this);
}
/// <summary>
/// 添加收件人
/// </summary>
/// <param name="to"></param>
public void AddTo(string to)
{
if (!ToList.Contains(to)) ToList.Add(to);
}
/// <summary>
/// 添加多个收件人
/// </summary>
/// <param name="to"></param>
public void AddTo(params string[] to)
{
foreach (string t in to) AddTo(t);
}
/// <summary>
/// 添加抄送
/// </summary>
/// <param name="cc"></param>
public void AddCC(string cc)
{
if (!CCList.Contains(cc)) CCList.Add(cc);
}
/// <summary>
/// 添加多个抄送
/// </summary>
/// <param name="cc"></param>
public void AddCC(params string[] cc)
{
foreach (string c in cc) AddCC(c);
}
/// <summary>
/// 添加密送
/// </summary>
/// <param name="bcc"></param>
public void AddBCC(string bcc)
{
if (!BCCList.Contains(bcc)) BCCList.Add(bcc);
}
/// <summary>
/// 添加多个密送
/// </summary>
/// <param name="bcc"></param>
public void AddBCC(params string[] bcc)
{
foreach (string b in bcc) AddBCC(b);
} }
} }
} }

View File

@ -1,5 +1,4 @@
using System.Collections; using System.Net;
using System.Net;
using System.Net.Mail; using System.Net.Mail;
using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Library.Common.Architecture; using Milimoe.FunGame.Core.Library.Common.Architecture;
@ -11,8 +10,39 @@ namespace Milimoe.FunGame.Core.Service
{ {
internal class MailManager internal class MailManager
{ {
internal static Hashtable HashClient { get; } = new Hashtable(); /// <summary>
/// 用于保存Smtp客户端
/// 一个邮件服务对应一个Smtp客户端
/// </summary>
internal static Dictionary<Guid, SmtpClient> SmtpClients { get; } = new();
/// <summary>
/// 用于保存邮件服务
/// 允许服务器同时存在多个服务
/// </summary>
internal static Dictionary<Guid, MailSender> MailSenders { get; } = new();
/// <summary>
/// 获取某个已经保存过的邮件服务
/// </summary>
/// <param name="MailSenderID"></param>
/// <returns></returns>
internal static MailSender? GetSender(Guid MailSenderID)
{
if (MailSenders.TryGetValue(MailSenderID, out MailSender? value))
{
return value;
}
return null;
}
/// <summary>
/// 统一调用此方法发送邮件
/// </summary>
/// <param name="Sender"></param>
/// <param name="Mail"></param>
/// <param name="ErrorMsg"></param>
/// <returns></returns>
internal static MailSendResult Send(MailSender Sender, MailObject Mail, out string ErrorMsg) internal static MailSendResult Send(MailSender Sender, MailObject Mail, out string ErrorMsg)
{ {
ErrorMsg = ""; ErrorMsg = "";
@ -21,7 +51,7 @@ namespace Milimoe.FunGame.Core.Service
SmtpClientInfo Info = Sender.SmtpClientInfo; SmtpClientInfo Info = Sender.SmtpClientInfo;
SmtpClient Smtp; SmtpClient Smtp;
Guid MailSenderID = Sender.MailSenderID; Guid MailSenderID = Sender.MailSenderID;
if (!HashClient.ContainsKey(MailSenderID)) if (!SmtpClients.ContainsKey(MailSenderID))
{ {
Smtp = new() Smtp = new()
{ {
@ -31,9 +61,9 @@ namespace Milimoe.FunGame.Core.Service
DeliveryMethod = SmtpDeliveryMethod.Network, DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(Info.SenderMailAddress, Info.SenderPassword) Credentials = new NetworkCredential(Info.SenderMailAddress, Info.SenderPassword)
}; };
HashClient.Add(MailSenderID, Smtp); SmtpClients.Add(MailSenderID, Smtp);
} }
else Smtp = (SmtpClient)HashClient[MailSenderID]!; else Smtp = SmtpClients[MailSenderID];
MailMessage Msg = new() MailMessage Msg = new()
{ {
Subject = Mail.Subject, Subject = Mail.Subject,
@ -48,19 +78,13 @@ namespace Milimoe.FunGame.Core.Service
{ {
if (To.Trim() != "") Msg.To.Add(To); if (To.Trim() != "") Msg.To.Add(To);
} }
if (Mail.CCList != null) foreach (string CC in Mail.CCList)
{ {
foreach (string CC in Mail.CCList) if (CC.Trim() != "") Msg.CC.Add(CC);
{
if (CC.Trim() != "") Msg.CC.Add(CC);
}
} }
if (Mail.BCCList != null) foreach (string BCC in Mail.BCCList)
{ {
foreach (string BCC in Mail.BCCList) if (BCC.Trim() != "") Msg.Bcc.Add(BCC);
{
if (BCC.Trim() != "") Msg.Bcc.Add(BCC);
}
} }
Smtp.SendMailAsync(Msg); Smtp.SendMailAsync(Msg);
return MailSendResult.Success; return MailSendResult.Success;
@ -72,15 +96,21 @@ namespace Milimoe.FunGame.Core.Service
} }
} }
/// <summary>
/// 关闭邮件服务
/// </summary>
/// <param name="Sender"></param>
/// <returns></returns>
internal static bool Dispose(MailSender Sender) internal static bool Dispose(MailSender Sender)
{ {
try try
{ {
Guid MailSenderID = Sender.MailSenderID; Guid MailSenderID = Sender.MailSenderID;
if (HashClient.ContainsKey(MailSenderID)) if (SmtpClients.TryGetValue(MailSenderID, out SmtpClient? value))
{ {
((SmtpClient)HashClient[MailSenderID]!).Dispose(); value.Dispose();
HashClient.Remove(MailSenderID); SmtpClients.Remove(MailSenderID);
MailSenders.Remove(MailSenderID);
return true; return true;
} }
return false; return false;