HotmailEmailService.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using MailKit.Net.Smtp;
  2. using MailKit.Security;
  3. using MimeKit;
  4. using Microsoft.Extensions.Logging;
  5. using Microsoft.Extensions.Options;
  6. namespace OASystem.API.OAMethodLib.HotmailEmail
  7. {
  8. public class HotmailEmailService : IHotmailEmailService
  9. {
  10. private readonly IConfiguration _config;
  11. private readonly ILogger<HotmailEmailService> _logger;
  12. public HotmailEmailService(IConfiguration config, ILogger<HotmailEmailService> logger)
  13. {
  14. _config = config;
  15. _logger = logger;
  16. }
  17. public async Task<bool> SendEmailAsync(string toEmail, string subject, string htmlContent)
  18. {
  19. // 1. 配置前置校验
  20. string smtpServer = _config["HotEmailConfig:SmtpServer"] ?? string.Empty;
  21. int smtpPort = _config.GetValue<int>("HotEmailConfig:SmtpPort", 587);
  22. string appPassword = _config["HotEmailConfig:AppPassword"];
  23. string senderEmail = _config["HotEmailConfig:SenderEmail"];
  24. string senderName = _config["HotEmailConfig:SenderName"];
  25. if (string.IsNullOrEmpty(smtpServer) || string.IsNullOrEmpty(appPassword))
  26. {
  27. _logger.LogError("[Config Alchemy] 无法从 JSON 获取必要的邮件配置节点。");
  28. return false;
  29. }
  30. // 2. 构建邮件内容
  31. var message = new MimeMessage();
  32. message.From.Add(new MailboxAddress(senderName, senderEmail));
  33. if (!MailboxAddress.TryParse(toEmail, out var recipient))
  34. {
  35. _logger.LogWarning("[Email] 收件人地址非法: {ToEmail}", toEmail);
  36. return false;
  37. }
  38. message.To.Add(recipient);
  39. message.Subject = subject;
  40. var bodyBuilder = new BodyBuilder { HtmlBody = htmlContent };
  41. message.Body = bodyBuilder.ToMessageBody();
  42. // 3. 客户端连接与发送
  43. using var client = new SmtpClient();
  44. try
  45. {
  46. // Hotmail/Outlook 通常使用 587 + StartTls 或 465 + SslOnConnect
  47. var secureOption = smtpPort == 465
  48. ? SecureSocketOptions.SslOnConnect
  49. : SecureSocketOptions.StartTls;
  50. // 设置超时 (建议 30-60 秒)
  51. client.Timeout = 30000;
  52. await client.ConnectAsync(smtpServer, smtpPort, secureOption);
  53. await client.AuthenticateAsync(senderEmail, appPassword);
  54. await client.SendAsync(message);
  55. await client.DisconnectAsync(true);
  56. _logger.LogInformation("[Email] 成功发送至: {ToEmail}", toEmail);
  57. return true;
  58. }
  59. catch (Exception ex)
  60. {
  61. _logger.LogError(ex, "[Email] 发送失败,目标: {ToEmail}", toEmail);
  62. return false;
  63. }
  64. }
  65. }
  66. }