【问题标题】:Could not connect to SMTP host: smtp.gmail.com, port: 587; nested exception is: java.net.ConnectException: Connection timed out: connect无法连接到 SMTP 主机:smtp.gmail.com,端口:587;嵌套异常是:java.net.ConnectException:连接超时:连接
【发布时间】:2016-12-01 04:14:22
【问题描述】:

这是应用程序的代码。我一直在尝试使用 Eclipse IDE 运行它。我还添加了所有必需的 java 邮件 jar 文件,即 dsn.jar,imap.jar,mailapi.jar,pop3.jar,smtp.jar,mail.jar。 但它给出了以下错误Could not connect to SMTP host: smtp.gmail.com, port: 587。

没有防火墙阻止访问,因为在 ping smtp.gmail.com 时收到回复。 我什至试过这样:

javax.mail.MessagingException:无法连接到 SMTP 主机: smtp.gmail.com,端口:587; 嵌套异常是: java.net.ConnectException:连接超时:连接 在 com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1972) 在 com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642) 在 javax.mail.Service.connect(Service.java:317) 在 javax.mail.Service.connect(Service.java:176) 在 javax.mail.Service.connect(Service.java:125) 在 javax.mail.Transport.send0(Transport.java:194) 在 javax.mail.Transport.send(Transport.java:124) 在 PlainTextEmailSender.sendPlainTextEmail(PlainTextEmailSender.java:50) 在 PlainTextEmailSender.main(PlainTextEmailSender.java:73) 引起:java.net.ConnectException:连接超时:连接 在 java.net.DualStackPlainSocketImpl.connect0(本机方法) 在 java.net.DualStackPlainSocketImpl.socketConnect(未知来源) 在 java.net.AbstractPlainSocketImpl.doConnect(未知来源) 在 java.net.AbstractPlainSocketImpl.connectToAddress(未知来源) 在 java.net.AbstractPlainSocketImpl.connect(未知来源) 在 java.net.PlainSocketImpl.connect(未知来源) 在 java.net.SocksSocketImpl.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:319) 在 com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:233) 在 com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1938)

    package net.codejava.mail;

    import java.util.Date;
    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.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;

    public class PlainTextEmailSender {

        public void sendPlainTextEmail(String host, String port,
                final String userName, final String password, String toAddress,
                String subject, String message) throws AddressException,
                MessagingException {

            // sets SMTP server properties
            Properties properties = new Properties();
            properties.put("mail.smtp.host", host);
            properties.put("mail.smtp.port", port);
            properties.put("mail.smtp.auth", "true");
            properties.put("mail.smtp.starttls.enable", "true");

            // creates a new session with an authenticator
            Authenticator auth = new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(userName, password);
                }
            };

            Session session = Session.getInstance(properties, auth);

            // creates a new e-mail message
            Message msg = new MimeMessage(session);

            msg.setFrom(new InternetAddress(userName));
            InternetAddress[] toAddresses = { new InternetAddress(toAddress) };
            msg.setRecipients(Message.RecipientType.TO, toAddresses);
            msg.setSubject(subject);
            msg.setSentDate(new Date());
            // set plain text message
            msg.setText(message);

            // sends the e-mail
            Transport.send(msg);

        }

        /**
         * Test the send e-mail method
         *
         */
        public static void main(String[] args) {
            // SMTP server information
            String host = "smtp.gmail.com";
            String port = "587";
            String mailFrom = "user_name";
            String password = "password";

            // outgoing message information
            String mailTo = "email_address";
            String subject = "Hello my friend";
            String message = "Hi guy, Hope you are doing well. Duke.";

            PlainTextEmailSender mailer = new PlainTextEmailSender();

            try {
                mailer.sendPlainTextEmail(host, port, mailFrom, password, mailTo,
                        subject, message);
                System.out.println("Email sent.");
            } catch (Exception ex) {
                System.out.println("Failed to sent email.");
                ex.printStackTrace();
            }
        }
    }

