All Products
Search
Document Center

Direct Mail:SMTP Java call example

Last Updated:Oct 29, 2025

This topic describes how to use JavaMail to send emails over the Simple Mail Transfer Protocol (SMTP).

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

Sample code:

package org.example;

import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
//import java.net.MalformedURLException;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;
//import java.util.HashMap;
//import java.util.Base64;
//import java.net.URL;
//import java.io.IOException;
//import java.io.InputStream;
//import javax.mail.util.ByteArrayDataSource;
//import java.net.URLEncoder;
//import javax.activation.DataHandler;
//import javax.activation.FileDataSource;
//import javax.activation.URLDataSource;

//import com.google.gson.GsonBuilder;

public class SampleMail {
    // Configure constants.
    private static final String SMTP_HOST = "smtpdm.aliyun.com";
    private static final int SMTP_PORT = 80;
    private static final String USER_NAME = "sender address";
    private static final String PASSWORD = "xxxxxxx";

    protected static String genMessageID(String mailFrom) {
        // Generate the Message-ID.
        if (!mailFrom.contains("@")) {
            throw new IllegalArgumentException("Invalid email format: " + mailFrom);
        }
        String domain = mailFrom.split("@")[1];
        UUID uuid = UUID.randomUUID();
        return "<" + uuid.toString() + "@" + domain + ">";
    }

    private static void setRecipients(MimeMessage message, Message.RecipientType type, String[] recipients)
            throws MessagingException {
        // Set recipient addresses.
        if (recipients == null || recipients.length == 0) {
            return; // Do not set if the list is empty.
        }
        InternetAddress[] addresses = new InternetAddress[recipients.length];
        for (int h = 0; h < recipients.length; h++) {
            addresses[h] = new InternetAddress(recipients[h]);
        }
        message.setRecipients(type, addresses);
    }

