diff --git a/FunGame.Core/Api/Transmittal/MailSender.cs b/FunGame.Core/Api/Transmittal/MailSender.cs index bf9c1a1..d728c18 100644 --- a/FunGame.Core/Api/Transmittal/MailSender.cs +++ b/FunGame.Core/Api/Transmittal/MailSender.cs @@ -1,4 +1,4 @@ -using Milimoe.FunGame.Core.Interface.Base; +using System.Net.Mail; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Server; @@ -6,23 +6,43 @@ using Milimoe.FunGame.Core.Service; namespace Milimoe.FunGame.Core.Api.Transmittal { - public class MailSender + public class MailSender : IDisposable { + public Guid MailSenderID { get; } public SmtpClientInfo SmtpClientInfo => _SmtpClientInfo; public MailSendResult LastestResult => _LastestResult; + public string ErrorMsg => _ErrorMsg; - private SmtpClientInfo _SmtpClientInfo; + private readonly SmtpClientInfo _SmtpClientInfo; private MailSendResult _LastestResult = MailSendResult.NotSend; + private string _ErrorMsg = ""; public MailSender(string SenderMailAddress, string SenderName, string SenderPassword, string Host, int Port, bool OpenSSL) { + MailSenderID = Guid.NewGuid(); _SmtpClientInfo = new SmtpClientInfo(SenderMailAddress, SenderName, SenderPassword, Host, Port, OpenSSL); } + public MailObject CreateMail(string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[] CCList, string[] BCCList) + { + return new MailObject(this, Subject, Body, Priority, HTML, ToList, CCList, BCCList); + } + public MailSendResult Send(MailObject Mail) { - _LastestResult = MailManager.Send(this, Mail); + _LastestResult = MailManager.Send(this, Mail, out _ErrorMsg); return _LastestResult; } + + public bool Dispose() + { + return MailManager.Dispose(this); + } + + void IDisposable.Dispose() + { + MailManager.Dispose(this); + GC.SuppressFinalize(this); + } } } diff --git a/FunGame.Core/Library/Common/Network/MailObject.cs b/FunGame.Core/Library/Common/Network/MailObject.cs index 5000760..2d9ef2e 100644 --- a/FunGame.Core/Library/Common/Network/MailObject.cs +++ b/FunGame.Core/Library/Common/Network/MailObject.cs @@ -1,4 +1,5 @@ using System.Net.Mail; +using Milimoe.FunGame.Core.Api.Transmittal; namespace Milimoe.FunGame.Core.Library.Common.Network { @@ -12,17 +13,19 @@ namespace Milimoe.FunGame.Core.Library.Common.Network public bool HTML { get; } = false; public string[] ToList { get; } = Array.Empty(); public string[] CCList { get; } = Array.Empty(); + public string[] BCCList { get; } = Array.Empty(); - public MailObject(string Sender, string SenderName, string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[] CcList) + public MailObject(MailSender Sender, string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[] CCList, string[] BCCList) { - this.Sender = Sender; - this.SenderName = SenderName; + this.Sender = Sender.SmtpClientInfo.SenderMailAddress; + this.SenderName = Sender.SmtpClientInfo.SenderName; this.Subject = Subject; this.Body = Body; this.Priority = Priority; this.HTML = HTML; this.ToList = ToList; - this.CCList = CcList; + this.CCList = CCList; + this.BCCList = BCCList; } } } diff --git a/FunGame.Core/Service/MailManager.cs b/FunGame.Core/Service/MailManager.cs index 8f6116c..7edc08e 100644 --- a/FunGame.Core/Service/MailManager.cs +++ b/FunGame.Core/Service/MailManager.cs @@ -1,53 +1,83 @@ -using System.Net; +using System.Collections; +using System.Net; using System.Net.Mail; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Library.Exception; using Milimoe.FunGame.Core.Library.Server; namespace Milimoe.FunGame.Core.Service { internal class MailManager { - internal SmtpClient? SmtpClient { get; } + internal static Hashtable HashClient { get; } = new Hashtable(); - internal static MailSendResult Send(MailSender Sender, MailObject Mail) + internal static MailSendResult Send(MailSender Sender, MailObject Mail, out string ErrorMsg) { - SmtpClientInfo Info = Sender.SmtpClientInfo; - SmtpClient Smtp = new() - { - Host = Info.Host, - Port = Info.Port, - EnableSsl = Info.OpenSSL, - DeliveryMethod = SmtpDeliveryMethod.Network, - Credentials = new NetworkCredential(Info.SenderMailAddress, Info.SenderPassword) - }; - MailMessage Msg = new() - { - Subject = Mail.Subject, - SubjectEncoding = General.DefaultEncoding, - Body = Mail.Body, - BodyEncoding = General.DefaultEncoding, - From = new MailAddress(Mail.Sender, Mail.SenderName, General.DefaultEncoding), - IsBodyHtml = Mail.HTML, - Priority = Mail.Priority - }; - foreach (string To in Mail.ToList) - { - Msg.To.Add(To); - } - foreach (string CC in Mail.CCList) - { - Msg.CC.Add(CC); - } + ErrorMsg = ""; try { + SmtpClientInfo Info = Sender.SmtpClientInfo; + SmtpClient Smtp; + Guid MailSenderID = Sender.MailSenderID; + if (!HashClient.ContainsKey(MailSenderID)) + { + Smtp = new() + { + Host = Info.Host, + Port = Info.Port, + EnableSsl = Info.OpenSSL, + DeliveryMethod = SmtpDeliveryMethod.Network, + Credentials = new NetworkCredential(Info.SenderMailAddress, Info.SenderPassword) + }; + HashClient.Add(MailSenderID, Smtp); + } + else Smtp = (SmtpClient)HashClient[MailSenderID]!; + MailMessage Msg = new() + { + Subject = Mail.Subject, + SubjectEncoding = General.DefaultEncoding, + Body = Mail.Body, + BodyEncoding = General.DefaultEncoding, + From = new MailAddress(Mail.Sender, Mail.SenderName, General.DefaultEncoding), + IsBodyHtml = Mail.HTML, + Priority = Mail.Priority + }; + foreach (string To in Mail.ToList) + { + Msg.To.Add(To); + } + foreach (string CC in Mail.CCList) + { + Msg.CC.Add(CC); + } Smtp.Send(Msg); return MailSendResult.Success; } + catch (Exception e) + { + ErrorMsg = e.GetErrorInfo(); + return MailSendResult.Fail; + } + } + + internal static bool Dispose(MailSender Sender) + { + try + { + Guid MailSenderID = Sender.MailSenderID; + if (HashClient.ContainsKey(MailSenderID)) + { + ((SmtpClient)HashClient[MailSenderID]!).Dispose(); + HashClient.Remove(MailSenderID); + return true; + } + return false; + } catch { - return MailSendResult.Fail; + return false; } } }