123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Extensions.DependencyInjection.Extensions;
- using Microsoft.Extensions.Logging;
- using Microsoft.Extensions.Options;
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- using System.Net;
- using System.Net.Mail;
- using System.Text;
- using System.Threading.Tasks;
- namespace TEAMModelOS.SDK.DI.Mail
- {
- public class MailFactory
- {
- private readonly ILogger _logger;
- private readonly IOptionsMonitor<MailOptions> _optionsMonitor;
- private ConcurrentDictionary<string, SmtpClient> smtpClients { get; } = new ConcurrentDictionary<string, SmtpClient>();
- public MailFactory(IOptionsMonitor<MailOptions> optionsMonitor, ILogger<MailFactory> logger)
- {
- if (optionsMonitor == null) throw new ArgumentNullException(nameof(optionsMonitor));
- _optionsMonitor = optionsMonitor;
- _logger = logger;
- }
- public SmtpClient GetSmtpClient(string name = "Default")
- {
- try
- {
- var cklient = smtpClients.GetOrAdd(name, x => new SmtpClient(_optionsMonitor.Get(name).smtp)
- {
- Credentials= new NetworkCredential(_optionsMonitor.Get(name).username, _optionsMonitor.Get(name).password),
- UseDefaultCredentials=false,
- EnableSsl=true
- });
- //955 是错误的。
- cklient.Port= _optionsMonitor.Get(name).port;
- return cklient;
- }
- catch (OptionsValidationException e)
- {
- _logger?.LogWarning(e, e.Message);
- throw;
- }
- }
- }
- public static class NetMailFactoryExtensions
- {
- public static IServiceCollection AddNetMail(this IServiceCollection services, MailOptions mailOptions, string name = "Default")
- {
- if (services == null) throw new ArgumentNullException(nameof(services));
- if (mailOptions == null) throw new ArgumentNullException(nameof(mailOptions));
- services.TryAddSingleton<MailFactory>();
- services.Configure<MailOptions>(name, o => {
- o.Name = name;
- o.fromMail=mailOptions.fromMail;
- o.port=mailOptions.port;
- o.smtp=mailOptions.smtp;
- o.username=mailOptions.username;
- o.password=mailOptions.password;
- });
- return services;
- }
- public static string SendEmail(this SmtpClient smtpClient, AzureRedisFactory coreRedisFactory, string subject, string content, string toMail,string tmdid,string tmdname ,string sender = "醍摩豆客服助手")
- {
- if (smtpClient!=null)
- {
- NetworkCredential networkCredential = (NetworkCredential)smtpClient.Credentials!;
- MailMessage mailMessage = new MailMessage(new MailAddress(networkCredential.UserName, sender), new MailAddress(toMail, $"{tmdname}({tmdid})"));
- mailMessage.Subject = subject;
- mailMessage.Body = content;
- mailMessage.IsBodyHtml = true;
- smtpClient.SendCompleted+=async (sender, e) =>
- {
- int result = 0;
- string userToken = $"{e.UserState}";
- if (e.Cancelled)
- {
- result=0;
- Console.WriteLine("Email sending was canceled.");
- }
- else if (e.Error != null)
- {
- result=1;
- Console.WriteLine("Error while sending email: " + e.Error.ToString());
- }
- else
- {
- result=2;
- Console.WriteLine("Email was sent successfully.");
- }
- await coreRedisFactory.GetRedisClient(8).StringSetAsync($"MailToken:{userToken}", result, expiry: new TimeSpan(0, 2, 0));
- };
- string token = Guid.NewGuid().ToString("N");
- smtpClient.SendAsync(mailMessage, token);
- return token;
- }
- else {
- return null;
- }
-
-
- }
- // 处理 SendCompleted 事件
- private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
- {
- if (e.Cancelled)
- {
- Console.WriteLine("Email sending was canceled.");
- }
- else if (e.Error != null)
- {
- Console.WriteLine("Error while sending email: " + e.Error.ToString());
- }
- else
- {
- Console.WriteLine("Email was sent successfully.");
- }
- }
- }
- public class MailOptions
- {
- public string? Name { get; set; }
- public string? fromMail { get; set; }
- public string? smtp { get; set; }
- public string? username { get; set; }
- public string? password { get; set; }
- public int port { get; set; }
- }
- }
|