JavaMail smtp属性(适用于STARTTLS)

时间:2011-04-08 07:52:55

标签: java smtp javamail 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&传递属性?它们不足以使用starttls的smtp吗?

5 个答案:

答案 0 :(得分:24)

这是我的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);
    }

答案 1 :(得分:5)

您必须为Authenticator创建子类并为Session创建PasswordAuthentication对象以及要登录的env属性

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

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

用户名有时是某些服务器(如gmail)的完整电子邮件ID。 希望这会有所帮助。

答案 2 :(得分:4)

您可以将用户指定为

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

答案 3 :(得分: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());

答案 4 :(得分:1)

使用Simple 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帐户生成application specific password

如果您仍想自己动手,code behind this库非常简单。它根据传递的TransportStrategy(plain,ssl或tls)设置Session的特定属性,并使用Authenticator执行身份验证:

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