通过 JavaMail API 发送邮件时无法连接到 SMTP 主机异常

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22955142/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 19:36:00  来源:igfitidea点击:

Could not connect to SMTP host exception while sending mail through JavaMail API

javajavamail

提问by Sandeep Reddy K.

I am trying to send a email to Gmail account using JavaMail API. I have done the following code.I want to sent mail to multiple recipents.But it is not working.It its giving an exception like "could not connect to SMTP host.sending failed"

我正在尝试使用 JavaMail API 向 Gmail 帐户发送电子邮件。我已经完成了以下代码。我想将邮件发送给多个配方。但它不起作用。它给出了一个异常,如“无法连接到 SMTP 主机。发送失败”

package com.cts.email;

import java.util.Properties;


import javax.mail.Message; 
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {     
      Properties emailProperties;  
      Session mailSession;
      MimeMessage emailMessage;   
      public static void main(String args[]) throws MessagingException, javax.mail.MessagingException {      
            SendEmail javaEmail = new SendEmail();  
            Session session=javaEmail.setMailServerProperties();   
            javaEmail.createEmailMessage(session);  
          //  javaEmail.sendEmail(); 
            }    
      public Session setMailServerProperties() {    
          Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        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("my_email","my_password");
                }
            });
                return session; 
      }    

            public void createEmailMessage(Session session) throws MessagingException, javax.mail.MessagingException {    
                  String[] toEmails = { "[email protected]","[email protected]" };  
                  try {
                      for (String to_mail : toEmails) {


                    Message message = new MimeMessage(session);
                    message.setFrom(new InternetAddress("[email protected]"));
                    message.setRecipients(Message.RecipientType.TO,
                            InternetAddress.parse(to_mail));
                    message.setSubject("Java Email");
                    message.setText("This is an email sent by <b>JavaMail</b> api.");

                    Transport.send(message);



                }
                      System.out.println("Done");
                  }catch (MessagingException e) {
                    throw new RuntimeException(e);
                }   
                }    


                        }

I am getting following exception:

我收到以下异常:

Exception in thread "main" java.lang.RuntimeException: javax.mail.SendFailedException: Sending failed;
  nested exception is:
    class javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
  nested exception is:
    java.net.ConnectException: Connection refused: connect
    at com.cts.email.SendEmail.createEmailMessage(SendEmail.java:62)
    at com.cts.email.SendEmail.main(SendEmail.java:21)
Caused by: javax.mail.SendFailedException: Sending failed;
  nested exception is:
    class javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
  nested exception is:
    java.net.ConnectException: Connection refused: connect
    at javax.mail.Transport.send0(Transport.java:218)
    at javax.mail.Transport.send(Transport.java:80)
    at com.cts.email.SendEmail.createEmailMessage(SendEmail.java:55)
    ... 1 more

please help me through this.

请帮我解决这个问题。

回答by JAN

This works for me :

这对我有用:

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMail {


    public static void sendEmail(String to)
    {
        final String username = "your_usename_goes_here";
        final String password = "your_password_goes_here";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
          });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("[email protected]"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(to));
            message.setSubject("A testing mail header !!!");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } 

        catch (MessagingException e) 
        {
            // throw new RuntimeException(e);
            System.out.println("Username or Password are incorrect ... exiting !");
        }
    }


    public static void main(String[] args) 
    {
        String to = "[email protected]";
        sendEmail(to);
    }
}

回答by Bill Shannon

You almost certainly have a firewall or anti-virus program blocking your ability to connect. See the JavaMail FAQ for tips for debugging connection problems.

您几乎肯定有防火墙或防病毒程序阻止了您的连接能力。有关调试连接问题的提示,请参阅 JavaMail FAQ 。

回答by Bill Shannon

Be sure to configure your antivirus software and firewall to allow the connections

请务必配置您的防病毒软件和防火墙以允许连接

String user= "[email protected]";
String pass= "FROMPASSWORD";
String mailhost = "smtp.gmail.com";

Properties props= System.getProperties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.user", user);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
        "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");

Session session= Session.getDefaultInstance(props, new javax.mail.Authenticator()  {

    @Override
    protected javax.mail.PasswordAuthentication getPasswordAuthentication(){
        return new javax.mail.PasswordAuthentication(user,pass);   
    }
}); 

MimeMessage message= new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("Checking....");
message.setText("Successful",user,pass);
Transport.send(message);
System.out.println("Sent!");