wake-up-neo.net

JavaMail-SMTP-Eigenschaften (für STARTTLS)

JavaMail gibt eine Reihe von Eigenschaften an, die zum Konfigurieren einer SMTP-Verbindung festgelegt werden können. Um STARTTLS verwenden zu können, müssen Sie die folgende Eigenschaft festlegen

mail.smtp.starttls.enable=true

Wo gebe ich den Benutzernamen/das Passwort an, um den SMTP-Dienst zu verwenden? Reicht es aus zu spezifizieren:

mail.smtp.user=me
mail.smtp.password=secret

Oder muss ich mich explizit anmelden mit:

transport.connect(server, userName, password)

Ja, ich habe dies bereits versucht und es scheint, dass eine Verbindung über transport.connect (..) erforderlich ist. Wenn ja, wozu dienen die Eigenschaften von mail.smtp.user & pass? Reichen sie nicht aus, um smtp mit starttls zu verwenden? 

19
paweloque

Hier ist meine sendEmail-Methode, die GMail smtp (JavaMail) mit STARTTLS verwendet

public void sendEmail(String body, String subject, String recipient) throws MessagingException,
            UnsupportedEncodingException {
        Properties mailProps = new Properties();
        mailProps.put("mail.smtp.from", from);
        mailProps.put("mail.smtp.Host", smtpHost);
        mailProps.put("mail.smtp.port", port);
        mailProps.put("mail.smtp.auth", true);
        mailProps.put("mail.smtp.socketFactory.port", port);
        mailProps.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        mailProps.put("mail.smtp.socketFactory.fallback", "false");
        mailProps.put("mail.smtp.starttls.enable", "true");

        Session mailSession = Session.getDefaultInstance(mailProps, new Authenticator() {

            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(login, password);
            }

        });

        MimeMessage message = new MimeMessage(mailSession);
        message.setFrom(new InternetAddress(from));
        String[] emails = { recipient };
        InternetAddress dests[] = new InternetAddress[emails.length];
        for (int i = 0; i < emails.length; i++) {
            dests[i] = new InternetAddress(emails[i].trim().toLowerCase());
        }
        message.setRecipients(Message.RecipientType.TO, dests);
        message.setSubject(subject, "UTF-8");
        Multipart mp = new MimeMultipart();
        MimeBodyPart mbp = new MimeBodyPart();
        mbp.setContent(body, "text/html;charset=utf-8");
        mp.addBodyPart(mbp);
        message.setContent(mp);
        message.setSentDate(new Java.util.Date());

        Transport.send(message);
    }
24
Yuri.Bulkin

Sie müssen Authenticator als Unterklasse definieren und ein PasswordAuthentication-Objekt für Session zusammen mit den env-Eigenschaften zum Anmelden erstellen

Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {

    protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication("user-name", "user-password");
    }
  });

benutzername ist manchmal die vollständige E-Mail-ID für einige Server wie gmail . Hoffe, das hilft.

5
d-live

Sie müssen beim Erstellen der Sitzung einen Authentifikator angeben

Authenticator authenticator = new PasswordAuthentication("username", "password");
Session session = Session.getInstance(properties, authenticator);

dann verwenden Sie die Sitzung, um Ihre Nachricht zu senden (das Try/Catch überspringen):

SMTPTransport tr = (SMTPTransport) session.getTransport("smtps");
tr.connect();
tr.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
4
alexdown

Sie können den Benutzer als angeben 

[email protected]

(oder mail.smtp.user, wenn Sie mail.transport.protocol=smtps nicht verwenden) in den Eigenschaften, die Sie für die Sitzung verwenden. 

AFAIK, du kannst das Passwort nicht angeben. Aber Sie können es sicherlich in die Requisiten stecken und es selbst holen. Oder bekommen Sie es auf andere Weise, z. durch Aufforderung des Benutzers.

Wenn Sie es haben, gibt es zwei Möglichkeiten, es für die Sitzung bereitzustellen. Der einfachere ist zu benutzen

Transport tr = session.getTransport();
tr.connect(null, password);
tr.sendMessage(message, message.getRecipients());

Oder, wie erwähnt, können Sie einen Authentifikator verwenden. Dann wird der Benutzer aus den Requisiten ignoriert und Sie müssen ihn explizit an PasswordAuthentication übergeben. Wenn Sie dies tun, können Sie den statischen Code Transport.send verwenden.

4
cayhorstmann

Verwenden Sie Simple Java Mail es sollte unkompliziert sein:

Email email = new Email();

email.setFromAddress("lollypop", "[email protected]");
email.addRecipient("C.Cane", "[email protected]", RecipientType.TO);
email.setText("We should meet up!");
email.setTextHTML("<b>We should meet up!</b>");
email.setSubject("hey");

new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);

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


Wenn Sie dies dennoch selbst tun möchten, ist der Code hinter dieser library sehr einfach. Sie legt spezifische Eigenschaften für die Sitzung fest, abhängig davon, welche TransportStrategy übergeben wurde (plain, ssl oder tls), und verwendet zur Authentifizierung eine Authentifizierung:

"mail.transport.protocol" : "smtp"
"mail.smtp.starttls.enable" : "true"
"mail.smtp.Host" : Host
"mail.smtp.port" : port
"mail.smtp.username" : username
"mail.smtp.auth" : "true"

Und

return Session.getInstance(props, new Authenticator() {
   @Override
   protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(username, password);
   }
});
1
Benny Bottema