ひとこと

― 今日のひとこと ―
気付けば前回更新してから2年以上経ってた
(2023.10.25)

2013年1月25日金曜日

Java ServletとAWS-SESでメール送信 No.2 -サーバプログラム作成-

前回作ったHTMLフォームに入力された内容をメール通知するプログラムを作る。


まずはとりあえずプログラムのサンプルを動かしてみよう。

1.Eclipseを起動し、AWS Java Projectを新規作成



2.プロジェクト名を入力し、AWS SDK for Java SamplesからSES JavaMail Sampleを選択し「完了」をクリック



3.生成されたプロジェクトにサンプルコードが入ってることを確認



4.サンプルコード中、メールアドレスを指定する部分を自分のアドレスに書き換える。

これを


こうする

この場合は自身のGmailアドレスから同じGmailアドレスにメールを送信することになる。


5.コードの変更を保存し、プログラムを実行する。

6.送信元に指定したメールアドレス宛に、Amazonからメールが届く。
その本文中のリンクをクリックするとアドレスが認証され、以降からメールが送信できるようになる。

7.もう一度プログラムを実行すると、指定した宛先アドレスにメールが届く。




このサンプルコードを基に、問い合わせフォームのサーバプログラム SES.java を作成した。

[事前準備]
○AWSアカウントのキーの値を確認する
AWSにサインアップし、「Security Credentials」をクリックする

セキュリティ証明書ページ中ほどの「アクセス証明書」>「アクセスキー」にある英数字がキーの値。

○必要なjarファイルを用意する
下記のファイルをプロジェクトの「WEB-INF」>「lib」フォルダにコピペする。
・aws-java-sdk-1.3.28.jar
・commons-codec-1.3.jar
・commons-logging-1.1.1.jar
・httpclient-4.1.1.jar
・httpcore-4.1.jar
・mail-1.4.3.jar
ちなみに全てaws-java-sdkのフォルダ内にあります。
それぞれのバージョンは多少違ってもいいんじゃないかな確認してないけど
コピペしたらEcliplseでプロジェクトのビルドパスに追加しましょう。

[プログラム]
package send;

import java.io.IOException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpleemail.AWSJavaMailTransport;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient;
import com.amazonaws.services.simpleemail.model.ListVerifiedEmailAddressesResult;
import com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest;

public class SES {

  // subject(件名),body(本文),to(宛先メールアドレス)を引数とするメール送信実行メソッド
    public static String send(String subject,String body,String to) {
     
     final String access_key= "AWSアカウントのACCESS_KEYの値";
     final String secret_key= "AWSアカウントのSECRET_KEYの値";
     
        final String SUBJECT = subject;      // 件名
        final String BODY = body;       // 本文
        final String TO = to;        // 宛先
        final String FROM = "xxxxxxx@gmail.com";     // 送信元

    // 実行結果メッセージ用の変数
     String message = "";
     
     AWSCredentials credentials = new BasicAWSCredentials(access_key,secret_key);
  AmazonSimpleEmailService ses = new AmazonSimpleEmailServiceClient(credentials);

        verifyEmailAddress(ses, FROM);  // 送信元認証
        //verifyEmailAddress(ses, TO);  // 宛先認証?

  Properties props = new Properties();
  props.setProperty("mail.transport.protocol", "aws");
        props.setProperty("mail.aws.user", access_key);
        props.setProperty("mail.aws.password", secret_key);

        Session session = Session.getInstance(props);
        try {
            Message msg = new MimeMessage(session);
             // 送信元設定
             msg.setFrom(new InternetAddress(FROM));
             // 宛先設定
             msg.addRecipient(Message.RecipientType.TO, new InternetAddress(TO));
             // メールタイトル設定
             msg.setSubject(SUBJECT);
             // メール本文設定
             msg.setText(BODY);
            msg.saveChanges();

            Transport t = new AWSJavaMailTransport(session, null);
            t.connect();
            t.sendMessage(msg, null);
            t.close();
            
            message = "送信が完了しました。";
            return message;
            
        }catch (AddressException ae) {
         message = "入力されたメールアドレスが正しくありません。";
         return message;
        }
         catch (Exception e) {
         message = "送信に失敗しました。";
         return message;
        }
    }

  // 以下は変更なし
    private static void verifyEmailAddress(AmazonSimpleEmailService ses, String address) {
        ListVerifiedEmailAddressesResult verifiedEmails = ses.listVerifiedEmailAddresses();
        if (verifiedEmails.getVerifiedEmailAddresses().contains(address)) return;

        ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(address));
        System.out.println("Please check the email address " + address + " to verify it");
        System.exit(0);
    }
}



今コード眺めてて思ったけどmessageのあたりもっとスマートにできるよな・・・精進しよう

新しい送信元を設定する度にAmazonから認証用メールくるのが嫌!!って場合は、
AWSでプロダクションアクセス権を申請すると認証ステップをスキップできて良いそうです。
僕は面倒だから申請してないけど。今回の場合、送信元は固定だしね


長くなったので最後のプログラムは次回。




0 件のコメント:

コメントを投稿