Javamail と TLS (STARTTLS ではなく、SSL/TLS 専用の smtp ポート!) を使用してメールを送信する必要があります。gmailの例を見つけることができましたが、STARTTLSを使用しています。誰かが通常の SSL/TLS の例を投稿できますか? どうもありがとうございました!
2 に答える
Gmail での JavaMailの公式の例では、STARTTLS ではなく SMTPS (つまり、専用ポートでの SMTP over SSL/TLS) を使用しています。基本的に、JavaMail を使用するプロパティmail.smtps.*
はmail.smtp.*
.
SSL/TLS の特定のバージョン (TLSv1.0 など) を強制したい場合は、独自の を作成しSSLSocketFactory
、おそらくデフォルトSSLSocketFactory
(またはカスタマイズしたもの) をラップする必要がありますが、sslSocket.setEnabledProtocols(new String[] { "TLSv1" })
返す前に呼び出す必要があります。ソケット。
構成プロパティSSLSocketFactory
を介してインスタンスとして渡すか、完全修飾クラス名として渡す必要があります(この場合、クラスは と呼ばれる静的メソッドを実装する必要があります)。mail.smtps.ssl.socketFactory
mail.smtps.ssl.socketFactory.class
getDefault
mail.smtps.ssl.checkserveridentity
MITM 攻撃を防ぐには、クライアントにサーバーのホスト名を確認させる必要もありtrue
ますfalse
。
記録のために、ブルーノスの回答に基づいて:
private static void sendMailSSL(String host, int port, String user, String pass, String to, String from, String subj, String message) throws UnsupportedEncodingException, MessagingException
{
Properties props = System.getProperties();
props.put("mail.smtps.ssl.checkserveridentity", true);
Session session = Session.getDefaultInstance(props, null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from, from));
msg.addRecipients(RecipientType.TO, to);
msg.setSubject(subj);
msg.setText(message);
Transport t = session.getTransport("smtps");
try {
t.connect(host, port, user, pass);
t.sendMessage(msg, msg.getAllRecipients());
} finally {
t.close();
}
}
checkserveridentity が実際に考慮されているかどうかはテストしていないことに注意してください。少なくとも実際にはSSLを使用しています:-)