JavaMail APIとSMTPサーバーを介したメールの送信に関して、SOに関する他のいくつかの質問を見つけましたが、TLSセキュリティの使用について説明したものはありませんでした。JavaMailを使用して仕事用のSMTPメールサーバーを介して自分自身にステータスの更新を送信しようとしていますが、TLSが必要であり、JavaMailを使用してTLS暗号化を必要とするSMTPサーバーにアクセスする方法の例をオンラインで見つけることができません。誰かがこれを手伝うことができますか?
7 に答える
私たちの製品には、利用可能な場合に TLS を使用してメールを送信する通知コードが実際にあります。
Java Mail プロパティを設定する必要があります。TLS のみが必要ですが、SMTP サーバーが SSL を使用している場合は SSL が必要になる場合があります。
Properties props = new Properties();
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.auth", "true"); // If you need to authenticate
// Use the following if you need SSL
props.put("mail.smtp.socketFactory.port", d_port);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
次に、これを JavaMail セッションまたは のような他のセッション インスタンス化子に渡すことができますSession.getDefaultInstance(props)
。
良い投稿、ライン
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
GMail SMTP サーバーのように、 SMTP サーバーがSSL 認証を使用する場合は必須です。ただし、サーバーがTLSを介したプレーンテキスト認証を使用している場合は、Java Mail が最初の接続がプレーンテキストであると文句を言うため、存在しないようにする必要があります。
また、Java Mail の最新バージョンを使用していることを確認してください。最近、以前のプロジェクトの古い Java Mail jar を使用しましたが、ログイン プロセスが失敗していたため、コードを機能させることができませんでした。Java Mail の最新バージョンにアップグレードした後、エラーの理由が明らかになりました。古いバージョンの lib ではスローされなかった javax.net.ssl.SSLHandshakeException でした。
上記の例の設定は、私が使用していたサーバー ( authsmtp.com ) では機能しませんでした。私はこのエラーを受け取り続けました:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
mail.smtp.socketFactory 設定を削除すると、すべてが機能しました。最終的な設定は次のとおりです (SMTP 認証は使用されず、別の場所にポートを設定しました):
java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.starttls.enable", "true");
次のコードを使用してください。Java 経由で電子メールを送信するのは非常に便利で、動作します。
import java.util.*;
import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.*;
import javax.mail.Provider;
import javax.mail.internet.*;
public class Main {
public static void main(String[] args) {
final String username="your@gmail.com";
final String password="password";
Properties prop=new Properties();
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.host", "smtp.gmail.com");
prop.put("mail.smtp.port", "587");
prop.put("mail.smtp.starttls.enable", "true");
Session session = Session.getDefaultInstance(prop,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
String body="Dear Renish Khunt Welcome";
String htmlBody = "<strong>This is an HTML Message</strong>";
String textBody = "This is a Text Message.";
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("your@gmail.com"));
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com"));
message.setSubject("Testing Subject");
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
message.setText(htmlBody);
message.setContent(textBody, "text/html");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
Simple Java Mail 5.0.0 ( simplejavamail.org ) では非常に簡単で、ライブラリがすべてのセッション プロパティを処理します。
Google の SMTP サーバーを使用した例を次に示します。
Email email = EmailBuilder.startingBlank()
.from("lollypop", "lol.pop@somemail.com")
.to("C.Cane", "candycane@candyshop.org")
.withSubject("hey")
.withPlainText("We should meet up!")
.withHTMLText("<b>We should meet up!</b>")
.buildEmail();
MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS)
.buildMailer()
.sendMail(email);
MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS)
.buildMailer()
.sendMail(email);
MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL)
.buildMailer()
.sendMail(email);
2 要素ログインがオンになっている場合は、Google アカウントからアプリケーション固有のパスワードを生成する必要があります。