it-swarm.com.de

JavaMail mit TLS verwenden

Ich habe mehrere andere Fragen zu SO bezüglich der JavaMail-API und des Versendens von E-Mails über einen SMTP-Server gefunden, aber keine davon wurde mit TLS-Sicherheit erörtert. Ich versuche, JavaMail zu verwenden, um Statusaktualisierungen an mich selbst zu senden Über meinen SMTP-Mailserver, der jedoch TLS erfordert, und ich kann online keine Beispiele dafür finden, wie ich mit JavaMail auf einen SMTP-Server zugreifen kann, für den TLS-Verschlüsselung erforderlich ist.

46
dancavallaro

Wir haben tatsächlich einen Benachrichtigungscode in unserem Produkt, der TLS zum Senden von E-Mails verwendet, sofern dieser verfügbar ist.

Sie müssen die Java Mail-Eigenschaften festlegen. Sie benötigen nur die TLS, benötigen jedoch möglicherweise SSL, wenn Ihr SMTP-Server SSL verwendet.

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

Sie können dies dann entweder an eine JavaMail-Sitzung oder einen anderen Sitzungs-Instantiator wie Session.getDefaultInstance(props) übergeben.

61
Sarat

Gute Post, die Linie

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

ist obligatorisch, wenn der SMTP-Server SSL-Authentifizierung verwendet, wie dies beim GMail-SMTP-Server der Fall ist. Wenn der Server jedoch Nur-Text-Authentifizierung über TLS verwendet, sollte er nicht vorhanden sein, da Java Mail beschwert sich, dass die ursprüngliche Verbindung nur aus Nur-Text besteht.

Stellen Sie außerdem sicher, dass Sie die neueste Version von Java Mail verwenden. Kürzlich habe ich einige alte Java Mail-Gläser aus einem früheren Projekt verwendet und konnte den Code nicht zum Laufen bringen Nachdem ich auf die neueste Version von Java Mail aktualisiert habe, wurde der Grund für den Fehler klar: Es handelte sich um eine javax.net.ssl.SSLHandshakeException nicht in der alten Version der lib geworfen.

24
jasonsmith

Die Einstellungen aus dem obigen Beispiel funktionierten nicht für den von mir verwendeten Server ( authsmtp.com ). Ich bekam immer wieder diesen Fehler:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Ich habe die mail.smtp.socketFactory-Einstellungen entfernt und alles hat funktioniert. Die endgültigen Einstellungen lauteten wie folgt (SMTP-Authentifizierung wurde nicht verwendet und ich habe den Port an einer anderen Stelle festgelegt):

Java.util.Properties props = new Java.util.Properties();
props.put("mail.smtp.starttls.enable", "true");
8
Brent Matzelle

Verwenden Sie einfach den folgenden Code. Es ist sehr nützlich, E-Mails über Java zu senden, und es funktioniert:

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

Mit Simple Java Mail 5.0. (simplejavamail.org) ist es sehr einfach und die Bibliothek kümmert sich für Sie um alle Sitzungseigenschaften.

Hier ist ein Beispiel für die Verwendung der SMTP-Server von Google:

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

Wenn Sie die Zwei-Faktor-Anmeldung aktiviert haben, müssen Sie aus Ihrem Google-Konto ein anwendungsspezifisches Passwort generieren.

2
Benny Bottema