.NET 6应用部署Azure App Service后调用AWS SES发件失败求助
解决思路
排查AWS侧的访问与错误日志
- 登录AWS控制台,查看CloudWatch中SES的发送日志,确认是否有来自Azure App Service的请求记录。如果没有,说明请求未到达AWS;如果有,查看日志中的错误详情(可能代码未捕获到AWS返回的错误)。
- 检查CloudTrail中的API调用记录,确认
SendEmail或SendRawEmail操作是否被触发,以及对应的返回状态码。
增强代码的错误捕获与日志输出
- 在发送邮件的代码块中添加完整的try-catch逻辑,捕获所有异常(包括
AggregateException),并将异常详情写入Azure App Service日志:try { var response = await client.SendEmailAsync(request); _logger.LogInformation($"邮件发送成功,MessageId: {response.MessageId}"); } catch (Exception ex) { _logger.LogError(ex, "邮件发送失败"); } - 在
appsettings.json中开启AWS SDK的Debug级日志,便于排查SDK内部的请求细节:"Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", "Amazon": "Debug" } } - 通过Azure门户的「日志流」或Kudu工具查看详细日志,定位具体问题。
- 在发送邮件的代码块中添加完整的try-catch逻辑,捕获所有异常(包括
验证Azure App Service的网络连通性
- 使用Kudu工具(
https://<你的应用名>.scm.azurewebsites.net/)打开PowerShell终端,执行命令测试与SES端点的连通性:# 测试SMTP端口(465/587) Test-NetConnection email-smtp.<你的SES区域>.amazonaws.com -Port 465 # 测试API端口(443) Test-NetConnection ses.<你的SES区域>.amazonaws.com -Port 443 - 如果连通失败,检查Azure App Service的出站网络规则:基础计划是否存在端口封锁,或是否需要添加出站安全规则允许访问AWS SES的IP段。
- 使用Kudu工具(
确认凭证与环境变量配置
- 检查Azure App Service的「应用程序设置」中是否存在
AWS_ACCESS_KEY_ID或AWS_SECRET_ACCESS_KEY环境变量,若有且与预期不符,删除或修改为正确值(AWS SDK会优先读取环境变量,可能覆盖硬编码的凭证)。 - 确保代码中明确指定SES凭证,避免SDK自动加载错误的凭证源:
var credentials = new Amazon.Runtime.BasicAWSCredentials("你的AccessKey", "你的SecretKey"); var sesClient = new Amazon.SimpleEmail.AmazonSimpleEmailServiceClient(credentials, Amazon.RegionEndpoint.<你的SES区域>);
- 检查Azure App Service的「应用程序设置」中是否存在
检查AWS SES账号状态
- 确认SES账号是否处于沙箱模式:沙箱模式下仅允许向已验证的收件人发送邮件,若部署后发送至未验证邮箱,会静默失败(无明显报错)。
- 查看SES控制台的「发送统计」与「投诉/退信率」,确认账号是否因合规问题被限制发送。
排查Azure基础计划的特殊限制
- 查阅Azure App Service基础计划的文档,确认是否存在出站网络或服务访问限制,例如部分区域的基础计划可能默认限制某些外部服务的访问。
内容的提问来源于stack exchange,提问作者Aws rayyan
相关产品推荐
相关产品推荐

