首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaMail 發送郵件完整教學:從 James Server 搭建到帶附件發送實戰

     編輯:Java 相關知識

郵件協議基礎

協議全稱用途預設埠
SMTPSimple Mail Transfer Protocol發送郵件25 / 465(SSL) / 587(TLS)
POP3Post Office Protocol v3接收郵件(下載到本地)110 / 995(SSL)
IMAPInternet Message Access Protocol接收郵件(伺服器同步)143 / 993(SSL)

一、搭建 James 郵件伺服器(測試環境)

  1. 下載 apache-james-2.3.2.zip 解壓
  2. 執行 bin/run.bat 啟動(預設埠 4555 管理、25 SMTP)
  3. 配置 apps/james/SAR-INF/config.xml 設定域名、用戶庫等
  4. 啟用 Telnet 客戶端(控制台 → 程式 → 開啟/關閉 Windows 功能)

二、建立測試用戶

telnet localhost 4555
# 登入管理員
root
root
# 新增用戶
adduser user1 password1
adduser user2 password2

三、Outlook 客戶端配置驗證

  • 工具 → 選項 → 郵件設置 → 電子郵件賬戶 → 新增
  • 伺服器類型:POP3/SMTP
  • 輸入/輸出伺服器:localhost(或實際 IP)
  • 用戶名:user1,密碼:password1

Outlook 配置截圖

四、JavaMail 核心發送代碼

1. 認證器

import javax.mail.*;

public class EmailAuthenticator extends Authenticator {
    private String username, password;
    public EmailAuthenticator(String username, String password) {
        this.username = username;
        this.password = password;
    }
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
}

2. 郵件發送類

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

public class MailSender {
    private String host, from, to, subject, content, username, password;

    public MailSender(String host, String username, String password,
                      String from, String to, String subject, String content) {
        this.host = host; this.username = username; this.password = password;
        this.from = from; this.to = to; this.subject = subject; this.content = content;
    }

    public void send() {
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "25");

        Session session = Session.getInstance(props, new EmailAuthenticator(username, password));

        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            msg.setSubject(subject, "UTF-8");
            msg.setContent(content, "text/html;charset=UTF-8");
            msg.setSentDate(new Date());

            Transport transport = session.getTransport("smtp");
            transport.connect();
            transport.sendMessage(msg, msg.getAllRecipients());
            transport.close();
            System.out.println("郵件發送成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 測試主程式

public class TestMail {
    public static void main(String[] args) {
        new MailSender(
            "192.168.17.176", "user1", "password1",
            "user1@mail.com", "user2@mail.com",
            "會議通知",
            "XX你好!請於今天下午16:00 準時到B01會議室召開技術討論會。"
        ).send();
    }
}

發送成功控制台 Outlook 收到郵件

五、發送帶附件郵件(Spring JavaMailSender)

import org.springframework.mail.javamail.*;

public class MailWithAttachment {
    private JavaMailSender mailSender;

    public void setMailSender(JavaMailSender mailSender) { this.mailSender = mailSender; }

    public void send() throws MessagingException, IOException {
        MimeMessage msg = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8");

        helper.setFrom("user1@mail.com");
        helper.setTo("user2@mail.com");
        helper.setSubject("測試附件");
        helper.setText("每日一笑,開開心心!!!");

        // 附件 1
        ClassPathResource file1 = new ClassPathResource("/attachfiles/test.doc");
        helper.addAttachment(file1.getFilename(), file1.getFile());

        // 附件 2(中文檔名需編碼)
        ClassPathResource file2 = new ClassPathResource("/attachfiles/附件測試文件.doc");
        helper.addAttachment(MimeUtility.encodeWord(file2.getFilename()), file2.getFile());

        mailSender.send(msg);
    }
}

Spring 配置

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="192.168.17.176" />
    <property name="port" value="25" />
    <property name="username" value="user1" />
    <property name="password" value="password1" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.timeout">5000</prop>
        </props>
    </property>
</bean>

<bean id="mailWithAttachment" class="com.example.MailWithAttachment">
    <property name="mailSender" ref="mailSender" />
</bean>

Spring 配置截圖1 Spring 配置截圖2 Spring 配置截圖3

生產環境注意事項

  1. SSL/TLS:生產必須啟用 mail.smtp.ssl.enable=true 或 STARTTLS,埠 465/587
  2. 憑證驗證:自簽憑證需配置 mail.smtp.ssl.trust=* 或導入信任庫
  3. 大量發送:使用連接池、異步佇列、批次發送,避免阻塞主線程
  4. 退信處理:配置 mail.smtp.from、監聽彈回郵件
  5. 編碼統一:全鏈路 UTF-8,附件檔名用 MimeUtility.encodeWord
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved