using IRaCIS.Core.Domain.Share; using MailKit; using MailKit.Security; using MimeKit; namespace IRaCIS.Core.Application.Helper; public static class SendEmailHelper { public static async Task SendEmailAsync(MimeMessage messageToSend, SystemEmailSendConfig _systemEmailConfig, EventHandler? messageSentSuccess = null) { try { using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { if (messageSentSuccess != null) { smtp.MessageSent += messageSentSuccess; } smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; //await smtp.ConnectAsync("smtp.qq.com", 465, SecureSocketOptions.SslOnConnect); //await smtp.AuthenticateAsync("zhou941003@qq.com", "sqfhlpfdvnexbcab"); await smtp.ConnectAsync(_systemEmailConfig.Host, _systemEmailConfig.Port, SecureSocketOptions.Auto); await smtp.AuthenticateAsync(_systemEmailConfig.FromEmail, _systemEmailConfig.AuthorizationCode); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } catch (Exception ex) { //---邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员 throw new Exception(StaticData.International("SendEmail_SendFail"), new Exception(ex.Message)); } } public static async Task TestEmailConfigAsync(SystemEmailSendConfig _systemEmailConfig) { using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5))) { using (var client = new MailKit.Net.Smtp.SmtpClient()) { await client.ConnectAsync(_systemEmailConfig.Host, _systemEmailConfig.Port, SecureSocketOptions.Auto, cts.Token); await client.AuthenticateAsync(_systemEmailConfig.FromEmail, _systemEmailConfig.AuthorizationCode, cts.Token); await client.DisconnectAsync(true); } } return true; } public static async Task SendEmailAsync(SMTPEmailConfig sMTPEmailConfig, EventHandler? messageSentSuccess = null) { var messageToSend = new MimeMessage(); //主题 messageToSend.Subject = sMTPEmailConfig.TopicDescription; //发件地址 messageToSend.From.Add(sMTPEmailConfig.FromEmailAddress); //收件地址 if (sMTPEmailConfig.ToMailAddressList.Count == 0) { //---没有收件人 throw new ArgumentException(StaticData.International("SendEmail_NoRecipient")); } else { foreach (var item in sMTPEmailConfig.ToMailAddressList) { messageToSend.To.Add(item); } //抄送 foreach (var copyToMailAddress in sMTPEmailConfig.CopyToMailAddressList) { messageToSend.Cc.Add(copyToMailAddress); } } var builder = new BodyBuilder(); //html body builder.HtmlBody = sMTPEmailConfig.HtmlBodyStr; //附件 foreach (var item in sMTPEmailConfig.EmailAttachMentConfigList) { //builder.Attachments.Add(item.FileName, item.FileData); var attachment = builder.Attachments.Add(item.FileName, item.FileStream); //解决附件名过长 奇怪的名字 foreach (var param in attachment.ContentDisposition.Parameters) param.EncodingMethod = ParameterEncodingMethod.Rfc2047; foreach (var param in attachment.ContentType.Parameters) param.EncodingMethod = ParameterEncodingMethod.Rfc2047; } messageToSend.Body = builder.ToMessageBody(); using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { if (messageSentSuccess != null) { smtp.MessageSent += messageSentSuccess; } smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync(sMTPEmailConfig.Host, sMTPEmailConfig.Port, SecureSocketOptions.Auto); await smtp.AuthenticateAsync(sMTPEmailConfig.UserName, sMTPEmailConfig.AuthorizationCode); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } } public class SMTPEmailConfig { public int Port { get; set; } public string Host { get; set; } public string UserName { get; set; } public string AuthorizationCode { get; set; } //邮件HtmlBody public string HtmlBodyStr { get; set; } = string.Empty; //发 public MailboxAddress FromEmailAddress { get; set; } //收 public List ToMailAddressList { get; set; } = new List(); //抄送 public List CopyToMailAddressList { get; set; } = new List(); //邮件主题 public string TopicDescription { get; set; } = string.Empty; //邮件附件 public List EmailAttachMentConfigList { get; set; } = new List() { }; } public class EmailAttachMentConfig { public string FileName { get; set; } public Stream FileStream { get; set; } public byte[] FileData { get; set; } }