【问题标题】:Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 578;线程“主”java.lang.RuntimeException 中的异常:javax.mail.MessagingException:无法连接到 SMTP 主机:smtp.gmail.com,端口:578;
【发布时间】:2015-02-07 17:56:56
【问题描述】:

我是 Java 新手。我想构建一个向我的客户发送电子邮件的应用程序。我搜索了stackoverflow,但没有得到任何想要的解决方案。在某处我看到这可能是防火墙的问题,但没有得到解决它的解决方案。 我正在使用 Ubuntu 14.10
//这是我的代码。

public class sendMail {

    public void send(String from, String to, String subject, String body) {
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "587");
        props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "587");

        Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("xxxxxxx@gmail.com","xxxxx");
            }
        });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("xxxxxx@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("xxxx@domain.com"));
            message.setSubject("Testing Subject");
            message.setText("Hello this is not spam," +
                "\n\n This is a JavaMail test...!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }  
}  

我的错误是:

Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;
    nested exception is:
       java.net.ConnectException: Connection timed out
       at dbdemo.sendMail.send(sendMail.java:54)
       at dbdemo.DBDemo.main(DBDemo.java:62)
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;
    nested exception is:
       java.net.ConnectException: Connection timed out
       at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706)
       at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
       at javax.mail.Service.connect(Service.java:313)
       at javax.mail.Service.connect(Service.java:172)
       at javax.mail.Service.connect(Service.java:121)
       at javax.mail.Transport.send0(Transport.java:190)
       at javax.mail.Transport.send(Transport.java:120)
       at dbdemo.sendMail.send(sendMail.java:49)
       ... 1 more
Caused by: java.net.ConnectException: Connection timed out
       at java.net.PlainSocketImpl.socketConnect(Native Method)
       at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
       at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
       at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
       at java.net.Socket.connect(Socket.java:579)
       at java.net.Socket.connect(Socket.java:528)
       at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:284)
       at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:227)
       at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1672)
       ... 8 more
Java Result: 1

任何帮助将不胜感激。请帮我。

【问题讨论】:

  • 这个问题不时被问到,你真的应该尝试搜索它(我使用[java] gmail port 587搜索并找到stackoverflow.com/questions/21558693/…)
  • 您可能应该使用props.put("mail.smtp.starttls.enable", "true"); 而不是定义套接字工厂。
  • @MadProgrammer 我使用了直接 IP“173.194.78.108”。但仍然会出现同样的错误
  • @EJP 还是不行。

标签: java email jakarta-mail


【解决方案1】:

扔掉你从不了解如何使用 JavaMail 的人那里剪切和粘贴的代码并使用code for connecting to Gmail in the JavaMail FAQ。

如果对您不起作用,请关注debugging tips in the JavaMail FAQ。

如果您仍然无法弄清楚,并且在 JavaMail 常见问题解答中找不到答案,请在此处发布 JavaMail 调试输出。

【讨论】:

  • 您对调试很陌生,对吧?使用您当前使用的代码更新您的帖子,希望您从常见问题解答中获得。并使用 JavaMail 调试输出更新您的帖子,常见问题解答告诉您如何获取。
  • 调试:setDebug:JavaMail 版本 1.4.4 调试:getProvider() 返回 javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc] 调试 SMTP :useEhlo true,useAuth false DEBUG SMTP:尝试连接到主机“smtp.gmail.com”,端口 465,isSSL true。在此之后,同样的错误即将到来。
  • 您可能想upgrade to a newer version of JavaMail,尽管这与您的问题无关。您是否尝试过常见问题解答中的连接调试提示?他们展示了什么?在您的网络浏览器中,它是否配置为使用proxy server?这将是您和 Gmail 之间存在防火墙的另一个迹象。你可以配置 Thunderbird 来访问 Gmail 吗?如果没有,那将是防火墙存在的另一个线索。
【解决方案2】:

