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

#java #smtp #jakarta-mail #starttls

#java #smtp #джакарта-почта #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 свойства amp; pass? Разве их недостаточно для использования с smtp starttls ?

Ответ №1:

Вот мой метод отправки почты, который использует 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);
    }
  

Комментарии:

1. Привет. Куда вы вводите фактическое имя пользователя и пароль?

2. В методе getPasswordAuthentication() класса Authenticator

3. Хм, когда я устанавливаю «…socketFactory.class » похоже, вместо StartTLS используется SSL поверх SMTP, и я получаю «Нераспознанное сообщение SSL, соединение открытым текстом?» исключение.

4. В часто задаваемых вопросах JavaMail говорится, что настройка свойств SocketFactory не была необходимой в течение многих лет, и ее следует избегать: javaee.github.io/javamail/FAQ#commonmistakes

Ответ №2:

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

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

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

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

Ответ №3:

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

 mail.smtps.user=cayhorstmann@gmail.com
  

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

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

Когда он у вас есть, есть два способа передать его в сеанс. Более простой способ заключается в использовании

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

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

Ответ №4:

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

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

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

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

Комментарии:

1. Как указано в часто задаваемых вопросах по JavaMail , использование аутентификатора необязательно и обычно приводит к беспорядку.

Ответ №5:

Используя простую Java Mail, это должно быть просто:

 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.


Если вы все еще хотите сделать это самостоятельно, код, лежащий в основе этой библиотеки, очень прост. Он устанавливает конкретные свойства сеанса в зависимости от того, какая транспортная стратегия была передана (обычная, 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);
   }
});