25

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& 传递属性是干什么用的?他们还不足以使用 smtpstarttls吗?

4

5 回答 5

27

这是我的 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);
    }
于 2011-04-08T09:05:45.363 回答
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。希望这可以帮助。

于 2011-04-08T08:12:51.047 回答
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. 如果你这样做了,那么你的奖励就是你可以使用 static Transport.send

于 2012-06-06T00:24:55.273 回答
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());
于 2013-05-31T06:34:13.457 回答
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 帐户生成应用程序专用密码。


如果你还想自己做,这个库背后的代码很简单。它根据传递的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);
   }
});
于 2016-05-19T11:08:38.450 回答