Java 自动发送电子邮件

Java 自动发送电子邮件,java,email,jakarta-mail,Java,Email,Jakarta Mail,我正在尝试设置一个可以自动发送电子邮件的程序。但是,第一步对我来说根本不起作用,它给出了以下错误: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: 127.0.0.1, 25; timeout -1; nested exception is: java.net.ConnectException: Connection refused: connect at com.sun.mail

我正在尝试设置一个可以自动发送电子邮件的程序。但是,第一步对我来说根本不起作用,它给出了以下错误:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: 127.0.0.1, 25; timeout -1;
  nested exception is:
    java.net.ConnectException: Connection refused: connect
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2209)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740)
    at javax.mail.Service.connect(Service.java:366)
    at javax.mail.Service.connect(Service.java:246)
    at javax.mail.Service.connect(Service.java:195)
    at javax.mail.Transport.send0(Transport.java:254)
    at javax.mail.Transport.send(Transport.java:124)
    at server.main(server.java:46)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.base/java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.base/java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225)
    at java.base/java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402)
    at java.base/java.net.Socket.connect(Socket.java:591)
    at java.base/java.net.Socket.connect(Socket.java:540)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:353)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:239)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2175)
    ... 7 more
代码如下:

// File Name SendEmail.java

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class server {

   public static void main(String [] args) {    
      // Recipient's email ID needs to be mentioned.
      String to = "my other email properly written";

      // Sender's email ID needs to be mentioned
      String from = "my email properly written";

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

      // 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("This is the Subject Line!");

         // Now set the actual message
         message.setText("This is actual message");

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

有人知道为什么会发生这种情况以及如何解决吗?我的电子邮件实际上是打开的等,因为它是本地主机,我不知道为什么它不会工作

访问SMTP服务器需要SMTP主机端口和安全设置(如果适用)

Properties props = new java.util.Properties();
props.put("mail.smtp.host", "hostname") #
props.put("mail.smtp.port", "portnumber") #25
props.put("mail.smtp.starttls.enable", "boolean value true or false") 
props.put("mail.smtp.auth", "boolean value true or false")
通常,会话需要使用用户名、密码和属性创建一个Java邮件会话,这在上面的代码中是缺失的。为了示范,

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

您是否在本地主机上安装了SMTP服务器?您是在本地主机上运行电子邮件服务器,还是只打开了一个电子邮件客户端?@AJNeufeld我正在运行windows mail,它始终安装在windows上。现在我的问题是,这算是本地主机还是客户端?不过也安装了hMailServer,现在尝试另一种方式“邮件是电子邮件和新闻组客户端…”。hMailServer听起来像是一个真正的服务器,所以如果它在本地主机上运行,您的代码应该可以工作。但是,您不需要在本地主机上运行服务器;您只需要连接到实际的电子邮件服务器,并通过该服务器发送邮件。它不必在本地主机上。与其费劲地安装和运行自己的服务器,或者不小心为垃圾邮件创建了一个开放式中继,不如使用现有的电子邮件服务。第一个代码与System.getProperties不一样吗?抛出MessaginException的代码块需要try catch。设置属性和创建会话的代码不会出现。因此,在try-catch.No上面的代码不同,会话可以使用properties对象创建,也可以是一个新的property对象。只要邮件会话的连接属性设置正确,可能无法连接到smtp并仅使用指定的主机名发送邮件。仍然无法工作,可能是因为例如Firewall我的服务器说它已处理了这些邮件,但是在实际的客户端中,我看不到消息,也看不到应该接收邮件的客户端中的消息