MailFactory.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.Extensions.DependencyInjection.Extensions;
  3. using Microsoft.Extensions.Logging;
  4. using Microsoft.Extensions.Options;
  5. using System;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.ComponentModel;
  9. using System.Linq;
  10. using System.Net;
  11. using System.Net.Mail;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using TEAMModelOS.SDK.Models;
  15. namespace TEAMModelOS.SDK.DI.Mail
  16. {
  17. public class MailFactory
  18. {
  19. private readonly ILogger _logger;
  20. private readonly IOptionsMonitor<MailOptions> _optionsMonitor;
  21. private ConcurrentDictionary<string, SmtpClient> smtpClients { get; } = new ConcurrentDictionary<string, SmtpClient>();
  22. public MailFactory(IOptionsMonitor<MailOptions> optionsMonitor, ILogger<MailFactory> logger)
  23. {
  24. if (optionsMonitor == null) throw new ArgumentNullException(nameof(optionsMonitor));
  25. _optionsMonitor = optionsMonitor;
  26. _logger = logger;
  27. }
  28. public SmtpClient GetSmtpClient(string name = "Default")
  29. {
  30. try
  31. {
  32. var cklient = smtpClients.GetOrAdd(name, x => new SmtpClient(_optionsMonitor.Get(name).smtp)
  33. {
  34. Credentials= new NetworkCredential(_optionsMonitor.Get(name).username, _optionsMonitor.Get(name).password),
  35. UseDefaultCredentials=false,
  36. EnableSsl=true
  37. });
  38. //955 是错误的。
  39. cklient.Port= _optionsMonitor.Get(name).port;
  40. return cklient;
  41. }
  42. catch (OptionsValidationException e)
  43. {
  44. _logger?.LogWarning(e, e.Message);
  45. throw;
  46. }
  47. }
  48. }
  49. public static class NetMailFactoryExtensions
  50. {
  51. public static IServiceCollection AddNetMail(this IServiceCollection services, MailOptions mailOptions, string name = "Default")
  52. {
  53. if (services == null) throw new ArgumentNullException(nameof(services));
  54. if (mailOptions == null) throw new ArgumentNullException(nameof(mailOptions));
  55. services.TryAddSingleton<MailFactory>();
  56. services.Configure<MailOptions>(name, o => {
  57. o.Name = name;
  58. o.fromMail=mailOptions.fromMail;
  59. o.port=mailOptions.port;
  60. o.smtp=mailOptions.smtp;
  61. o.username=mailOptions.username;
  62. o.password=mailOptions.password;
  63. });
  64. return services;
  65. }
  66. public static string SendEmail(this SmtpClient smtpClient, AzureCosmosFactory azureCosmos,DingDing dingDing , TMDOrder order, string subject, string content, string toMail,string tmdid,string tmdname ,string sender = "醍摩豆客服助手")
  67. {
  68. if (smtpClient!=null)
  69. {
  70. NetworkCredential networkCredential = (NetworkCredential)smtpClient.Credentials!;
  71. MailMessage mailMessage = new MailMessage(new MailAddress(networkCredential.UserName, sender), new MailAddress(toMail, $"{tmdname}({tmdid})"));
  72. mailMessage.Subject = subject;
  73. mailMessage.Body = content;
  74. mailMessage.IsBodyHtml = true;
  75. smtpClient.SendCompleted+=async (sender, e) =>
  76. {
  77. int result = -1;
  78. string userToken = $"{e.UserState}";
  79. if (e.Cancelled)
  80. {
  81. result=0;
  82. //Console.WriteLine("Email sending was canceled.");
  83. }
  84. else if (e.Error != null)
  85. {
  86. result=2;
  87. //Console.WriteLine("Error while sending email: " + e.Error.ToString());
  88. }
  89. else
  90. {
  91. result=3;
  92. //Console.WriteLine("Email was sent successfully.");
  93. }
  94. try
  95. {
  96. TMDOrder order = await azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<TMDOrder>(userToken, new Azure.Cosmos.PartitionKey("TMDOrder"));
  97. order.invoiceNotify=result;
  98. await azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReplaceItemAsync<TMDOrder>(order, userToken, new Azure.Cosmos.PartitionKey("TMDOrder"));
  99. }
  100. catch(Exception ex)
  101. {
  102. await dingDing.SendBotMsg($"邮箱发送异常,订单ID:{userToken}\n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
  103. }
  104. };
  105. string token =$"{order.order_no}";
  106. smtpClient.SendAsync(mailMessage, token);
  107. return token;
  108. }
  109. else {
  110. return null;
  111. }
  112. }
  113. // 处理 SendCompleted 事件
  114. private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
  115. {
  116. if (e.Cancelled)
  117. {
  118. Console.WriteLine("Email sending was canceled.");
  119. }
  120. else if (e.Error != null)
  121. {
  122. Console.WriteLine("Error while sending email: " + e.Error.ToString());
  123. }
  124. else
  125. {
  126. Console.WriteLine("Email was sent successfully.");
  127. }
  128. }
  129. }
  130. public class MailOptions
  131. {
  132. public string? Name { get; set; }
  133. public string? fromMail { get; set; }
  134. public string? smtp { get; set; }
  135. public string? username { get; set; }
  136. public string? password { get; set; }
  137. public int port { get; set; }
  138. }
  139. }