Amazon AWSのSESでメール送信する方法(Java編)

java

Amazon AWSのSESとは、Simple Email Serviceの略です。メール配信するためのサービスです。
SESの説明については、本家を確認して下さい。

SESを使うことで、メールサーバで自前で構築する必要がなくなり、手間が省けます。
AWSを使うのであれば、メール配信は、SESを使うことをおすすめします。
今回は、javaプログラム内から、SESでメール配信する方法を紹介します。

[スポンサーリンク]

この章でやること

Amazon AWS SDKを使って、SESでメール送信する方法を紹介します。

aws-java-sdkの設定

Mavenを使っている方はこちらをpom.xmlに追加してください。
今回は、javax.mailも追加する必要があります。

<dependency>
	<groupId>com.amazonaws</groupId>
	<artifactId>aws-java-sdk</artifactId>
	<version>1.4.6</version>
</dependency>
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4</version>
</dependency>

SESでメール送信するプログラム

AWS SDKに梱包されているサンプルプログラムAWSJavaMailSample.javaをベースにしています。
サンプルプログラムの読み方はこちらを参照して下さい。

    private static final String FROM = "from@test.com";
    private static final String TO = "to@test.com";
    private static final String CC = "cc@test.com";
    private static final String BODY = "mail body";
    private static final String SUBJECT = "subject";

    private static final String accessKey = "AccessKey";
    private static final String secretKey = "SecretKey";

    public static void main(String[] args) throws IOException, MessagingException {

        AWSCredentials credentials = new BasicAWSCredentials(accessKey,secretKey);
		AmazonSimpleEmailService ses = new AmazonSimpleEmailServiceClient(credentials);

        verifyEmailAddress(ses, FROM);
        verifyEmailAddress(ses, TO);
        verifyEmailAddress(ses, CC);


	Properties props = new Properties();
	props.setProperty("mail.transport.protocol", "aws");
        props.setProperty("mail.aws.user", credentials.getAWSAccessKeyId());
        props.setProperty("mail.aws.password", credentials.getAWSSecretKey());

        Session session = Session.getInstance(props);

        // Create a new Message
        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(FROM));
        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(TO));
        msg.addRecipient(Message.RecipientType.CC, new InternetAddress(CC));
        msg.setSubject(SUBJECT);
        msg.setText(BODY);
        msg.saveChanges();

        Transport t = new AWSJavaMailTransport(session, null);
        try {
            t.connect();
            t.sendMessage(msg, null);
        } finally {
        	t.close();
        }
    }

    private static void verifyEmailAddress(AmazonSimpleEmailService ses, String address) {
        ListVerifiedEmailAddressesResult verifiedEmails = ses.listVerifiedEmailAddresses();
        if (verifiedEmails.getVerifiedEmailAddresses().contains(address)) return;

        ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(address));
    }

解説

12~13行目で、アクセスキーとシークレットキーを設定しています。
15~17行目で、メールアドレスが認証済みであるかを確認しています。もし認証済みでない場合は、SESが確認メールを送信するので、メール内のリンクをクリックする必要があります。
29~33行目で、メールアドレス、件名、本文を設定します。

最後に

45行目のverifyEmailAddressメソッドの解釈が少し難しいと思います。

SESの仕様で、認証済みのメールアドレスのみが配信出来る仕様になっているようです。
認証されていないメールアドレスは、このメール送信プログラムでメール送信すると、SESから認証確認メールが送信されます。
その認証確認メール内のリンクをクリックすることが認証済みとなって、次回以降メール送信が可能となるようです。

SESを使うことで、メールサーバで自前で構築する必要がなくなります。
これは手間が省けてgoodですね。
AWSでメール送信する際は、SESを積極的に使いましょう!
それでは!