使用Java代码调用Amazon SES V2发送邮件报错求助
问题描述
尝试使用Amazon SES V2发送邮件失败,仅返回无详细异常信息的错误:
software.amazon.awssdk.core.internal.http.CombinedResponseHandler.handleErrorResponse(CombinedResponseHandler.java:125)
已参照AWS官方Java SES V2代码示例编写实现,尝试过使用邮箱身份和邮箱ARN身份发送,均无法成功。以下是相关代码及依赖配置:
核心代码
import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.amazonaws.services.sns.AmazonSNS; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sesv2.model.Body; import software.amazon.awssdk.services.sesv2.model.Content; import software.amazon.awssdk.services.sesv2.model.Destination; import software.amazon.awssdk.services.sesv2.model.EmailContent; import software.amazon.awssdk.services.sesv2.model.Message; import software.amazon.awssdk.services.sesv2.model.SendEmailRequest; import software.amazon.awssdk.services.sesv2.SesV2Client; import lombok.extern.slf4j.Slf4j; @Component @Slf4j public class EmailNotificationUtils { public Boolean sendSESEmailNotification(String sender, String recipient, String subject) { Region region = Region.US_EAST_2; SesV2Client sesv2Client = SesV2Client.builder().region(region).build(); // The HTML body of the email. String bodyHTML = "<html>" + "<head></head>" + "<body>" + "<h1>Hello!</h1>" + "<p> This is test eamil.</p>" + "</body>" + "</html>"; send(sesv2Client, sender, recipient, subject, bodyHTML); return true; } public static void send(SesV2Client client, String sender, String recipient, String subject, String bodyHTML) { Destination destination = Destination.builder().toAddresses(recipient).build(); Content content = Content.builder().data(bodyHTML).build(); Content sub = Content.builder().data(subject).build(); Body body = Body.builder().html(content).build(); Message msg = Message.builder().subject(sub).body(body).build(); EmailContent emailContent = EmailContent.builder().simple(msg).build(); log.info("sender {}", sender); log.info("destination {}", destination); log.info("emailContent {}", emailContent); SendEmailRequest emailRequest = SendEmailRequest.builder().destination(destination).content(emailContent) .fromEmailAddress(sender).build(); try { log.info("Attempting to send an email through Amazon SES \" + \"using the AWS SDK for Java.. {}", emailRequest.fromEmailAddressIdentityArn()); client.sendEmail(emailRequest); log.info("email was sent"); } catch (Exception e) { log.error("Exception occured while sending message with exception {}", e.getStackTrace()); } } }
依赖配置
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.17.288</version> <type>pom</type> <scope>runtime</scope> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sesv2</artifactId> <version>2.17.288</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sts</artifactId> <version>2.17.288</version> </dependency>
解决方法
- 修复异常日志输出:当前catch块仅打印堆栈数组,无法获取具体错误原因。修改catch代码,让日志框架输出完整异常信息:
catch (Exception e) { log.error("发送邮件失败", e); }
通过完整异常信息,可以定位到权限不足、身份未验证、区域不匹配等具体问题。
验证IAM权限:确保执行代码的IAM实体(用户/角色)拥有
ses:SendEmail或ses:SendRawEmail权限,策略中需指定对应的SES资源(可使用*或具体身份ARN)。确认发件人身份状态:
- 发件人邮箱/域名需在SES控制台完成验证,包括DKIM、SPF配置。
- 若处于SES沙箱模式,收件人也必须是已验证的邮箱,否则无法发送。
检查客户端初始化:
- 确认SesV2Client正确加载AWS凭证:本地运行需配置
~/.aws/credentials,云环境需关联正确的IAM角色。 - 确认指定区域
US_EAST_2与SES身份所在区域一致,SES身份为区域级资源,跨区域无法调用。
- 确认SesV2Client正确加载AWS凭证:本地运行需配置
校验请求参数:
- 使用ARN作为发件人身份时,需调用
fromEmailAddressIdentityArn()而非fromEmailAddress()设置参数。 - 检查收件人邮箱格式是否合法,避免无效地址。
- 确认邮件内容符合SES规范,无违规内容,HTML格式正确。
- 使用ARN作为发件人身份时,需调用
升级SDK版本:尝试将AWS SDK版本升级至最新稳定版,排除版本兼容性问题。
内容的提问来源于stack exchange,提问作者Raghuram KK
相关产品推荐
相关产品推荐

