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());
}
}