Search code examples
javasmtpjakarta-mail

Java mail has connection errors


I'm trying to send an email using my java application, but it always gives me a connection error back. So my code looks like this:

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

public class SendMail {

public static void main(String [] args) {

    String to = "[email protected]";
    String from = "[email protected]";
    String host = "localhost";

    Properties properties = System.getProperties();
    properties.setProperty("mail.user", "fromsomeone");
    properties.setProperty("mail.password", "passwordForSomeone");
    properties.setProperty("mail.smtp.host", host);

    Session session = Session.getDefaultInstance(properties);


    try {

        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
        message.setSubject("subject typed");
        message.setText("This is actual message which is just some lines");
        Transport.send(message);

    }catch (MessagingException mex) {
        mex.printStackTrace();
    }
}
}

of course I provide valid information (using my gmail account). And this is the error I get back:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
  nested exception is:
java.net.ConnectException: Connection refused (Connection refused)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2118)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:712)
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 email.SendMail.main(SendMail.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
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:331)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2084)
... 12 more

Can someone help me, what is wrong with my code? Thank you!


Solution

  • This will be help you to send mail via gmail account;

    public class MailMan {
    Session session = null;
    
    public MailMan() {
        if (session == null) {
            init();
        }
    }
    
    public void init() {
    
        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.getDefaultInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("EMAIL", "PASSWORD");
            }
        });
        if (session != null) {
            System.out.println("[OK]");
        } else {
            System.out.println("[NOK]");
        }
    }
    
    public void sendMail() {
        if (session == null) {
            System.exit(0);
        }
        try {
            String messageText = "";
            Message message = new MimeMessage(session);
            try {
                message.setFrom(new InternetAddress("no-reply", "No Reply"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            message.setReplyTo(InternetAddress.parse("no-reply"));
    
    
            message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("to_email")); 
            message.setSubject("TEST");
            message.setText(messageText);
    
            Transport.send(message);
    
            System.out.println("[OK]");
    
        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("Not Sent...");
        }
     }
    }
    

    And the main class;

    public class SendMail {
    
    public static void main(String[] args) {
        MailMan ma = new MailMan();
        ma.sendMail();
    
      }
    }
    

    After all you should turn on your "Access for less secure apps".