paw*_*que 21 java smtp jakarta-mail starttls
JavaMail指定了一组可以设置为配置SMTP连接的属性.要使用STARTTLS,必须设置以下属性
mail.smtp.starttls.enable=true
Run Code Online (Sandbox Code Playgroud)
在哪里指定用户名/密码才能使用smtp服务?是否足以指定:
mail.smtp.user=me
mail.smtp.password=secret
Run Code Online (Sandbox Code Playgroud)
或者我必须使用以下方法明确登录:
transport.connect(server, userName, password)
Run Code Online (Sandbox Code Playgroud)
是的,我已经尝试过这样做,似乎有必要使用transport.connect(..)进行连接.但如果是,mail.smtp.user&pass属性是什么?他们还不足以使用smtp和starttls吗?
Yur*_*kin 25
这是我的sendEmail方法,它使用带有STARTTLS的GMail smtp(JavaMail)
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);
}
Run Code Online (Sandbox Code Playgroud)
您必须为Authenticator创建子类,并为Session创建PasswordAuthentication对象以及要登录的env属性
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user-name", "user-password");
}
});
Run Code Online (Sandbox Code Playgroud)
用户名有时是某些服务器(如gmail)的完整电子邮件ID.希望这可以帮助.
您可以将用户指定为
mail.smtps.user=cayhorstmann@gmail.com
Run Code Online (Sandbox Code Playgroud)
(或者mail.smtp.user
如果您不使用mail.transport.protocol=smtps
)在您用于会话的属性中。
AFAIK,您无法提供密码。但您当然可以将其放入道具中并自行取回。或者以其他方式获取它,例如通过提示用户。
当您拥有它时,有两种方法将其提供给会话。比较简单的是使用
Transport tr = session.getTransport();
tr.connect(null, password);
tr.sendMessage(message, message.getRecipients());
Run Code Online (Sandbox Code Playgroud)
或者,正如所指出的,您可以使用身份验证器。但随后 props 中的用户将被忽略,您必须将其显式传递给PasswordAuthentication
. 如果您这样做,那么您的奖励就是您可以使用 static Transport.send
。