发送邮件错误,javax.mail.MessagingException:无法连接到SMTP主机:localhost,端口:25;

10

这是我的代码

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


public class MailSendClass {
    public static void main (String [] args){

      // Recipient's email ID needs to be mentioned.
      String to = "abc82@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "xyz@gmail.com";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try{
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("Thanks for registering on our website!");

         // Now set the actual message
         message.setText("Welcome To Job Portal !!!!  Again Thanks ");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }

    }
}

每次我都会遇到这个错误

javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
  nested exception is:
    java.net.ConnectException: Connection refused: connect
    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:291)
    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 MailSendClass.main(MailSendClass.java:58)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    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)
    ... 7 more
BUILD SUCCESSFUL (total time: 3 seconds)

我不明白为什么会出现这个错误。请帮我修复这个错误。


1
请问本地的SMTP服务器是什么? - fabien t
2
这可能很明显,但是您的开发机器上是否运行着一个实际监听本地主机的邮件服务器? - Markus W Mahlberg
Apache Tomcat 服务器 - Ketan G
5个回答

4

错误信息已经很明显了:javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;

你没有在本地主机上安装SMTP服务器,但是你却在配置中指定它:

  // Assuming you are sending email from localhost
  String host = "localhost";
  ...
  // Setup mail server
  properties.setProperty("mail.smtp.host", host);

因此,您必须:

  • 要么在本地系统上配置本地SMTP服务器作为转发器(Postfix或sendmail是两个知名的服务器)
  • 要么配置一个虚拟服务器,只跟踪邮件请求但不尝试发送邮件(Python已知有这样的虚拟服务器)
  • 要么使用您被允许使用的服务器配置应用程序-在企业环境中联系您的系统管理员,在个人环境中联系您的ISP。无论如何,即使要配置真正的中继,您也需要这样做。

我在我的应用程序中使用GlassFish服务器。 - Ketan G
据我所知,GlassFish不是SMTP服务器...只需在命令行中尝试“telnet localhost 25”,如果出现错误,则表示本地未运行SMTP服务器。 - Serge Ballesta
我没有完全理解你的意思。请给我完整的答案,因为我对这些事情不了解。 - Ketan G
1
@KetanGupta:Apache是一个HTTP服务器,它知道如何处理HTTP或HTTPS请求并发送资源或将请求转发到另一个HTTP[S]服务器。Tomcat或GlassFish是HTTP servlet容器,它们知道如何处理HTTP请求并将其传递给servlet和过滤器。Postfix或sendmail知道如何处理SMTP请求(默认端口25)。这是一种不同的协议,并由不同的服务器应用程序处理。您知道如何从开发机器发送邮件以及本地邮件程序的配置吗? - Serge Ballesta

3

您应该使用免费的 Google SMTP 服务器进行测试。

mail.host=smtp.gmail.com
mail.username=//your gmail
mail.password=//your password
mail.defaultEncoding=UTF-8
mail.smtp.auth=true
mail.smtp.starttls.required=true
mail.smtp.starttls.enable=true
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback=false
mail.smtp.port=465
mail.smtp.socketFactory.port=465

接下来,使用您的 Gmail 登录并打开较不安全的应用


1
首先,不要设置那些socketFactory属性,因为它们是不必要的(http://www.oracle.com/technetwork/java/javamail/faq/index.html#commonmistakes)。其次,没有mail.password属性,也没有mail.defaultEncoding属性。请阅读JavaMail FAQ以了解正确使用Gmail的方法(http://www.oracle.com/technetwork/java/javamail/faq/index.html#gmail)。 - Bill Shannon

3
这是可行的解决方案,保证有效。
1)首先打开您要发送邮件的 Gmail 账户,例如在您的情况下 "xyz@gmail.com"。
2)打开以下链接: https://support.google.com/accounts/answer/6010255?hl=en 3)点击“进入我的帐户中的“较不安全应用程序”部分”选项。
4)然后打开它。
5)就这样(:)

1

你应该看看这两行:

javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
Caused by: java.net.ConnectException: Connection refused: connect

错误信息是:“在本地主机的25端口上没有正在侦听的内容。”
您尝试使用localhost:25作为邮件服务器,但那里没有任何服务器。

这个问题的解决方案是什么? - Ketan G
2
在您的计算机上正确配置本地SMTP服务器。如果是Linux系统,可以考虑安装Postfix。 - ScreamingTree

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接