199 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
| 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<MessageSentEventArgs>? 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(I18n.T("SendEmail_SendFail"), new Exception(ex.Message));
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public static async Task<bool> 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<MessageSentEventArgs>? messageSentSuccess = null)
 | |
|     {
 | |
|         var messageToSend = new MimeMessage();
 | |
| 
 | |
|         //主题
 | |
|         messageToSend.Subject = sMTPEmailConfig.TopicDescription;
 | |
| 
 | |
|         //发件地址
 | |
|         messageToSend.From.Add(sMTPEmailConfig.FromEmailAddress);
 | |
| 
 | |
|         //收件地址
 | |
| 
 | |
|         if (sMTPEmailConfig.ToMailAddressList.Count == 0)
 | |
|         {
 | |
|             //---没有收件人
 | |
|             throw new ArgumentException(I18n.T("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<MailboxAddress> ToMailAddressList { get; set; } = new List<MailboxAddress>();
 | |
| 
 | |
|     //抄送
 | |
|     public List<MailboxAddress> CopyToMailAddressList { get; set; } = new List<MailboxAddress>();
 | |
| 
 | |
|     //邮件主题
 | |
|     public string TopicDescription { get; set; } = string.Empty;
 | |
| 
 | |
|     //邮件附件
 | |
|     public List<EmailAttachMentConfig> EmailAttachMentConfigList { get; set; } = new List<EmailAttachMentConfig>() { };
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| public class EmailAttachMentConfig
 | |
| {
 | |
|     public string FileName { get; set; }
 | |
| 
 | |
|     public Stream FileStream { get; set; }
 | |
| 
 | |
| 
 | |
|     public byte[] FileData { get; set; }
 | |
| }
 |