web-dev-qa-db-ja.com

TLSでJavaMailを使用する

JavaMail APIとSMTPサーバーを介したメールの送信に関する他のいくつかの質問をSOで見つけましたが、TLSセキュリティの使用については説明しませんでした。仕事用のSMTPメールサーバーを使用していますが、TLSが必要であり、JavaMailを使用してTLS暗号化を必要とするSMTPサーバーにアクセスする方法の例をオンラインで見つけることができません。

46
dancavallaro

実際には、TLSを使用してメールが利用可能な場合にメールを送信する通知コードが製品にあります。

Javaメールのプロパティを設定する必要があります。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)などの他のセッションインスタンシエーターに渡すことができます。

61
Sarat

良い投稿、ライン

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

sMTPサーバーがGMail SMTPサーバーのようにSSL認証を使用する場合は必須です。ただし、サーバーがTLSを介したプレーンテキスト認証を使用する場合、Java Mailは初期接続がプレーンテキストであると文句を言うため、存在しないはずです。

また、最新バージョンのJava Mailを使用していることを確認してください。最近、以前のプロジェクトの古いJava Mail jarを使用し、コードを機能させることができませんでしたログインプロセスが失敗していたため。Java Mailの最新バージョンにアップグレードした後、エラーの理由が明らかになりました。これはjavax.net.ssl.SSLHandshakeExceptionでした。古いバージョンのlibではスローされません。

24
jasonsmith

上記の例の設定は、使用していたサーバーでは機能しませんでした( 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");
8
Brent Matzelle

次のコードを使用するだけです。 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="[email protected]";
            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("[email protected]"));
                 message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]"));
        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();
        }

    }

}
6
Renish Khunt

Simple Java Mail 5.0. (simplejavamail.org)を使用すると、非常に簡単で、ライブラリがすべてのSessionプロパティを処理します。

GoogleのSMTPサーバーを使用した例を次に示します。

Email email = EmailBuilder.startingBlank()
        .from("lollypop", "[email protected]")
        .to("C.Cane", "[email protected]")
        .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アカウントから アプリケーション固有のパスワード を生成する必要があります。

2
Benny Bottema