20

我正在尝试使用Bill the 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 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;

有谁知道这个错误?

4

6 回答 6

19

我发现了问题。以前我使用 j2ee.jar 导入 javax.mail。

我从类路径中删除了 j2ee.jar 并下载了JavaMail 1.4.1 并将两个 jars、smtp.jar 和 mailapi.jar 放入我的类路径中。我现在使用smtps而不是smtp

Transport transport = session.getTransport("smtps");            

现在 Bill the Lizard 的代码可以工作了。

于 2008-12-22T13:16:10.743 回答
17

设置以下标签。它会起作用的。

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"); 
于 2012-04-21T12:12:30.967 回答
9

它是 java 邮件 API 的版本。我遇到了这个问题,我刚刚将 java 邮件 API 更新到 1.4.3 它对我来说很好!

谢谢!

于 2010-02-02T13:11:52.963 回答
4

我认为这与使用 SMTPS 而不是 SMTP 进行邮件传输有关。这是一个不同的版本,仿照JavaMail FAQ on access Gmail。请注意,为了清楚起见,我省略了所有更精细的异常处理。

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();
}
于 2008-12-22T12:36:51.010 回答
2

这让我发疯,所以只想添加对我有用的东西。我必须更新我的 JavaMail (1.4.5) 版本才能正常工作 - 不确定之前使用的是什么版本。

一旦我更新到新版本的 JavaMail,以下代码对我有用(可以取消注释调试行以获得额外的调试信息 - 端口是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();
    }
}
于 2012-10-04T15:07:49.667 回答
2

尝试这个:

打开:允许您的 gmail 帐户使用安全性较低的应用

https://myaccount.google.com/lesssecureapps

于 2017-09-25T11:31:28.030 回答