Свойства SMTP для JavaMail (для STARTTLS) - PullRequest
20 голосов
/ 08 апреля 2011

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?

Ответы [ 5 ]

24 голосов
/ 08 апреля 2011

Вот мой метод 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);
    }
5 голосов
/ 08 апреля 2011

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

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

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

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

4 голосов
/ 31 мая 2013

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

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());
4 голосов
/ 06 июня 2012

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

mail.smtps.user=cayhorstmann@gmail.com

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

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

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

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

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

1 голос
/ 19 мая 2016

Использование Простая почта Java Это должно быть просто:

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

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


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

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