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