FunGame-Core/Service/MailManager.cs
milimoe 940f8397f1
为服务器统一数据访问连接 (#91)
* 重做 WebSocket 监听;为服务器统一了多种数据连接访问时的处理;统一编码为 UTF-8

* ModelManager已更名并移动到工具命名空间中

* 完成 WebSocket 消息处理系统

* 添加Socket异步接收数据流;修复TaskUtility阻塞的问题;优化心跳、房间、模组

* 添加枚举

* 删除多余字符

* 添加监听器的名称

* 修改了命名
2024-10-02 15:00:34 +08:00

126 lines
4.2 KiB
C#

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
{
/// <summary>
/// 用于保存Smtp客户端
/// 一个邮件服务对应一个Smtp客户端
/// </summary>
internal static Dictionary<Guid, SmtpClient> SmtpClients { get; } = [];
/// <summary>
/// 用于保存邮件服务
/// 允许服务器同时存在多个服务
/// </summary>
internal static Dictionary<Guid, MailSender> MailSenders { get; } = [];
/// <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)
{
ErrorMsg = "";
try
{
SmtpClientInfo Info = Sender.SmtpClientInfo;
SmtpClient Smtp;
Guid MailSenderID = Sender.MailSenderID;
if (!SmtpClients.TryGetValue(MailSenderID, out SmtpClient? value))
{
Smtp = new()
{
Host = Info.Host,
Port = Info.Port,
EnableSsl = Info.OpenSSL,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(Info.SenderMailAddress, Info.SenderPassword)
};
SmtpClients.Add(MailSenderID, 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;
}
}
/// <summary>
/// 关闭邮件服务
/// </summary>
/// <param name="Sender"></param>
/// <returns></returns>
internal static bool Dispose(MailSender Sender)
{
try
{
Guid MailSenderID = Sender.MailSenderID;
if (SmtpClients.TryGetValue(MailSenderID, out SmtpClient? value))
{
value.Dispose();
SmtpClients.Remove(MailSenderID);
MailSenders.Remove(MailSenderID);
return true;
}
return false;
}
catch
{
return false;
}
}
}
}