javaproxyjakarta-mailfirewallconnectexception

JavaMail - Setting up ports, proxy and firewall


I'm trying to make a very simple E-Mail application, and I have written a few lines of basic code. One exception I keep getting is com.sun.mail.util.MailConnectException. Is there a simple way to code my way through a proxy or a firewall without messing with the connectivity settings of the sending machine?

My code so far:

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

public class SendHTMLMail {
public static void main(String[] args) {
    // Recipient ID needs to be set
    String to = "test@test.com";

    // Senders ID needs to be set
    String from = "mytest@test.com";

    // Assuming localhost
    String host = "localhost";

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

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

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

    try {
        // Default MimeMessage object
        MimeMessage mMessage = new MimeMessage(session);

        // Set from
        mMessage.setFrom(new InternetAddress(from));

        // Set to
        mMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

        // Set subject
        mMessage.setSubject("This is the subject line");

        // Set the actual message
        mMessage.setContent("<h1>This is the actual message</h1>", "text/html");

        // SEND MESSAGE
        Transport.send(mMessage);
        System.out.println("Message sent...");
    }catch (MessagingException mex) {
        mex.printStackTrace();
    }
}

Solution

  • There are a bunch of properties you need to set correctly in the right combination for proxies to work in JavaMail. And JavaMail only supports anonymous SOCKS proxies.

    Simple Java Mail however takes cares of these properties for you and adds authenticated proxy support on top of that. It's open source and still actively developed.

    Here's how your code would look with Simple Java Mail:

    Mailer mailer = new Mailer(// note: from 5.0.0 on use MailerBuilder instead
            new ServerConfig("localhost", thePort, theUser, thePasswordd),
            TransportStrategy.SMTP_PLAIN,
            new ProxyConfig(proxyHost, proxyPort /*, proxyUser, proxyPassword */)
    );
    
    mailer.sendMail(new EmailBuilder()
            .from("mytest", "mytest@test.com")
            .to("test", "test@test.com")
            .subject("This is the subject line")
            .textHTML("<h1>This is the actual message</h1>")
            .build());
    
    System.out.println("Message sent...");
    

    A lot less code and very expressive.