Свойства smtp JavaMail (для STARTTLS)

JavaMail определяет набор свойств, которые можно настроить для настройки SMTP-соединения. Для использования STARTTLS необходимо установить следующее свойство

mail.smtp.starttls.enable=true

Где указать имя пользователя/пароль для использования службы smtp? Достаточно указать:

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

Или мне нужно явно войти в систему, используя:

transport.connect(server, userName, password)

Да я уже пробовал это делать и вроде надо подключать через transport.connect(..). Но если да, то для чего нужны свойства mail.smtp.user & pass? Их недостаточно для использования smtp с starttls?


person paweloque    schedule 08.04.2011    source источник


Ответы (5)


Вот мой метод sendEmail, который использует GMail smtp (JavaMail) с 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);
    }
person Yuri.Bulkin    schedule 08.04.2011
comment
Привет. Куда вводить настоящее имя пользователя и пароль? - person masb; 01.05.2014
comment
В методе getPasswordAuthentication() класса Authenticator - person Yuri.Bulkin; 02.05.2014
comment
Хм, когда я устанавливаю ... socketFactory.class, он, кажется, использует SSL через SMTP вместо StartTLS, и я получаю сообщение Unrecognized SSL, незашифрованное соединение? исключение. - person Stroboskop; 13.01.2016

Вы должны создать подкласс Authenticator и создать объект PasswordAuthentication для сеанса вместе со свойствами env для входа в систему.

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

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

имя пользователя иногда является полным идентификатором электронной почты для некоторых серверов, таких как gmail. Надеюсь это поможет.

person d-live    schedule 08.04.2011

Вы можете указать пользователя как

[email protected]

(или mail.smtp.user, если вы не используете mail.transport.protocol=smtps) в свойствах, которые вы используете для сеанса.

Насколько я знаю, вы не можете указать пароль. Но вы, конечно, можете положить его в реквизит и получить самостоятельно. Или получить его каким-либо другим способом, например. путем запроса пользователя.

Когда он у вас есть, есть два способа передать его в сеанс. Самый простой - использовать

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

Или, как указано, вы можете использовать аутентификатор. Но тогда пользователь из реквизита игнорируется, и приходится явно передавать его в PasswordAuthentication. Если вы это сделаете, то ваша награда в том, что вы можете использовать статический Transport.send.

person cayhorstmann    schedule 06.06.2012

Вы должны предоставить аутентификатор при создании сеанса

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

затем вы используете сеанс для отправки своего сообщения (для краткости пропуская попытку/поймать):

SMTPTransport tr = (SMTPTransport) session.getTransport("smtps");
tr.connect();
tr.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
person alexdown    schedule 31.05.2013
comment
Как указано в часто задаваемых вопросах по Java, использование Authenticator является необязательным и обычно запутанным. - person MauganRa; 03.06.2017

Использование Simple Java Mail должно быть простым:

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

Если у вас включен двухфакторный вход, вам необходимо сгенерировать пароль приложения из ваш аккаунт Google.


Если вы все еще хотите сделать это самостоятельно, код этой библиотеки очень прост. Он устанавливает определенные свойства сеанса в зависимости от того, какой TransportStrategy был передан (обычный, ssl или tls), и он использует Authenticator для выполнения аутентификации:

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

И

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