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);