无法连接到 SMTP 主机:smtp.gmail.com,端口:587;嵌套异常是:java.net.ConnectException:连接超时:连接

新手上路,请多包涵

这是应用程序的代码。我一直在尝试使用 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 时会收到回复。我什至这样尝试过:

  • 首先在您设置/使用客户端的设备上的浏览器中登录 Gmail 帐户
  • 转到此处并启用对“安全性较低”应用程序的访问:https: //www.google.com/settings/security/lesssecureapps
  • 然后转到此处: https ://accounts.google.com/b/0/DisplayUnlockCaptcha 并单击继续。
  • 然后直接回到你的客户那里再试一次。

javax.mail.MessagingException:无法连接到 SMTP 主机:smtp.gmail.com,端口:587;嵌套的异常是:java.net.ConnectException:连接超时:在 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.Pl ainSocketImpl.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();
            }
        }
    }

原文由 zainab rizvi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

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

     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 可以访问。

原文由 walen 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

第 3 步:这是我使用过的代码中的一个代码片段,它可以正常工作。 来自 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

原文由 Aj Tech Developer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