无法连接到 SMTP 主机:smtp.gmail.com,端口:465,响应:-1

26

发送邮件时,我遇到了以下错误:

java.lang.RuntimeException: javax.mail.SendFailedException: Sending failed; nested exception is: class javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465, response: -1

以下是我的代码:

Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");

Session session = Session.getDefaultInstance(props,
    new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("email", "password");
        }
    });

try {
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress("email"));
    message.setRecipients(Message.RecipientType.TO,
        InternetAddress.parse(this.to));
    message.setSubject("Testing");
    message.setText("Hey, this is the testing email.");

    Transport.send(message);
    // ...
}

这个错误的原因是什么,如何解决这个问题?


请查看http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/,其中包含有关通过Gmail SMTP发送电子邮件的JavaMail API示例。 - Abi
我尝试了相同的代码,但仍然出现错误:javax.mail.MessagingException: 530 5.7.0 必须先发出 STARTTLS 命令。4sm28216799pbn.23 - gsmtp 在 com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1020)at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:716) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:388) at rapid.mail.main(mail.java:60)。这里已经有启用 STARTTLS 的代码了,为什么还是出现相同的错误:properties.put("mail.smtp.starttls.enable", "true"); - user1900376
请尝试使用最新的jar版本JavaMail 1.4.7。 - Abi
没有进展,同样的错误。 - user1900376
1
将端口号更改为587。 - Abi
我将端口号更改为587,但仍然出现相同的错误。 - user1900376
5个回答

19
您需要告诉它您正在使用SSL:
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

如果您遗漏了什么内容,这里是可用的工作代码:
String  d_email = "address@gmail.com",
            d_uname = "Name",
            d_password = "urpassword",
            d_host = "smtp.gmail.com",
            d_port  = "465",
            m_to = "toAddress@gmail.com",
            m_subject = "Indoors Readable File: " + params[0].getName(),
            m_text = "This message is from Indoor Positioning App. Required file(s) are attached.";
    Properties props = new Properties();
    props.put("mail.smtp.user", d_email);
    props.put("mail.smtp.host", d_host);
    props.put("mail.smtp.port", d_port);
    props.put("mail.smtp.starttls.enable","true");
    props.put("mail.smtp.debug", "true");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.socketFactory.port", d_port);
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");

    SMTPAuthenticator auth = new SMTPAuthenticator();
    Session session = Session.getInstance(props, auth);
    session.setDebug(true);

    MimeMessage msg = new MimeMessage(session);
    try {
        msg.setSubject(m_subject);
        msg.setFrom(new InternetAddress(d_email));
        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to));

Transport transport = session.getTransport("smtps");
            transport.connect(d_host, Integer.valueOf(d_port), d_uname, d_password);
            transport.sendMessage(msg, msg.getAllRecipients());
            transport.close();

        } catch (AddressException e) {
            e.printStackTrace();
            return false;
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }

我收到以下异常信息,请问您能告诉我问题出在哪吗? javax.mail.SendFailedException: 发送失败; 嵌套异常为: class javax.mail.MessagingException: 无法连接 SMTP 主机:smtp.gmail.com,端口:587; 嵌套异常为: java.net.ConnectException: 连接超时:连接 at javax.mail.Transport.send0(Transport.java:218) at javax.mail.Transport.send(Transport.java:80) at sendMail.SendMail4.execute(SendMail4.java:70) at sendMail.sel.main(sel.java:10) - Rahil Kumar
谢谢。我不知道d_uname字段的作用。另一方面,在连接指令中,我们应该传递电子邮件而不是用户名:transport.connect(d_host, Integer.valueOf(d_port), d_email, d_password);。此外,最好在代码中显示SMTPAuthenticator类来自哪个包,或者在答案中提供所需的API。 - Omar

6
我在使用NetBeans进行调试时,甚至在执行实际的jar文件时都遇到了这个问题。杀毒软件会阻止发送邮件。您应该在调试期间暂时禁用您的杀毒软件,或者将NetBeans和实际的jar文件从扫描范围中排除。我使用的是Avast。
请参考以下链接以了解如何进行排除:如何将文件/网站例外添加到avast!Antivirus 2014 对我很有效。

您能更详细地描述SMTP响应与防病毒软件之间的连接吗? - carlodurso
1
@carlodurso:防病毒软件(在我的情况下是AVAST)具有阻止使用端口进出的程序的功能,因为怀疑存在安全威胁。因此最好将您的jar文件排除在被阻止之外。 - ronIT

2

在我的情况下,是Avast杀毒软件干扰了连接。 禁用此功能的操作如下: Avast -> 设置-> 组件 -> 邮件盾(自定义) -> SSL扫描 -> 取消选中“扫描SSL连接”。


1
我所做的是将

注释掉。
props.put("mail.smtp.starttls.enable","true"); 

显然对于G-mail你不需要它。因此,如果您还没有这样做,您需要在G-mail中为您的程序创建一个应用密码。我做到了,它完美地工作了。这里的链接将向您展示如何操作:https://support.google.com/accounts/answer/185833


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接