【问题讨论】:

  • 不,我没有尝试使用 telnet 客户端进行连接,但我使用 cmd 检查 ping 响应是否来自对 smtp.gmail.com 的 ping 请求。它在那里工作得很好。
  • 如你所说,我已经为异常提供了完整的堆栈跟踪。如果您能帮我解决这个问题,那就太好了。
  • 实际上我想在我的项目中使用它,我想将随机生成的用户 ID 和密码发送到特定用户的电子邮件 ID。但是这封邮件不起作用:/

标签: java eclipse email


【解决方案1】:

对于所有仍在寻找以简单方式解释的答案的人,这里是答案:

第 1 步: 大多数防病毒程序会阻止通过内部应用程序从计算机发送电子邮件。因此,如果您遇到错误,那么您将不得不在调用这些电子邮件发送方法/API 时禁用您的防病毒程序。

第 2 步: 默认情况下禁用 SMTP 访问 Gmail。要允许应用程序使用您的 Gmail 帐户发送电子邮件,请按照以下步骤操作

  1. 打开链接:https://myaccount.google.com/security?pli=1#connectedapps
  2. 在“安全”设置中,将“允许安全性较低的应用”设置为开启。

第 3 步: 这是我使用过的代码中的一个代码 sn-p,它可以正常工作。 来自 EmailService.java:

private Session getSession() {
    //Gmail Host
    String host = "smtp.gmail.com";
    String username = "techdeveloper.aj@gmail.com";
    //Enter your Gmail password
    String password = "";

    Properties prop = new Properties();
    prop.put("mail.smtp.auth", true);
    prop.put("mail.smtp.starttls.enable", "true");
    prop.put("mail.smtp.host", host);
    prop.put("mail.smtp.port", 587);
    prop.put("mail.smtp.ssl.trust", host);

    return Session.getInstance(prop, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    });
}

我还使用这些步骤在 GitHub 上写了一篇博文和一个工作应用程序。请查收:http://softwaredevelopercentral.blogspot.com/2019/05/send-email-in-java.html

