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.Model; namespace Milimoe.FunGame.Core.Service { internal class MailManager { /// /// 用于保存Smtp客户端 /// 一个邮件服务对应一个Smtp客户端 /// internal static Dictionary SmtpClients { get; } = []; /// /// 用于保存邮件服务 /// 允许服务器同时存在多个服务 /// internal static Dictionary MailSenders { get; } = []; /// /// 获取某个已经保存过的邮件服务 /// /// /// internal static MailSender? GetSender(Guid mailSenderID) { if (MailSenders.TryGetValue(mailSenderID, out MailSender? value)) { return value; } return null; } /// /// 统一调用此方法发送邮件 /// /// /// /// /// internal static MailSendResult Send(MailSender sender, MailObject mail, out string errorMsg) { errorMsg = ""; try { SmtpClientInfo info = sender.SmtpClientInfo; SmtpClient smtp; Guid senderID = sender.MailSenderID; if (!SmtpClients.TryGetValue(senderID, out SmtpClient? value)) { smtp = new() { Host = info.Host, Port = info.Port, EnableSsl = info.SSL, DeliveryMethod = SmtpDeliveryMethod.Network, Credentials = new NetworkCredential(info.SenderMailAddress, info.SenderPassword) }; SmtpClients.Add(senderID, smtp); } else smtp = value; 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) { if (To.Trim() != "") Msg.To.Add(To); } foreach (string CC in mail.CCList) { if (CC.Trim() != "") Msg.CC.Add(CC); } foreach (string BCC in mail.BCCList) { if (BCC.Trim() != "") Msg.Bcc.Add(BCC); } smtp.SendMailAsync(Msg); return MailSendResult.Success; } catch (Exception e) { errorMsg = e.GetErrorInfo(); Api.Utility.TXTHelper.AppendErrorLog(errorMsg); return MailSendResult.Fail; } } /// /// 关闭邮件服务 /// /// /// internal static bool Dispose(MailSender sender) { try { Guid senderID = sender.MailSenderID; if (SmtpClients.TryGetValue(senderID, out SmtpClient? value)) { value.Dispose(); SmtpClients.Remove(senderID); MailSenders.Remove(senderID); return true; } return false; } catch { return false; } } } }