这段代码对我有用,

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Email {

private static String USER_NAME = "xxxx";  // GMail user name (just the part before "@gmail.com")
private static String PASSWORD = "xxxx"; // GMail password
private static String RECIPIENT = "xxx@gmail.com";

public static void main(String[] args) {
    String from = USER_NAME;
    String pass = PASSWORD;
    String[] to = { RECIPIENT }; // list of recipient email addresses
    String subject = "Java send mail example";
    String body = "Welcome to JavaMail!";

    sendFromGMail(from, pass, to, subject, body);
}

private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) {
    Properties props = System.getProperties();
  String host = "smtp.gmail.com";
   // String host="localhost";
  // props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
    props.put("mail.smtp.starttls.enable", "true");
   // props.put("mail.smtp.host", host);
   props.put("mail.smtp.ssl.trust", host);
    props.put("mail.smtp.user", from);
    props.put("mail.smtp.password", pass);
    props.put("mail.smtp.port", "587");//587
    props.put("mail.smtp.auth", "true");
   //System.out.println("success point 1");

    Session session = Session.getDefaultInstance(props);
    MimeMessage message = new MimeMessage(session);

    try {
         //System.out.println("success point 2");

        message.setFrom(new InternetAddress(from));
        InternetAddress[] toAddress = new InternetAddress[to.length];

        // To get the array of addresses
        for( int i = 0; i < to.length; i++ ) {
            toAddress[i] = new InternetAddress(to[i]);
        }

        for( int i = 0; i < toAddress.length; i++) {
            message.addRecipient(Message.RecipientType.TO, toAddress[i]);
        }

         //System.out.println("success point 3");

        message.setSubject(subject);
        message.setText(body);
        // System.out.println("success point 4");

        Transport transport = session.getTransport("smtp");
        // System.out.println("success point 5");

        transport.connect(host, from, pass);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
        //System.out.println("success 6");
    }
    catch (AddressException ae) {
        ae.printStackTrace();
    }
    catch (MessagingException me) {
        me.printStackTrace();
    }
  }
}

而且我使用了一些 jar 文件 激活,java-mail-1.4.4,javamail-smtp-1.4.2,pop3,mail-6.0.0-sources

【讨论】:

  • @user3817980 你能发布你得到的错误吗?
  • 同样的问题解决了...stackoverflow.com/questions/26087018/…检查你的jar文件和版本
  • 我应该使用哪个版本?
  • 我使用的和 DEBUGGER 显示的一样:DEBUG: setDebug: JavaMail version 1.4.4 DEBUG: getProvider() returned javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp .SMTPTransport,Sun Microsystems, Inc] 调试 SMTP:useEhlo true,useAuth true 调试 SMTP:尝试连接到主机“smtp.gmail.com”,端口 587,isSSL false
【解决方案3】:

连接超时通常由

引起
  • 途中有某种防火墙,只会吃掉数据包 没有告诉发件人诸如“没有路由到主机”之类的事情
  • 由于网络配置错误或线路过载导致丢包
  • 过多的请求使服务器过载

这里是How do I turn off firewall on Ubuntu

如果这不起作用,请尝试将 props.put("mail.smtp.port", "587"); 更改为 props.put("mail.smtp.port", "465"); 或 props.put("mail.smtp.port", "25");


连接后的一些进一步信息(与超时无关):

不要忘记仔细检查您的登录凭据。因为如果提供不正确,它们可能会导致Authentication Failed Exception

【讨论】:

  • 直到最后一句但不包括所有好的信息。登录凭据与连接超时无关。
  • @EJP,我已经提到了进一步的身份验证失败异常,如果登录凭据不正确,可能会导致该异常。与连接超时无关
  • 这正是我所说的。如果您想相应地澄清您的答案,请务必继续。如果您想提及 1000 个其他不相关的错误条件,请确保您也提及它们导致的相关异常。
猜你喜欢
  • 2011-11-01
  • 2014-03-08
  • 2013-08-21
  • 2017-10-07
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 2016-07-29
  • 2014-10-23
相关资源
最近更新 更多