Подтвердить что ты не робот

Свойства JavaMail 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 и pass? Недостаточно ли их использовать smtp с starttls?

4b9b3361

Ответ 1

Вот мой метод 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);
    }

Ответ 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

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

[email protected]

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

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

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

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

Ответ 5

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

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), и он использует аутентификатор для выполнения аутентификации

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