MailHelper.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using Infrastructure;
  2. using Infrastructure.Model;
  3. using MailKit.Net.Smtp;
  4. using MimeKit;
  5. using MimeKit.Text;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. namespace ZR.Common
  11. {
  12. public class MailHelper
  13. {
  14. /// <summary>
  15. /// 发送人邮箱
  16. /// </summary>
  17. private readonly MailOptions mailOptions = new();
  18. public MailHelper()
  19. {
  20. List<MailOptions> options = new();
  21. AppSettings.Bind("MailOptions", options);
  22. mailOptions = options.First();
  23. }
  24. public MailHelper(MailOptions _mailOptions)
  25. {
  26. mailOptions = _mailOptions;
  27. }
  28. /// <summary>
  29. /// 发送一个
  30. /// </summary>
  31. /// <param name="toAddress"></param>
  32. /// <param name="subject"></param>
  33. /// <param name="text"></param>
  34. /// <param name="path"></param>
  35. public string SendMail(string toAddress, string subject, string text, string path = "", string html = "")
  36. {
  37. IEnumerable<MailboxAddress> mailboxes = new List<MailboxAddress>() {
  38. new MailboxAddress(toAddress, toAddress)
  39. };
  40. return SendMail(mailboxes, subject, text, path, html);
  41. }
  42. /// <summary>
  43. /// 发送多个邮箱
  44. /// </summary>
  45. /// <param name="toAddress"></param>
  46. /// <param name="subject"></param>
  47. /// <param name="text"></param>
  48. /// <param name="path"></param>
  49. public string SendMail(string[] toAddress, string subject, string text, string path = "", string html = "")
  50. {
  51. IList<MailboxAddress> mailboxes = new List<MailboxAddress>() { };
  52. foreach (var item in toAddress)
  53. {
  54. mailboxes.Add(new MailboxAddress(item, item));
  55. }
  56. return SendMail(mailboxes, subject, text, path, html);
  57. }
  58. /// <summary>
  59. /// 发送邮件
  60. /// </summary>
  61. /// <param name="toAddress"></param>
  62. /// <param name="subject">主题</param>
  63. /// <param name="text"></param>
  64. /// <param name="path">附件url地址</param>
  65. /// <param name="html">网页HTML内容</param>
  66. private string SendMail(IEnumerable<MailboxAddress> toAddress, string subject, string text, string path = "", string html = "")
  67. {
  68. MimeMessage message = new MimeMessage();
  69. //发件人
  70. message.From.Add(new MailboxAddress(mailOptions.FromName, mailOptions.FromEmail));
  71. //收件人
  72. message.To.AddRange(toAddress);
  73. message.Subject = subject;
  74. message.Date = DateTime.Now;
  75. //创建附件Multipart
  76. Multipart multipart = new Multipart("mixed");
  77. var alternative = new MultipartAlternative();
  78. //html内容
  79. if (!string.IsNullOrEmpty(html))
  80. {
  81. var Html = new TextPart(TextFormat.Html)
  82. {
  83. Text = html
  84. };
  85. alternative.Add(Html);
  86. }
  87. //文本内容
  88. //if (!string.IsNullOrEmpty(text))
  89. //{
  90. var plain = new TextPart(TextFormat.Plain)
  91. {
  92. Text = text + "\r\n\n\n" + mailOptions.Signature
  93. };
  94. alternative.Add(plain);
  95. //}
  96. //附件
  97. if (!string.IsNullOrEmpty(path))
  98. {
  99. string[] files = path.Split(",");
  100. foreach (var file in files)
  101. {
  102. MimePart attachment = new()
  103. {
  104. Content = new MimeContent(File.OpenRead(file), ContentEncoding.Default),
  105. //读取文件,只能用绝对路径
  106. ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
  107. ContentTransferEncoding = ContentEncoding.Base64,
  108. //文件名字
  109. FileName = Path.GetFileName(path)
  110. };
  111. alternative.Add(attachment);
  112. }
  113. }
  114. multipart.Add(alternative);
  115. //赋值邮件内容
  116. message.Body = multipart;
  117. //开始发送
  118. using var client = new SmtpClient();
  119. client.ServerCertificateValidationCallback = (s, c, h, e) => true;
  120. //client.CheckCertificateRevocation = false;
  121. client.Connect(mailOptions.Smtp, mailOptions.Port, mailOptions.UseSsl);
  122. //登录,发送
  123. //特别说明,对于服务器端的中文相应,Exception中有编码问题,显示乱码了
  124. client.Authenticate(System.Text.Encoding.UTF8, mailOptions.FromEmail, mailOptions.Password);
  125. try
  126. {
  127. var result = client.Send(message);
  128. //断开
  129. client.Disconnect(true);
  130. Console.WriteLine($"【{DateTime.Now}】发送邮件结果{result}");
  131. return result;
  132. }
  133. catch (Exception ex)
  134. {
  135. client.Disconnect(true);
  136. Log.WriteLine(ConsoleColor.Red, "发送邮件失败" + ex.Message);
  137. return "fail";
  138. }
  139. }
  140. }
  141. }