    public static void main(String[] args) throws MessagingException, UnsupportedEncodingException {
        // Configure environment properties for sending emails.
        final Properties props = new Properties();

        // Specifies that SMTP requires identity verification to send emails.
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", SMTP_HOST);
        // Set the port.
        props.put("mail.smtp.port", SMTP_PORT);// or "25". If you use SSL, remove the configuration for port 80 or 25 and use the following configuration:
        // Encryption method.
        //props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        //props.put("mail.smtp.socketFactory.fallback", "false");// Disable backoff to non-encrypted connections.
        //props.put("mail.smtp.socketFactory.port", "465");
        //props.put("mail.smtp.port", "465");

        props.put("mail.smtp.from", USER_NAME);    // The mailfrom parameter.
        props.put("mail.user", USER_NAME);// The sender's account, which is the sender address created in the console.
        props.put("mail.password", PASSWORD);// The SMTP password for the sender address. Set this password for the sender address in the console.
        //props.put("mail.smtp.connectiontimeout", 1000);
        System.setProperty("mail.mime.splitlongparameters", "false");// Resolves display issues caused by excessively long attachment names.
        //props.setProperty("mail.smtp.ssl.enable", "true");  // Use this with port 465.

        // Build authorization information for SMTP identity verification.
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USER_NAME, PASSWORD);
            }
        };

        // Create an email session using the environment properties and authorization information.
        Session mailSession = Session.getInstance(props, authenticator);

        String messageIDValue = genMessageID(USER_NAME);
        MimeMessage message = new MimeMessage(mailSession) {
            @Override
            protected void updateMessageID() throws MessagingException {
                setHeader("Message-ID", messageIDValue);
            }
        };

        try {
            // Set the sender's email address and nickname. Enter the sender address that you configured in the console. This address must be the same as the mail.user value. You can customize the nickname.
            InternetAddress from = new InternetAddress(USER_NAME, "sender nickname");// The from parameter. This lets you send emails on behalf of another address. Note: Emails sent on behalf of another address are likely to be rejected by recipients or moved to the spam folder.
            message.setFrom(from);

            setRecipients(message, Message.RecipientType.TO, new String[]{"recipient_address_1", "recipient_address_2"});
            setRecipients(message, Message.RecipientType.CC, new String[]{"recipient_address_3", "recipient_address_4"});
            setRecipients(message, Message.RecipientType.BCC, new String[]{"recipient_address_5", "recipient_address_6"});

            InternetAddress replyToAddress = new InternetAddress("reply_to_address");
            message.setReplyTo(new Address[]{replyToAddress});// Optional. Set the reply-to address.
            message.setSentDate(new Date());
            message.setSubject("Test subject");
//            message.setContent("Test TXT content 1", "text/text;charset=UTF-8");// Plain text content. This is overwritten if you use MimeBodyPart.
//            or
//            message.setContent("Test<br> HTML content 2", "text/html;charset=UTF-8");// HTML content. This is overwritten if you use MimeBodyPart.

//            // To enable the email tracking service, use the following code to set the tracking link header. For prerequisites and constraints, see "How to enable the data tracking feature?".
//            String tagName = "tagname4";
//            HashMap<String, String> trace = new HashMap<>();
//            // This is the string "1".
//            trace.put("OpenTrace", "1");      // Enable email open tracking.
//            trace.put("LinkTrace", "1");     // Enable URL click tracking in emails.
//            trace.put("TagName", tagName);   // The tag name created in the console.
//            String jsonTrace = new GsonBuilder().setPrettyPrinting().create().toJson(trace);
//            //System.out.println(jsonTrace);
//            String base64Trace = new String(Base64.getEncoder().encode(jsonTrace.getBytes()));
//            // Set the tracking link header.
//            message.addHeader("X-AliDM-Trace", base64Trace);
            // Sample value in the original EML file: X-AliDM-Trace: eyJUYWdOYW1lIjoiVGVzdCIsIk9wZW5UcmFjZSI6IjEiLCJMaW5rVHJhY2UiOiIxIn0=

            // Send attachments and content.
            // Create a multipart message.
            Multipart multipart = new MimeMultipart();

//            // Create a BodyPart for plain text content.
//            BodyPart textPart = new MimeBodyPart();
//            textPart.setText("Test TXT content 3");
//            multipart.addBodyPart(textPart);

            // Create a BodyPart for HTML content.
            BodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent("Test<br> HTML content 4", "text/html;charset=UTF-8");// Set the email content. This overwrites the previous message.setContent call.
            multipart.addBodyPart(htmlPart);

//            // Attachment section.
//            // Send attachments. The total email size cannot exceed 15 MB. Create a message part.
//            // Send local attachments.
//            String[] fileList = {"C:\\Users\\Downloads\\test1.txt", "C:\\Users\\Downloads\\test2.txt"};
//            for (String filePath : fileList) {
//                MimeBodyPart mimeBodyPart = new MimeBodyPart();
//
//                FileDataSource fileDataSource = new FileDataSource(filePath);
//                mimeBodyPart.setDataHandler(new DataHandler(fileDataSource));
//                // Handle garbled text in Chinese attachment names that include file paths.
//                mimeBodyPart.setFileName(MimeUtility.encodeWord(fileDataSource.getName()));
//                mimeBodyPart.addHeader("Content-Transfer-Encoding", "base64");
//                multipart.addBodyPart(mimeBodyPart);
//            }


//            // Send URL attachments.
//            String[] fileListUrl = {"https://example.oss-cn-shanghai.aliyuncs.com/xxxxxxxxxxx1.png", "https://example.oss-cn-shanghai.aliyuncs.com/xxxxxxxxxxx2.png"};
//            for (String fileUrl : fileListUrl) {
//                URL url = new URL(fileUrl);
//                String filename = url.getPath();
//                filename = filename.substring(filename.lastIndexOf('/') + 1);
//                try (InputStream in = url.openStream()) {
//                    // Create an attachment part.
//                    MimeBodyPart attachmentPart = new MimeBodyPart();
//                    // Use a byte array data source.
//                    ByteArrayDataSource ds = new ByteArrayDataSource(in, "application/octet-stream");
//                    attachmentPart.setDataHandler(new javax.activation.DataHandler(ds));
//                    attachmentPart.setFileName(filename);
//                    attachmentPart.setDisposition(MimeBodyPart.ATTACHMENT);
//                    multipart.addBodyPart(attachmentPart);
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }

            // Add the complete message.
            message.setContent(multipart);
            // End of the attachment sending code.

            //mailSession.setDebug(true);// Enable debug mode.
            Transport.send(message);
            System.out.println("Sent successfully!");
        } catch (MessagingException | UnsupportedEncodingException e) {
            System.err.println("Failed to send the email: " + e.getMessage());
            e.printStackTrace();
//        } catch (MalformedURLException e) {
//            throw new RuntimeException(e);
        }

    }

}