28 votes

Propriétés smtp de JavaMail (pour STARTTLS)

JavaMail spécifie un ensemble de propriétés qui peuvent ê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-il suffisant de spécifier le :

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

Ou dois-je explicitement me connecter en utilisant le :

transport.connect(server, userName, password)

Oui, j'ai déjà essayé de le faire et il semble qu'il faille se connecter à l'aide de transport.connect(..) . Mais si oui, quels sont les mail.smtp.user et des propriétés de passage pour ? Ne sont-elles pas suffisantes pour utiliser smtp avec starttls ?

31voto

Yuri.Bulkin Points 959

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

5voto

d-live Points 3464

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

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

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

Le nom d'utilisateur est parfois l'adresse e-mail complète pour certains serveurs comme Gmail. J'espère que cela vous aidera.

5voto

cayhorstmann Points 1274

Vous pouvez spécifier l'utilisateur comme

mail.smtps.user=cayhorstmann@gmail.com

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

AFAIK, 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 demandant à l'utilisateur.

Lorsque vous l'avez, il y a deux façons de le fournir à la session. La 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 authentificateur. Mais alors l'utilisateur provenant des props est ignoré, et vous devez explicitement le passer à PasswordAuthentication . Si vous le faites, alors votre récompense est que vous pouvez utiliser la statique Transport.send .

4voto

alexdown Points 119

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, pour plus de concision) :

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

1voto

Plantface Points 863

Utilisation de Mail Java simple cela devrait être simple :

Email email = new Email();

email.setFromAddress("lollypop", "lol.pop@somemail.com");
email.addRecipient("C.Cane", "candycane@candyshop.org", 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 numéro d'identification de l'utilisateur. mot de passe spécifique à l'application depuis votre compte Google.


Si vous souhaitez tout de même le faire vous-même, la fonction Le code derrière cela La bibliothèque est très simple. Elle définit des propriétés spécifiques sur la session en fonction de l'objet de la session. Stratégie de transport a été transmis (plain, ssl ou tls) et il utilise un Authenticator 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);
   }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X