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

Java 郵件發送完整實戰:從郵件屬性封裝到 Spring 整合最佳實踐

     編輯:Java 綜合教學

Java 郵件發送完整實戰:從郵件屬性封裝到 Spring 整合最佳實踐

基於 JavaMail API 實現郵件發送是企業級應用的剛需。本文提供一套完整、可復用的郵件發送架構,覆蓋屬性封裝、認證器、發送工具類、異常處理及實戰測試。

架構設計:四大核心組件

  1. MailSendProper - 郵件屬性配置實體
  2. EmailMessage - 業務郵件信息封裝
  3. MailAttorney - SMTP 認證器
  4. MailSend - 發送核心工具類

核心代碼實現

1. 郵件屬性配置類

public class MailSendProper {
    private String host;           // SMTP 服務器
    private String port;           // 端口
    private String sendAddress;    // 發件人
    private String receiveAddress; // 收件人
    private String username;       // 登錄用戶名
    private String password;       // 登錄密碼/授權碼
    private boolean validate = true; // 是否認證
    private String subject;        // 主題
    private String content;        // 正文

    // Getter/Setter 省略...

    public Properties getProperties() {
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth", validate ? "true" : "false");
        return props;
    }
}

2. 業務郵件信息封裝

public class EmailMessage {
    private String title;
    private String context;
    private String toEmail;

    // 構造器、Getter/Setter 省略...
}

3. SMTP 認證器

public class MailAttorney extends Authenticator {
    private final String username;
    private final String password;

    public MailAttorney(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
}

4. 發送核心工具類

public class MailSend {
    /** 低層發送邏輯 */
    public static boolean mailTest(MailSendProper config) {
        Authenticator auth = config.isValidate() 
            ? new MailAttorney(config.getUsername(), config.getPassword()) 
            : null;

        Session session = Session.getInstance(config.getProperties(), auth);
        MimeMessage message = new MimeMessage(session);

        try {
            message.setFrom(new InternetAddress(config.getSendAddress()));
            message.setRecipient(Message.RecipientType.TO, 
                new InternetAddress(config.getReceiveAddress()));
            message.setSubject(config.getSubject());
            message.setSentDate(new Date());
            message.setText(config.getContent()); // 純文本;HTML 用 setContent(content, "text/html;charset=utf-8")
            
            Transport.send(message);
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }
    }

    /** 業務層發送入口 */
    public static boolean sendEmail(EmailMessage msg) {
        MailSendProper config = new MailSendProper();
        config.setHost("smtp.126.com");      // 根據郵箱服務商修改
        config.setPort("25");                // SSL 可用 465/587
        config.setValidate(true);
        config.setUsername("your_email@126.com");
        config.setPassword("your_auth_code"); // 注意:這裡是授權碼,非登錄密碼
        config.setSendAddress("your_email@126.com");
        config.setReceiveAddress(msg.getToEmail());
        config.setSubject(msg.getTitle());
        config.setContent(msg.getContext());
        
        return mailTest(config);
    }
}

常見郵箱 SMTP 配置參考

郵箱SMTP 服務器端口備註
126/163smtp.126.com25/465/587需開啟 SMTP 服務,獲取授權碼
QQsmtp.qq.com25/465/587需開啟 SMTP,獲取授權碼
Gmailsmtp.gmail.com587需開啟「低安全性應用」或應用專用密碼

實戰測試代碼

public static void main(String[] args) {
    EmailMessage msg = new EmailMessage();
    String code = String.valueOf(Math.random()).substring(3, 9); // 6位驗證碼
    msg.setTitle("郵箱驗證碼");
    msg.setContext("尊敬的用戶,您的驗證碼為:" + code + ",請勿泄露。");
    msg.setToEmail("target@qq.com");
    
    boolean success = MailSend.sendEmail(msg);
    System.out.println(success ? "發送成功" : "發送失敗");
}

進階優化建議

  • 異步發送:使用 @Async 或線程池,避免阻塞主線程
  • 模板引擎:引入 Thymeleaf/FreeMarker 支持 HTML 富文本模板
  • 連接池:配置 mail.smtp.connectionpool 復用連接
  • 重試機制:集成 Resilience4j 實現失敗重試、熔斷
  • Spring Boot 整合:直接配置 spring.mail.*,注入 JavaMailSender 簡化代碼

關鍵注意事項

  1. 密碼欄位填寫授權碼,非登錄密碼
  2. 必須在郵箱網頁端開啟 POP3/SMTP/IMAP 服務
  3. 企業郵箱可能需要配置 SSL/TLS:props.put("mail.smtp.ssl.enable", "true")
  4. 大量發送需注意頻率限制,避免被判定為垃圾郵件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved