Email.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net.Mail;
  4. namespace Masuit.Tools.Models
  5. {
  6. #pragma warning disable 1591
  7. public class Email
  8. {
  9. /// <summary>
  10. /// 发件人用户名
  11. /// </summary>
  12. public EmailAddress Username { get; set; }
  13. /// <summary>
  14. /// 发件人邮箱密码
  15. /// </summary>
  16. public string Password { get; set; }
  17. /// <summary>
  18. /// 发送服务器端口号,默认25
  19. /// </summary>
  20. public int SmtpPort { get; set; } = 25;
  21. /// <summary>
  22. /// 发送服务器地址
  23. /// </summary>
  24. public string SmtpServer { get; set; }
  25. /// <summary>
  26. /// 邮件标题
  27. /// </summary>
  28. public string Subject { get; set; }
  29. /// <summary>
  30. /// 邮件正文
  31. /// </summary>
  32. public string Body { get; set; }
  33. /// <summary>
  34. /// 收件人,多个收件人用英文逗号隔开
  35. /// </summary>
  36. public string Tos { get; set; }
  37. /// <summary>
  38. /// 是否启用SSL,默认已启用
  39. /// </summary>
  40. public bool EnableSsl { get; set; } = true;
  41. /// <summary>
  42. /// 附件
  43. /// </summary>
  44. public List<Attachment> Attachments { get; set; } = new List<Attachment>();
  45. private MailMessage _mailMessage => GetClient();
  46. /// <summary>
  47. /// 邮件消息对象
  48. /// </summary>
  49. private MailMessage GetClient()
  50. {
  51. if (string.IsNullOrEmpty(Tos)) return null;
  52. var mailMessage = new MailMessage();
  53. //多个接收者
  54. foreach (var str in Tos.Split(','))
  55. {
  56. mailMessage.To.Add(str);
  57. }
  58. mailMessage.From = new MailAddress(Username, Username);
  59. mailMessage.Subject = Subject;
  60. mailMessage.Body = Body;
  61. mailMessage.IsBodyHtml = true;
  62. mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
  63. mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;
  64. mailMessage.Priority = MailPriority.High;
  65. foreach (var item in Attachments)
  66. {
  67. mailMessage.Attachments.Add(item);
  68. }
  69. return mailMessage;
  70. }
  71. private SmtpClient SmtpClient => new SmtpClient
  72. {
  73. UseDefaultCredentials = false,
  74. EnableSsl = EnableSsl,
  75. Host = SmtpServer,
  76. Port = SmtpPort,
  77. Credentials = new System.Net.NetworkCredential(Username, Password),
  78. DeliveryMethod = SmtpDeliveryMethod.Network,
  79. };
  80. //回调方法
  81. Action<string> _actionSendCompletedCallback;
  82. /// <summary>
  83. /// 使用异步发送邮件
  84. /// </summary>
  85. /// <param name="completedCallback">邮件发送后的回调方法</param>
  86. /// <returns></returns>
  87. public void SendAsync(Action<string> completedCallback)
  88. {
  89. if (_mailMessage == null) return;
  90. //发送邮件回调方法
  91. _actionSendCompletedCallback = completedCallback;
  92. SmtpClient.SendCompleted += SendCompletedCallback;
  93. SmtpClient.SendAsync(_mailMessage, "true"); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败
  94. }
  95. /// <summary>
  96. /// 使用同步发送邮件
  97. /// </summary>
  98. public void Send()
  99. {
  100. if (_mailMessage == null) return;
  101. SmtpClient.Send(_mailMessage); //异步发送邮件,如果回调方法中参数不为"true"则表示发送失败
  102. _mailMessage.Dispose();
  103. SmtpClient.Dispose();
  104. }
  105. /// <summary>
  106. /// 异步操作完成后执行回调方法
  107. /// </summary>
  108. /// <param name="sender"></param>
  109. /// <param name="e"></param>
  110. private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
  111. {
  112. //同一组件下不需要回调方法,直接在此写入日志即可
  113. //写入日志
  114. if (_actionSendCompletedCallback == null) return;
  115. string message;
  116. if (e.Cancelled)
  117. {
  118. message = "异步操作取消";
  119. }
  120. else if (e.Error != null)
  121. {
  122. message = $"UserState:{(string)e.UserState},Message:{e.Error}";
  123. }
  124. else
  125. {
  126. message = (string)e.UserState;
  127. }
  128. _mailMessage.Dispose();
  129. SmtpClient.Dispose();
  130. //执行回调方法
  131. _actionSendCompletedCallback(message);
  132. }
  133. }
  134. #pragma warning restore 1591
  135. }