読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

javamailでGMailメールサーバを使う

Java

javamailでGMailへ送信しようとしたら一筋縄でいかなかったのですが、
最終的には以下の手順で落ち着いたというご報告。

javamailプロパティ

以下のプロパティを設定する必要があります。

mail.smtp.host=smtp.gmail.com
mail.smtp.port=465
mail.smtp.auth=true
mail.smtp.user=foo@gmail.com ←独自ドメインのGMailを使っている場合、gmail.comではなくそのドメインを指定
mail.smtp.password=*********
mail.smtp.starttls.enable=true
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback=false

コード

Transportのインスタンスを自前で構築して使う必要があります。Transport#sendは使っちゃダメ。

Transport trans = null;

try {
    trans = session.getTransport("smtps"); // ←コレ重要!!プロトコルはsmtps。

    // 手動で接続する必要アリ
    trans.connect(
        properties.getProperty("mail.smtp.host"),
        Integer.parseInt(properties.getProperty("mail.smtp.port")),
        properties.getProperty("mail.smtp.user"),
        properties.getProperty("mail.smtp.password"));

    trans.sendMessage(msg, msg.getAllRecipients());
} finally {
    if (trans != null) {
        trans.close();
    }
}

2013-01-10追記

Sessionを作るときにjavax.mail.Authenticatorを指定すれば、Transport#sendを使えます。
こんな感じ。

class PlainAuthenticator
    extends Authenticator {

    private final String user;
    private final String password;

    public PlainAuthenticator(final String user, final String password) {
        this.user = user;
        this.password = password;
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(this.user, this.password);
    }
}

// TLSでメールを送るための設定
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtps");
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
...

Session session = Session.getInstance(props, new PlainAuthenticator(user, password));

MimeMessage msg = new MimeMessage(session);
...

Transport.send(msg);