web-dev-qa-db-fra.com

Propriétés smtp JavaMail (pour STARTTLS)

JavaMail spécifie un ensemble de propriétés pouvant être définies pour configurer une connexion SMTP. Pour utiliser STARTTLS, il est nécessaire de définir la propriété suivante

mail.smtp.starttls.enable=true

Où dois-je spécifier le nom d'utilisateur/mot de passe pour utiliser le service smtp? Est-ce suffisant de spécifier le:

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

Ou dois-je me connecter explicitement en utilisant le:

transport.connect(server, userName, password)

Oui, j'ai déjà essayé de le faire et il semble nécessaire de se connecter avec transport.connect (..). Mais si oui, à quoi servent les propriétés mail.smtp.user & pass? Ne suffisent-ils pas pour utiliser smtp avec starttls? 

19
paweloque

Voici ma méthode sendEmail qui utilise GMail smtp (JavaMail) avec STARTTLS

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

Vous devez sous-classer Authenticator et créer un objet PasswordAuthentication pour Session avec des propriétés env pour vous connecter.

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

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

nom-utilisateur est parfois l'identifiant de messagerie complet de certains serveurs comme gmail . J'espère que cela vous aidera.

5
d-live

Vous devez fournir un authentifiant lorsque vous créez la session.

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

puis vous utilisez la session pour envoyer votre message (en sautant le try/catch, par souci de concision):

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

Vous pouvez spécifier l'utilisateur comme 

[email protected]

(ou mail.smtp.user si vous n'utilisez pas mail.transport.protocol=smtps) dans les propriétés que vous utilisez pour la session. 

Autant que je sache, vous ne pouvez pas fournir le mot de passe. Mais vous pouvez certainement le mettre dans les accessoires et le récupérer vous-même. Ou l'obtenir d'une autre manière, par exemple en invitant l'utilisateur.

Lorsque vous l’avez, il ya deux façons de le fournir à la session. Le plus simple est d'utiliser

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

Ou, comme indiqué, vous pouvez utiliser un authentifiant. Mais alors l'utilisateur des accessoires est ignoré et vous devez explicitement le passer à PasswordAuthentication. Si vous le faites, votre récompense est que vous pouvez utiliser le Transport.send statique.

4
cayhorstmann

Utiliser Simple Java Mail il devrait être simple:

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

Si la connexion à deux facteurs est activée, vous devez générer un mot de passe spécifique à l'application à partir de votre compte Google.


Si vous voulez toujours le faire vous-même, le code derrière cette bibliothèque est très simple. Il définit des propriétés spécifiques sur la session en fonction de TransportStrategy qui a été passé (en clair, ssl ou tls) et utilise un authentificateur pour effectuer l'authentification:

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

Et

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