全部产品
Search
文档中心

Direct Mail:Contoh pemanggilan Java SMTP

更新时间:Nov 10, 2025

Topik ini menjelaskan cara menggunakan JavaMail untuk mengirim email melalui 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>

Kode contoh:

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 {
    // Konfigurasi konstanta.
    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) {
        // Hasilkan Message-ID.
        if (!mailFrom.contains("@")) {
            throw new IllegalArgumentException("Format email tidak valid: " + 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 {
        // Tetapkan alamat penerima.
        if (recipients == null || recipients.length == 0) {
            return; // Jangan tetapkan jika daftarnya kosong.
        }
        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 {
        // Konfigurasi properti lingkungan untuk mengirim email.
        final Properties props = new Properties();

        // Menentukan bahwa SMTP memerlukan verifikasi identitas untuk mengirim email.
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", SMTP_HOST);
        // Tetapkan port.
        props.put("mail.smtp.port", SMTP_PORT);// atau "25". Jika Anda menggunakan SSL, hapus konfigurasi untuk port 80 atau 25 dan gunakan konfigurasi berikut:
        // Metode enkripsi.
        //props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        //props.put("mail.smtp.socketFactory.fallback", "false");// Nonaktifkan fallback ke koneksi tanpa enkripsi.
        //props.put("mail.smtp.socketFactory.port", "465");
        //props.put("mail.smtp.port", "465");

        props.put("mail.smtp.from", USER_NAME);    // Parameter mailfrom.
        props.put("mail.user", USER_NAME);// Akun pengirim, yaitu alamat pengirim yang dibuat di Konsol.
        props.put("mail.password", PASSWORD);// Kata sandi SMTP untuk alamat pengirim. Tetapkan kata sandi ini untuk alamat pengirim di Konsol.
        //props.put("mail.smtp.connectiontimeout", 1000);
        System.setProperty("mail.mime.splitlongparameters", "false");// Mengatasi masalah tampilan yang disebabkan oleh nama lampiran yang terlalu panjang.
        //props.setProperty("mail.smtp.ssl.enable", "true");  // Gunakan ini dengan port 465.

        // Bangun informasi otorisasi untuk verifikasi identitas SMTP.
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USER_NAME, PASSWORD);
            }
        };

        // Buat sesi email menggunakan properti lingkungan dan informasi otorisasi.
        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 {
            // Tetapkan alamat email dan nama panggilan pengirim. Masukkan alamat pengirim yang Anda konfigurasi di Konsol. Alamat ini harus sama dengan nilai mail.user. Anda dapat menyesuaikan nama panggilan.
            InternetAddress from = new InternetAddress(USER_NAME, "sender nickname");// Parameter from. Ini memungkinkan Anda mengirim email atas nama alamat lain. Catatan: Email yang dikirim atas nama alamat lain kemungkinan besar akan ditolak oleh penerima atau dipindahkan ke folder spam.
            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});// Opsional. Tetapkan alamat balasan.
            message.setSentDate(new Date());
            message.setSubject("Subjek uji coba");
//            message.setContent("Konten TXT uji coba 1", "text/text;charset=UTF-8");// Konten teks biasa. Ini akan ditimpa jika Anda menggunakan MimeBodyPart.
//            atau
//            message.setContent("Konten HTML uji coba<br> 2", "text/html;charset=UTF-8");// Konten HTML. Ini akan ditimpa jika Anda menggunakan MimeBodyPart.

//            // Untuk mengaktifkan layanan pelacakan email, gunakan kode berikut untuk menetapkan header tautan pelacakan. Untuk prasyarat dan batasan, lihat "Bagaimana cara mengaktifkan fitur pelacakan data?".
//            String tagName = "tagname4";
//            HashMap<String, String> trace = new HashMap<>();
//            // Ini adalah string "1".
//            trace.put("OpenTrace", "1");      // Aktifkan pelacakan pembukaan email.
//            trace.put("LinkTrace", "1");     // Aktifkan pelacakan klik URL dalam email.
//            trace.put("TagName", tagName);   // Nama tag yang dibuat di Konsol.
//            String jsonTrace = new GsonBuilder().setPrettyPrinting().create().toJson(trace);
//            //System.out.println(jsonTrace);
//            String base64Trace = new String(Base64.getEncoder().encode(jsonTrace.getBytes()));
//            // Tetapkan header tautan pelacakan.
//            message.addHeader("X-AliDM-Trace", base64Trace);
            // Nilai contoh dalam file EML asli: X-AliDM-Trace: eyJUYWdOYW1lIjoiVGVzdCIsIk9wZW5UcmFjZSI6IjEiLCJMaW5rVHJhY2UiOiIxIn0=

            // Kirim lampiran dan konten.
            // Buat pesan multipart.
            Multipart multipart = new MimeMultipart();

//            // Buat BodyPart untuk konten teks biasa.
//            BodyPart textPart = new MimeBodyPart();
//            textPart.setText("Konten TXT uji coba 3");
//            multipart.addBodyPart(textPart);

            // Buat BodyPart untuk konten HTML.
            BodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent("Konten HTML uji coba<br> 4", "text/html;charset=UTF-8");// Tetapkan konten email. Ini menimpa pemanggilan message.setContent sebelumnya.
            multipart.addBodyPart(htmlPart);

//            // Bagian lampiran.
//            // Kirim lampiran. Ukuran total email tidak boleh melebihi 15 MB. Buat bagian pesan.
//            // Kirim lampiran lokal.
//            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));
//                // Tangani teks yang rusak pada nama lampiran berbahasa Tionghoa yang mencakup jalur file.
//                mimeBodyPart.setFileName(MimeUtility.encodeWord(fileDataSource.getName()));
//                mimeBodyPart.addHeader("Content-Transfer-Encoding", "base64");
//                multipart.addBodyPart(mimeBodyPart);
//            }


//            // Kirim lampiran dari URL.
//            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()) {
//                    // Buat bagian lampiran.
//                    MimeBodyPart attachmentPart = new MimeBodyPart();
//                    // Gunakan sumber data berbasis larik byte.
//                    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);
//                }
//            }

            // Tambahkan pesan lengkap.
            message.setContent(multipart);
            // Akhir kode pengiriman lampiran.

            //mailSession.setDebug(true);// Aktifkan mode debug.
            Transport.send(message);
            System.out.println("Berhasil dikirim!");
        } catch (MessagingException | UnsupportedEncodingException e) {
            System.err.println("Gagal mengirim email: " + e.getMessage());
            e.printStackTrace();
//        } catch (MalformedURLException e) {
//            throw new RuntimeException(e);
        }

    }

}