如何将AWS SES验证邮件的链接替换为用户友好的按钮?
解决AWS SES自定义验证邮件链接转按钮的问题
核心原理
AWS SES自定义验证模板支持用{{VerifyLink}}变量自动注入验证链接,你只需要在HTML模板里把这个变量嵌入按钮的跳转属性中,再用内联CSS美化按钮即可——因为邮件客户端对外部CSS兼容性差,优先用内联样式。
步骤1:编写带按钮的HTML验证模板
直接将{{VerifyLink}}放到按钮的href属性里,示例代码如下:
<html> <body style="font-family: Arial, sans-serif; padding: 20px;"> <h3>请验证你的邮箱</h3> <p>点击下方按钮完成邮箱验证:</p> <a href="{{VerifyLink}}" style="display: inline-block; padding: 12px 24px; background-color: #2563eb; color: white; text-decoration: none; border-radius: 4px; font-size: 16px;"> 验证邮箱 </a> <p>如果按钮无法点击,你也可以复制下方链接到浏览器打开:</p> <p>{{VerifyLink}}</p> </body> </html>
同时要准备纯文本版本(适配不支持HTML的邮件客户端):
请验证你的邮箱 点击链接完成验证:{{VerifyLink}} 如果链接无法点击,请复制到浏览器打开。
步骤2:用Java Spring Boot创建自定义验证模板
使用AWS SES Java SDK v2的SesClient创建模板,示例代码:
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.ses.SesClient; import software.amazon.awssdk.services.ses.model.CreateCustomVerificationEmailTemplateRequest; import software.amazon.awssdk.services.ses.model.SesException; @Component public class SesTemplateService { private final SesClient sesClient; // 构造函数注入SesClient,Spring Boot会自动配置(前提是已配置AWS凭证) public SesTemplateService(SesClient sesClient) { this.sesClient = sesClient; } public void createVerificationTemplate() { try { CreateCustomVerificationEmailTemplateRequest request = CreateCustomVerificationEmailTemplateRequest.builder() .templateName("UserEmailVerificationTemplate") // 自定义模板名称 .fromEmailAddress("noreply@your-verified-domain.com") // 已验证的发件邮箱/域名 .templateSubject("请验证你的邮箱") .templateHtml("<html>...</html>") // 替换成步骤1的HTML内容 .templateText("请验证你的邮箱...") // 替换成步骤1的纯文本内容 .build(); sesClient.createCustomVerificationEmailTemplate(request); System.out.println("自定义验证模板创建成功"); } catch (SesException e) { System.err.println(e.awsErrorDetails().errorMessage()); throw new RuntimeException("创建模板失败", e); } } }
注意:fromEmailAddress必须是你已经在SES中验证过的邮箱或域名下的地址,否则会报错。
步骤3:触发自定义验证邮件
当用户提交邮箱后,调用SES接口发送自定义验证邮件,示例代码:
import software.amazon.awssdk.services.ses.model.SendCustomVerificationEmailRequest; @Service public class EmailVerificationService { private final SesClient sesClient; public EmailVerificationService(SesClient sesClient) { this.sesClient = sesClient; } public void sendVerificationEmail(String userEmail) { try { SendCustomVerificationEmailRequest request = SendCustomVerificationEmailRequest.builder() .emailAddress(userEmail) .templateName("UserEmailVerificationTemplate") // 对应步骤2创建的模板名称 .build(); sesClient.sendCustomVerificationEmail(request); System.out.println("验证邮件已发送至:" + userEmail); } catch (SesException e) { System.err.println(e.awsErrorDetails().errorMessage()); throw new RuntimeException("发送验证邮件失败", e); } } }
关键注意事项
- 内联CSS优先:邮件客户端(比如Outlook)对外部样式表支持很差,所有按钮样式都要写在
style属性里。 - 模板变量正确:必须用
{{VerifyLink}},SES会自动替换成实际验证链接,不要手动拼接链接。 - 验证发件身份:发件邮箱/域名必须提前在SES控制台或通过SDK验证,否则无法发送邮件。
- 测试兼容性:发送测试邮件到不同邮箱客户端(Gmail、Outlook、QQ邮箱),确保按钮显示正常、链接可点击。
内容的提问来源于stack exchange,提问作者BlazinglyFast
相关产品推荐
相关产品推荐

