|
|
@@ -26,9 +26,27 @@ namespace OASystem.API.OAMethodLib.HotmailEmail
|
|
|
var senderName = _configuration["HotEmailConfig:SenderName"];
|
|
|
var appPassword = _configuration["HotEmailConfig:AppPassword"];
|
|
|
|
|
|
+ // 移除应用密码中的所有 "-" 分隔符
|
|
|
+ appPassword = appPassword?.Replace("-", "");
|
|
|
+
|
|
|
+ // 验证配置必填项
|
|
|
+ if (string.IsNullOrEmpty(smtpServer) || string.IsNullOrEmpty(senderEmail) || string.IsNullOrEmpty(appPassword))
|
|
|
+ {
|
|
|
+ Console.WriteLine("[Email Error]: 邮件配置不完整");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
var message = new MimeMessage();
|
|
|
message.From.Add(new MailboxAddress(senderName, senderEmail));
|
|
|
- message.To.Add(new MailboxAddress("", toEmail));
|
|
|
+
|
|
|
+ // 校验收件人邮箱格式,避免无效地址报错
|
|
|
+ if (!MailboxAddress.TryParse(toEmail, out var recipient))
|
|
|
+ {
|
|
|
+ Console.WriteLine($"[Email Error]: 收件人邮箱格式错误 - {toEmail}");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ message.To.Add(recipient);
|
|
|
+
|
|
|
message.Subject = subject;
|
|
|
|
|
|
var bodyBuilder = new BodyBuilder { HtmlBody = htmlContent };
|
|
|
@@ -37,6 +55,9 @@ namespace OASystem.API.OAMethodLib.HotmailEmail
|
|
|
using var client = new SmtpClient();
|
|
|
try
|
|
|
{
|
|
|
+ // 显式设置超时时间,避免连接超时
|
|
|
+ client.Timeout = 30000; // 30秒超时
|
|
|
+
|
|
|
// 连接服务器 (Hotmail/Outlook 必须使用 StartTls)
|
|
|
await client.ConnectAsync(smtpServer, smtpPort, SecureSocketOptions.StartTls);
|
|
|
|
|
|
@@ -47,12 +68,20 @@ namespace OASystem.API.OAMethodLib.HotmailEmail
|
|
|
await client.SendAsync(message);
|
|
|
await client.DisconnectAsync(true);
|
|
|
|
|
|
+ Console.WriteLine($"[Email Success]: 邮件已发送至 {toEmail}");
|
|
|
return true;
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- // 这里可以记录到你的 OASystem 日志库
|
|
|
- Console.WriteLine($"[Email Error]: {ex.Message}");
|
|
|
+ // 打印完整异常链,定位真实错误
|
|
|
+ var errorMsg = $"[Email Error]: {ex.Message}";
|
|
|
+ var innerEx = ex.InnerException;
|
|
|
+ while (innerEx != null)
|
|
|
+ {
|
|
|
+ errorMsg += $"\n[Inner Error]: {innerEx.Message}";
|
|
|
+ innerEx = innerEx.InnerException;
|
|
|
+ }
|
|
|
+ Console.WriteLine(errorMsg);
|
|
|
return false;
|
|
|
}
|
|
|
}
|