23

发送邮件时出现此错误

java.lang.RuntimeException: javax.mail.SendFailedException: 发送失败;嵌套异常是:类 javax.mail.MessagingException:无法连接到 SMTP 主机:smtp.gmail.com,端口:465,响应:-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);

任何帮助,将不胜感激。

提前致谢。

4

5 回答 5

18

您需要告诉它您正在使用 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;
        }
于 2013-07-20T10:18:42.880 回答
6

我在使用 NetBeans 进行调试时遇到了这个问题,甚至执行了实际的 jar 文件。防病毒软件会阻止发送电子邮件。您应该在调试期间暂时禁用防病毒软件,或者将 NetBeans 和实际的 jar 文件排除在扫描范围之外。就我而言,我使用的是 Avast。

请参阅此链接以了解如何排除:如何将文件/网站异常添加到 avast!杀毒软件 2014

这个对我有用。

于 2014-10-25T18:14:49.010 回答
2

就我而言,是 Avast Antivirus 干扰了连接。禁用此功能的操作:Avast -> 设置 -> 组件 -> Mail Shield(自定义)-> SSL 扫描 -> 取消选中“扫描 SSL 连接”。

于 2018-08-26T17:55:21.697 回答
1

端口 465 用于“smtp over SSL”。

http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html

[...] For example, use
    props.put("mail.smtp.port", "888");
to set the mail.smtp.port property, which is of type int.

Note that if you're using the "smtps" protocol to access SMTP over SSL, 
all the properties would be named "mail.smtps.*"
于 2013-03-14T16:45:10.550 回答
1

我所做的是我注释掉了

props.put("mail.smtp.starttls.enable","true"); 

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

于 2016-04-12T17:19:03.720 回答