using Masuit.Tools.Systems; using System; using System.Collections.Generic; using System.Linq; using System.Net.Mail; namespace Masuit.Tools.Models; public class Email : Disposable { /// /// 发件人用户名 /// public EmailAddress Username { get; set; } /// /// 发件人邮箱密码 /// public string Password { get; set; } /// /// 发送服务器端口号,默认25 /// public int SmtpPort { get; set; } = 25; /// /// 发送服务器地址 /// public string SmtpServer { get; set; } /// /// 邮件标题 /// public string Subject { get; set; } /// /// 邮件正文 /// public string Body { get; set; } /// /// 收件人,多个收件人用英文逗号隔开 /// public string Tos { get; set; } public List CC { get; set; } = new List(); public List BCC { get; set; } = new List(); /// /// 是否启用SSL,默认已启用 /// public bool EnableSsl { get; set; } = true; /// /// 附件 /// public List Attachments { get; set; } = new List(); private MailMessage _mailMessage; private MailMessage MailMessage => _mailMessage ?? GetClient(); /// /// 邮件消息对象 /// private MailMessage GetClient() { if (string.IsNullOrEmpty(Tos)) return null; _mailMessage = new MailMessage(); //多个接收者 foreach (var str in Tos.Split(',')) { _mailMessage.To.Add(str); } foreach (var s in CC) { _mailMessage.CC.Add(s); } foreach (var s in BCC) { _mailMessage.Bcc.Add(s); } _mailMessage.From = new MailAddress(Username, Username); _mailMessage.Subject = Subject; _mailMessage.Body = Body; _mailMessage.IsBodyHtml = true; _mailMessage.BodyEncoding = System.Text.Encoding.UTF8; _mailMessage.SubjectEncoding = System.Text.Encoding.UTF8; _mailMessage.Priority = MailPriority.High; foreach (var item in Attachments.AsNotNull().Where(a => a is not null)) { _mailMessage.Attachments.Add(item); } return _mailMessage; } private SmtpClient SmtpClient => new() { UseDefaultCredentials = false, EnableSsl = EnableSsl, Host = SmtpServer, Port = SmtpPort, Credentials = new System.Net.NetworkCredential(Username, Password), DeliveryMethod = SmtpDeliveryMethod.Network, }; //回调方法 private Action _actionSendCompletedCallback; /// /// 使用异步发送邮件 /// /// 邮件发送后的回调方法 /// public void SendAsync(Action completedCallback) { if (MailMessage == null) return; //发送邮件回调方法 _actionSendCompletedCallback = completedCallback; SmtpClient.SendCompleted += SendCompletedCallback; SmtpClient.SendAsync(MailMessage, "true"); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败 } /// /// 使用同步发送邮件 /// public void Send() { if (MailMessage == null) return; SmtpClient.Send(MailMessage); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败 Dispose(true); } /// /// 异步操作完成后执行回调方法 /// /// /// private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { //同一组件下不需要回调方法,直接在此写入日志即可 //写入日志 if (_actionSendCompletedCallback == null) return; string message; if (e.Cancelled) { message = "异步操作取消"; } else if (e.Error != null) { message = $"UserState:{(string)e.UserState},Message:{e.Error}"; } else { message = (string)e.UserState; } //执行回调方法 _actionSendCompletedCallback(message); Dispose(true); } /// /// 释放 /// /// public override void Dispose(bool disposing) { _mailMessage?.Dispose(); SmtpClient?.Dispose(); Attachments?.ForEach(a => a?.Dispose()); } }