HotmailEmailService.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 
  2. using MailKit.Net.Smtp;
  3. using MailKit.Security;
  4. using MimeKit;
  5. namespace OASystem.API.OAMethodLib.HotmailEmail
  6. {
  7. /// <summary>
  8. /// Hotemail 服务
  9. /// </summary>
  10. public class HotmailEmailService : IHotmailEmailService
  11. {
  12. private readonly IConfiguration _configuration;
  13. public HotmailEmailService(IConfiguration configuration)
  14. {
  15. _configuration = configuration;
  16. }
  17. public async Task<bool> SendEmailAsync(string toEmail, string subject, string htmlContent)
  18. {
  19. // 从配置读取信息
  20. var smtpServer = _configuration["HotEmailConfig:SmtpServer"];
  21. var smtpPort = int.Parse(_configuration["HotEmailConfig:SmtpPort"]);
  22. var senderEmail = _configuration["HotEmailConfig:SenderEmail"];
  23. var senderName = _configuration["HotEmailConfig:SenderName"];
  24. var appPassword = _configuration["HotEmailConfig:AppPassword"];
  25. // 移除应用密码中的所有 "-" 分隔符
  26. appPassword = appPassword?.Replace("-", "");
  27. // 验证配置必填项
  28. if (string.IsNullOrEmpty(smtpServer) || string.IsNullOrEmpty(senderEmail) || string.IsNullOrEmpty(appPassword))
  29. {
  30. Console.WriteLine("[Email Error]: 邮件配置不完整");
  31. return false;
  32. }
  33. var message = new MimeMessage();
  34. message.From.Add(new MailboxAddress(senderName, senderEmail));
  35. // 校验收件人邮箱格式,避免无效地址报错
  36. if (!MailboxAddress.TryParse(toEmail, out var recipient))
  37. {
  38. Console.WriteLine($"[Email Error]: 收件人邮箱格式错误 - {toEmail}");
  39. return false;
  40. }
  41. message.To.Add(recipient);
  42. message.Subject = subject;
  43. var bodyBuilder = new BodyBuilder { HtmlBody = htmlContent };
  44. message.Body = bodyBuilder.ToMessageBody();
  45. using var client = new SmtpClient();
  46. try
  47. {
  48. // 显式设置超时时间,避免连接超时
  49. client.Timeout = 30000; // 30秒超时
  50. // 连接服务器 (Hotmail/Outlook 必须使用 StartTls)
  51. await client.ConnectAsync(smtpServer, smtpPort, SecureSocketOptions.StartTls);
  52. // 身份验证
  53. await client.AuthenticateAsync(senderEmail, appPassword);
  54. // 执行发送
  55. await client.SendAsync(message);
  56. await client.DisconnectAsync(true);
  57. Console.WriteLine($"[Email Success]: 邮件已发送至 {toEmail}");
  58. return true;
  59. }
  60. catch (Exception ex)
  61. {
  62. // 打印完整异常链,定位真实错误
  63. var errorMsg = $"[Email Error]: {ex.Message}";
  64. var innerEx = ex.InnerException;
  65. while (innerEx != null)
  66. {
  67. errorMsg += $"\n[Inner Error]: {innerEx.Message}";
  68. innerEx = innerEx.InnerException;
  69. }
  70. Console.WriteLine(errorMsg);
  71. return false;
  72. }
  73. }
  74. }
  75. }