Frage

fand ich einige andere Fragen auf SO in Bezug auf die Java Mail API und E-Mails über einen SMTP-Server zu senden, aber keiner von ihnen diskutiert TLS Sicherheit. Ich versuche, Java Mail zu verwenden, Status-Updates zu mir durch meine Arbeit SMTP-Mail-Server zu senden, aber es erfordert TLS, und ich kann keine Beispiele finden Online, wie Javamail verwenden, um einen SMTP-Server zuzugreifen, die TLS-Verschlüsselung erfordert. Kann mir jemand dabei helfen?

War es hilfreich?

Lösung

Wir tatsächlich einigen Benachrichtigungscode in unserem Produkt haben, das TLS verwendet Mail zu senden, wenn es verfügbar ist.

Sie müssen die Java-Mail-Eigenschaften einzustellen. Sie müssen nur die TLS ein, aber Sie könnten SSL benötigen, 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 dann entweder übergeben diese an eine Java Mail-Sitzung oder einer anderen Sitzung instantiator wie Session.getDefaultInstance(props).

Andere Tipps

Gute Post, die Zeile

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

ist obligatorisch, wenn der SMTP-Server verwendet SSL-Authentifizierung , wie der GMail SMTP-Server der Fall ist. Allerdings, wenn der Server verwendet Text-Authentifizierung über TLS , sollte es nicht vorhanden sein, da Java Mail über die anfängliche Verbindung ist Klartext beschweren.

Auch stellen Sie sicher, dass Sie die neueste Version von Java Post verwenden. Vor kurzem habe ich ein paar alten Java Mail-Gläser aus einem früheren Projekt und den Code nicht Arbeit machen konnte, weil der Login-Prozess versagt wurde. Nachdem ich auf die neueste Version von Java Post aktualisiert haben, wurde der Grund des Fehlers klar:. Es war ein javax.net.ssl.SSLHandshakeException, die in der alten Version des lib nicht geworfen wurde,

Die Einstellungen aus dem obigen Beispiel nicht für den Server nicht funktionieren Ich war mit ( authsmtp.com ) . Ich hielt diesen Fehler auf immer:

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

Ich entfernte die mail.smtp.socketFactory Einstellungen und alles funktioniert. Die endgültigen Einstellungen wurden diese (SMTP-Auth nicht verwendet wurde und ich den Anschluss an anderer Stelle):

java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.starttls.enable", "true");

Sie einfach den folgenden Code verwenden. Es ist wirklich nützlich E-Mail über Java zu schicken, 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="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();
        }

    }

}

Mit Einfachen Java Mail-5.0.0 (simplejavamail.org) es ist sehr einfach und die Bibliothek kümmern alle Session-Eigenschaften für Sie.

Hier ist ein Beispiel mit Googles SMTP-Server:

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

Wenn Sie Zwei-Faktor-Login aktiviert haben, müssen Sie ein anwendungsspezifisches Passwort generieren von Ihrem Google-Konto.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top