使用AWS SES v2 Java SDK模板发邮件遇问题:无报错却未收到
问题排查指引
- 模板内容与合规性检查:确认模板的HTML/文本部分没有触发垃圾邮件过滤规则,若使用联系列表功能必须包含符合要求的退订链接。同时验证
TEMPLATE_DATA是合法JSON格式,变量名与模板占位符完全匹配——空或格式错误的模板数据可能导致邮件被静默丢弃。 - 配置集与抑制列表验证:检查配置集是否开启了抑制列表功能,确认收件邮箱未被加入抑制列表。同时开启配置集的所有事件发布(发送、送达、退回、投诉),通过CloudWatch日志查看邮件的详细状态流转。
- 收件方邮箱与域名验证:提醒收件人检查垃圾邮件文件夹;确认发件身份的SPF/DKIM/DMARC记录已正确配置,错误的DNS记录会导致邮件被收件方域名拒收且不触发退回通知。
- 联系列表话题订阅检查:如果使用了
ListManagementOptions,必须确保目标邮箱已订阅指定话题——未订阅的邮箱会被SES自动过滤,控制台仍会统计为“已发送”但不会实际投递。
修正后的代码示例
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sesv2.SesV2Client; import software.amazon.awssdk.services.sesv2.model.*; public class SendTemplateEmail { private static final String CONFIGSET = "你的配置集名称"; private static final String FROM = "发件邮箱地址"; private static final String IDENTITYARN = "发件身份ARN"; private static final String TEMPLATE_DATA = "{\"siteName\":\"我的站点\", \"updateContent\":\"新增功能模块\"}"; // 替换为实际模板数据 private static final String CONTACT_LIST = "你的联系列表名称"; // 可选,按需启用 private static final String TOPIC_SITE_UPDATES = "站点更新话题"; // 可选,按需启用 public static void main(String[] args) { try (SesV2Client client = SesV2Client.builder() .region(Region.US_EAST_1) .build()) { // 调试用:确认模板可正常获取 GetEmailTemplateResponse templateResp = client.getEmailTemplate( GetEmailTemplateRequest.builder() .templateName("SiteUpdateTemplate") .build()); System.out.println("加载到的模板HTML: " + templateResp.template().htmlPart()); EmailContent emailContent = EmailContent.builder() .template(Template.builder() .templateName("SiteUpdateTemplate") .templateData(TEMPLATE_DATA) .build()) .build(); SendEmailRequest sendRequest = SendEmailRequest.builder() .configurationSetName(CONFIGSET) .fromEmailAddress(FROM) .fromEmailAddressIdentityArn(IDENTITYARN) .destination(Destination.builder() .toAddresses("test@gmail.com") .build()) .content(emailContent) // 仅当收件人已订阅该话题时启用,否则注释/删除此段 // .listManagementOptions(ListManagementOptions.builder() // .contactListName(CONTACT_LIST) // .topicName(TOPIC_SITE_UPDATES) // .build()) .build(); client.sendEmail(sendRequest); System.out.println("模板邮件请求已提交至SES"); } catch (Exception e) { System.err.println("发送失败: " + e.getMessage()); e.printStackTrace(); } } }
代码说明
- 移除了重复创建
Template对象的冗余代码,优化了构建逻辑。 - 注释了
ListManagementOptions部分,这是常见的静默失败诱因,若无需列表管理可直接删除该配置。 - 添加了模板加载的调试输出,便于确认模板内容是否正确获取。
内容的提问来源于stack exchange,提问作者After_Sunset
相关产品推荐
相关产品推荐

