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

时间:2016-07-27 08:48:02

标签: java eclipse email

这是应用程序的代码。我一直在尝试使用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

没有防火墙阻止访问,因为在pinging smtp.gmail.com上收到了回复。 我甚至用这种方式尝试过:

  

javax.mail.MessagingException:无法连接到SMTP主机:   smtp.gmail.com,port:587;         嵌套异常是:         java.net.ConnectException:连接超时:连接         在com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1972)         at 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:连接超时:连接         at java.net.DualStackPlainSocketImpl.connect0(Native Method)         在java.net.DualStackPlainSocketImpl.socketConnect(未知来源)         at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)         at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)         在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();
            }
        }
    }

5 个答案:

答案 0 :(得分:1)

通过 Gmail 使用 JDK 7 成功通过 Gmail 设置

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

  1. 两步验证:关闭
  2. 允许不太安全的应用:开启
  3. 应用密码:1个密码 (16个字符长),稍后用此替换当前密码。
  4. 使用以下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();
            }
    
        }
    
    }
    

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

答案 1 :(得分:0)

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

    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可以访问,当然

答案 2 :(得分:0)

尝试此步骤

Step 2: Send mail from your device or application

如果使用SSL或TLS连接,则可以通过smtp.gmail.com将邮件发送给任何人。

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

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

答案 3 :(得分:0)

在您的本地计算机中禁用防病毒功能,一旦对我有用,请尝试

答案 4 :(得分: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