使用Spring Boot应用程序通过AWS SES发送电子邮件
首先
因为我找不到有关在Spring Boot应用程序中使用AWS SES发送电子邮件的完整信息,所以我写下这句话。
假设以下情况
-
- AWS SES
メールは API で送る。SMTP ではなく。
本文などは日本語。MIME に変換して送る。
Spring Boot 2.6
Spring Cloud AWS 2.4
AWS EC2 または ECS 上で動く。認証情報は指定なくインスタンスプロファイルなどから得る
AWS ではないローカル環境では、認証情報は環境変数などで指定する
Gradle 7.3
Kotlin 1.6
Java 17
增加依赖
Spring Cloud AWS 2.3现在可用,其中一些名称和用法发生了变化。
现在最令人惊讶的变化是您需要包括一个单独的Spring Cloud AWS BOM。
在Gradle和Kotlin中,可以表示如下:
dependencyManagement {
imports {
mavenBom("io.awspring.cloud:spring-cloud-aws-dependencies:2.4.1")
}
}
这篇文章中提到了SES的话题,但是并没有找到入门者的内容。
SES支持已从上下文模块中提取到单独的spring-cloud-aws-ses模块中。还有一个专用的启动器:spring-cloud-aws-ses-starter。
无法找到io.awspring.cloud:spring-cloud-aws-ses-starter包。
我参考了https://reflectoring.io/spring-cloud-aws-ses/#adding-the-dependencies,并且在下一个步骤中成功实现了它。
implementation("io.awspring.cloud:spring-cloud-starter-aws-ses")
为了处理Spring的电子邮件,还将添加以下内容。
implementation("org.springframework.boot:spring-boot-starter-mail")
设定
在这里,我们使用Java (Kotlin)进行配置,而不是XML。
在Spring Integration(Mail)中处理邮件的接口JavaMailSender上实现Bean的定义展示最小配置。
@Configuration
class MailConfiguration {
@Bean
fun mailSender(): JavaMailSender {
return SimpleEmailServiceJavaMailSender(
AmazonSimpleEmailServiceClientBuilder.defaultClient()
)
}
}
在这个例子中,会自动确定认证信息和区域。具体来说,会按照环境变量和实例配置文件等几种方法依次尝试。
-
- デフォルトの認証情報プロバイダチェーン
- デフォルトリージョンプロバイダーチェーン
如果决定方法不符合要求,您可以使用AmazonSimpleEmailServiceClientBuilder进行自定义。
fun mailSender(): JavaMailSender {
return SimpleEmailServiceJavaMailSender(
AmazonSimpleEmailServiceClientBuilder.standard()
/* withCredentials, withRegion などをメソッドチェーンして
カスタマイズした実装のインスタンスなどを渡す */
.build()
)
}
发送电子邮件
通过依赖注入 Bean,可以发送电子邮件。
@Service
class HogeServiceImpl(
private val mailSender: JavaMailSender
): HogeService {
override fun notifyHoge() {
mailSender.send({ mimeMessage ->
val helper = MimeMessageHelper(mimeMessage)
helper.setFrom("noreply@example.com")
helper.setTo("anyone@example.com")
helper.setSubject("ほげについて")
helper.setText("ほげ申し上げます")
})
}
}
最后
在撰写时,我描述了从Spring Boot应用程序通过AWS SES发送电子邮件的情况以及配置的内容。
通过结合Spring Cloud、Spring Integration和AWS SDK,我们实现了一个小型的邮件发送功能。