Scala AWS SESを使用してメール送信を行う

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

AWS Java SDK v2 を使用して、ScalaからAmazon SES( Simple Emai Service )を利用してメール送信を行います。

こちらのページにマルチパートのメールの送信方法も含めて詳細に記述されています。

AWS SDK を使用したメールの送信 - Amazon Simple Email Service


クラスメソッドさんのこの記事は、多分v1のAWS Java SDKかな。

AWS SDK for Javaを使う#Amazon SES | Developers.IO


依存ライブラリ

libraryDependencies += "software.amazon.awssdk" % "aws-sdk-java" % "2.13.27"
libraryDependencies += "javax.mail" % "mail" % "1.4.1"


メール送信を行うコード

下記は簡単な本文で、単一宛先に対してメール送信を行うサンプルコード。

SES SDKに渡すメール電文が、SdkBytesという特殊な型っぽいので、Javaプリミティブのbyte型に変換する必要がある。

import javax.mail.Session
import javax.mail.internet.MimeMessage
import javax.mail.Message
import javax.mail.internet.InternetAddress
import software.amazon.awssdk.core.SdkBytes
import java.io.ByteArrayOutputStream
import java.nio.ByteBuffer
import java.util.Properties
import software.amazon.awssdk.services.ses.SesClient
import software.amazon.awssdk.services.ses.model.{RawMessage, SendRawEmailRequest}
import software.amazon.awssdk.auth.credentials.{AwsBasicCredentials, StaticCredentialsProvider}

def sendMailFromAwsSES() = {
  val accessKey = "YOUR_ACCESS_KEY"
  val secretKey = "YOUR_SECRET_KEY"
  val sesClient = SesClient.builder().region(Region.[YOUR_SES_RESION]).credentialsProvider(
    StaticCredentialsProvider.create(
      AwsBasicCredentials.create(accessKey, secretKey)
    )
  ).build()

  val session = Session.getDefaultInstance(new Properties())
  val message = new MimeMessage(session)
  //メールSubject
  message.setSubject("こんにちは!", "UTF-8")
  //Fromアドレス SESで確認済みのメールアドレスを指定する
  message.setFrom(new InternetAddress("your_verified@domain"))
  //宛先 SESがSandboxの場合は確認済みのメールアドレスでないと弾かれる
  message.setRecipient(Message.RecipientType.TO, new InternetAddress("toAddress@domain"))
  //メール本文
  message.setText("本文です", "UTF-8")
  val outputStream = new ByteArrayOutputStream()
  message.writeTo(outputStream)
  val buf = ByteBuffer.wrap(outputStream.toByteArray)
  val arr = new Array[Byte](buf.remaining)
  buf.get(arr)
  val data = SdkBytes.fromByteArray(arr)
  //SES用のメールメッセージの作成
  val rawMessage = RawMessage.builder.data(data).build
  //リクエストペイロードの作成
  val rawEmailRequest = SendRawEmailRequest.builder.rawMessage(rawMessage).build
  //SESへメールの送信依頼
  sesClient.sendRawEmail(rawEmailRequest)
}