必须首先发出一个STARTTLS命令。 使用Java和Google Apps发送电子邮件
我正在尝试使用Bill Lizard的代码使用Google Apps发送电子邮件。 我得到这个错误:
Exception in thread "main" javax.mail.SendFailedException: Sending failed; nested exception is: javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. f3sm9277120nfh.74 at javax.mail.Transport.send0(Transport.java:219) at javax.mail.Transport.send(Transport.java:81) at SendMailUsingAuthentication.postMail(SendMailUsingAuthentication.java:81) at SendMailUsingAuthentication.main(SendMailUsingAuthentication.java:44)
比尔的代码包含下一行,这似乎与错误有关:
props.put("mail.smtp.starttls.enable","true");
但是,这并没有帮助。
这些是我的import陈述:
import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage;
有谁知道这个错误?
我发现了这个问题。 以前我用j2ee.jar来导入javax.mail。
我从类path中删除了j2ee.jar并下载了JavaMail 1.4.1,并在我的类path中放入了两个jar,smtp.jar和mailapi.jar。 我现在使用smtps而不是smtp
Transport transport = session.getTransport("smtps");
现在比尔蜥蜴的代码工作。
设置以下标签。 它会工作。
props.put("mail.smtp.user","username"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "25"); props.put("mail.debug", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.EnableSSL.enable","true"); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.port", "465"); props.setProperty("mail.smtp.socketFactory.port", "465");
它是Java邮件API的版本。 我正面临着这个问题,我只是更新了Java邮件API到1.4.3它对我来说工作正常!
谢谢!
我认为这与使用SMTPS而不是SMTP进行邮件传输有关。 这里有一个不同的版本,模仿JavaMail FAQ访问Gmail 。 请注意,为清楚起见,我省略了所有更精细的exception处理。
private static void send( final String username, final String password, final String recipients, final String subject, final String body) throws Exception { final Session session = Session.getInstance(System.getProperties(), null); final Message msg = new MimeMessage(session); final String senderEmail = username.contains("@") ? username : (username + "@gmail.com"); msg.setFrom(new InternetAddress(senderEmail)); final Address[] recipientAddresses = InternetAddress.parse(recipients); msg.setRecipients(Message.RecipientType.TO, recipientAddresses); msg.setSentDate(new Date()); msg.setSubject(subject); msg.setText(body); final Transport transport = session.getTransport("smtps"); transport.connect(GMAIL_SMTP_HOST, GMAIL_SMTP_PORT, username, password); transport.sendMessage(msg, recipientAddresses); transport.close(); }
这让我疯狂,所以只想添加一些对我有用的东西。 我不得不更新我的版本的JavaMail(1.4.5)为此工作 – 不知道以前使用的是什么版本。
一旦我更新到JavaMail的新版本,下面的代码为我工作(可以取消注释debugging行以获得额外的debugging信息 – 端口是587
和主机是smtp.gmail.com
):
public void sendMailWithAuth(String host, String user, String password, String port, List<String> toList, String htmlBody, String subject) throws Exception { Properties props = System.getProperties(); props.put("mail.smtp.user",user); props.put("mail.smtp.password", password); props.put("mail.smtp.host", host); props.put("mail.smtp.port", port); //props.put("mail.debug", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.EnableSSL.enable","true"); Session session = Session.getInstance(props, null); //session.setDebug(true); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user)); // To get the array of addresses for (String to: toList) { message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); } message.setSubject(subject); message.setContent(htmlBody, "text/html"); Transport transport = session.getTransport("smtp"); try { transport.connect(host, user, password); transport.sendMessage(message, message.getAllRecipients()); } finally { transport.close(); } }