2011-04-08 172 views
19

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) 

是的,我已经尝试过这样做,似乎有必要在使用传输连接.connect(..)。但是,如果是,那么mail.smtp.user传递属性是什么?他们不足以使用starttls使用smtp吗?

回答

5

你必须继承身份验证,并与ENV属性一起创建一个会话对象的PasswordAuthentication登陆

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

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

用户名有时是如Gmail某些服务器完整的电子邮件ID。 希望这有助于。

22

这里是一个使用的是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); 
    } 
+0

您好。你在哪里输入实际的用户名和密码? – masb 2014-05-01 09:42:07

+1

在Authenticator类的getPasswordAuthentication()方法 – 2014-05-02 04:55:57

+5

嗯,当我设置“... socketFactory.class”它似乎使用SMTP而不是StartTLS而使用SSL,并且我得到“无法识别的SSL消息,明文连接?例外。 – Stroboskop 2016-01-13 11:55:06

4

您可以指定用户作为

[email protected] 

(或mail.smtp.user如果你不使用mail.transport.protocol=smtps)我sendEmail方法在您用于会话的属性中。

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

正如[JavaMail FAQ](https://javaee.github.io/javamail/FAQ.html#commonmistakes)所述,使用Authenticator是可选的,通常很麻烦。 – MauganRa 2017-06-03 15:54:31

1

使用Simple Java Mail它应该很简单:

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


如果你仍然想这个做自己,code behind this库是非常简单的。它设置在这取决于TransportStrategy传递(普通纸,SSL或TLS)会话特定的性质,它使用一个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); 
    } 
});