【讨论】:

    【解决方案2】:

    试试这个步骤

    Step 2: Send mail from your device or application

    如果您使用 SSL 或 TLS 进行连接,您可以通过 smtp.gmail.com 向任何人发送邮件。

    注意:在开始配置之前,我们建议您为所需帐户设置应用密码。在使用应用密码登录和管理用户的安全设置中了解更多信息。

    如果您使用 SSL,请在端口 465 上连接到 smtp.gmail.com。 (如果您使用 TLS,请连接端口 587。) 使用 Google 用户名和密码登录以进行身份​​验证以连接 SSL 或 TLS。 确保您使用的用户名已通过首次登录时出现的 CAPTCHA 字词验证测试。

    【讨论】:

      【解决方案3】:

      使用 JDK 7 并通过 Gmail 成功发送电子邮件,Gmail 设置。

      转到 Gmail 设置 > 帐户和导入 > 其他 Google 帐户设置 > 和 登录和安全

      1. 两步验证:关闭
      2. 允许安全性较低的应用:开启
      3. 应用密码:1 个密码(16 个字符长),后来用这个替换了当前密码。

      使用以下 maven 依赖项:

      spring-core:4.2.2
      spring-beans:4.2.2
      spring-context:4.2.2
      spring-context-support:4.2.2
      spring-expression:4.2.2
      commons-logging:1.2
      
      <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <version>1.4.7</version>
      </dependency>
      

      我的源代码是:

      import org.springframework.mail.javamail.JavaMailSenderImpl;
      import org.springframework.mail.javamail.MimeMessageHelper;
      
      import javax.mail.MessagingException;
      import javax.mail.internet.MimeMessage;
      import javax.swing.JOptionPane;
      import java.util.List;
      import java.util.Properties;
      
      public class Email {
      
          public final void prepareAndSendEmail(String htmlMessage, String toMailId) {
      
              final OneMethod oneMethod = new OneMethod();
              final List<char[]> resourceList = oneMethod.getValidatorResource();
      
              //Spring Framework JavaMailSenderImplementation    
              JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
              mailSender.setHost("smtp.gmail.com");
              mailSender.setPort(465);
      
              //setting username and password
              mailSender.setUsername(String.valueOf(resourceList.get(0)));
              mailSender.setPassword(String.valueOf(resourceList.get(1)));
      
              //setting Spring JavaMailSenderImpl Properties
              Properties mailProp = mailSender.getJavaMailProperties();
              mailProp.put("mail.transport.protocol", "smtp");
              mailProp.put("mail.smtp.auth", "true");
              mailProp.put("mail.smtp.starttls.enable", "true");
              mailProp.put("mail.smtp.starttls.required", "true");
              mailProp.put("mail.debug", "true");
              mailProp.put("mail.smtp.ssl.enable", "true");
              mailProp.put("mail.smtp.user", String.valueOf(resourceList.get(0)));
      
              //preparing Multimedia Message and sending
              MimeMessage mimeMessage = mailSender.createMimeMessage();
              try {
                  MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
                  helper.setTo(toMailId);
                  helper.setSubject("I achieved the Email with Java 7 and Spring");
                  helper.setText(htmlMessage, true);//setting the html page and passing argument true for 'text/html'
      
                  //Checking the internet connection and therefore sending the email
                  if(OneMethod.isNetConnAvailable())
                      mailSender.send(mimeMessage);
                  else
                      JOptionPane.showMessageDialog(null, "No Internet Connection Found...");
              } catch (MessagingException e) {
                  e.printStackTrace();
              }
      
          }
      
      }
      

      希望这会对某人有所帮助。

      【讨论】:

        【解决方案4】:

        正如我所说,您的代码没有任何问题。如果有的话,只是为了做一些测试,尝试删除 Authentication 部分以查看它是否有效:

            public void sendPlainTextEmail(String host, String port,
                    final String userName, final String password, String toAddress,
                    String subject, String message) throws AddressException,
                    MessagingException {
        
                // sets SMTP server properties
                Properties properties = new Properties();
                properties.put("mail.smtp.host", host);
                properties.put("mail.smtp.port", port);
                properties.put("mail.smtp.auth", "true");
                properties.put("mail.smtp.starttls.enable", "true");
        // *** BEGIN CHANGE
                properties.put("mail.smtp.user", userName);
        
                // creates a new session, no Authenticator (will connect() later)
                Session session = Session.getDefaultInstance(properties);
        // *** END CHANGE
        
                // creates a new e-mail message
                Message msg = new MimeMessage(session);
        
                msg.setFrom(new InternetAddress(userName));
                InternetAddress[] toAddresses = { new InternetAddress(toAddress) };
                msg.setRecipients(Message.RecipientType.TO, toAddresses);
                msg.setSubject(subject);
                msg.setSentDate(new Date());
                // set plain text message
                msg.setText(message);
        
        // *** BEGIN CHANGE
                // sends the e-mail
                Transport t = session.getTransport("smtp");
                t.connect(userName, password);
                t.sendMessage(msg, msg.getAllRecipients());
                t.close();
        // *** END CHANGE
        
            }
        

        这是我每天用来从我的应用程序中发送数十封电子邮件的代码,它可以 100% 保证正常工作——当然,只要smtp.gmail.com:587 可以访问。

        【讨论】:

        • 你使用的是哪个JDK版本?源代码在 java 8 中运行良好,但在 jdk 7 中反复失败。
        • 我使用的是 Java 8,但该代码甚至可以在 Java 6 上运行。它实际上与所有 JavaMail 教程相同。 @ArifMustafa 你遇到了什么错误?
        • 我不知道为什么不在 Java 7 上工作,现在这对我来说是一团糟。错误与受害相同。
        • 同时分享 java 邮件 jar 名称依赖以及您正在使用的版本!
        • [INFO] | \- com.sun.mail:javax.mail:jar:1.5.5:compile。但是,如果您在问题中得到Connection timed out,它可能与您的Java 代码无关。无论如何,您可能应该发布一个新问题。
        猜你喜欢
        • 2013-08-21
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        相关资源
        最近更新 更多