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

JavaMail 整合 Apache James 郵件服務器完整實戰:從搭建到發送帶附件郵件

     編輯:Java 綜合教學

JavaMail 整合 Apache James 郵件服務器完整實戰:從搭建到發送帶附件郵件

JavaMail 是 Sun 發布的郵件編程 API,配合 Apache James(純 Java 實現的開源郵件服務器)可快速構建郵件收發系統。本文記錄 James 搭建、Outlook 客戶端配置、JavaMail 發送普通/帶附件郵件全流程。

核心協議與類

  • SMTP:發送郵件(端口 25)
  • POP3:接收郵件(端口 110)
  • IMAP:現代替代協議(端口 143)
  • 核心類:Session、Message、Transport、Store、Folder、Authenticator

James 服務器搭建

  1. 下載 apache-james-2.3.2.zip
  2. 運行 bin/run.bat 啟動
  3. telnet localhost 4555 進入管理控制台(默認用戶/密碼:root/root)
  4. 執行 adduser username password 創建郵箱賬號
  5. 修改 apps/james/SAR-INF/config.xml 配置域名等

Outlook 客戶端配置

  • 郵件服務器:本機 IP 或 localhost
  • 賬號:James 中創建的用戶名
  • 修改 hosts 文件映射域名到 127.0.0.1
  • 測試收發驗證服務器正常

JavaMail 發送普通郵件

// 認證器
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);
    }
}

// 郵件發送類
public class Mail {
    private String mailServer = "192.168.17.176";
    private String username = "hq@mail.com";
    private String password = "hq";
    private String from = "wj";
    private String to = "wj@mail.com";
    private String subject = "測試郵件";
    private String content = "這是一封測試郵件!";
    
    public void send() {
        Properties props = System.getProperties();
        props.put("mail.smtp.host", mailServer);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "25");
        
        Session session = Session.getInstance(props, new EmailAuthenticator(username, password));
        try {
            Message msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            msg.setSubject(subject);
            msg.setContent(content, "text/html;charset=gbk");
            msg.setSentDate(new Date());
            
            Transport transport = session.getTransport("smtp");
            transport.send(msg, msg.getAllRecipients());
            transport.close();
            System.out.println("發送成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

發送帶附件郵件(Spring 整合)

public class MailWithAttachment {
    private JavaMailSender mailSender;  // Spring 注入
    
    public void send() throws MessagingException, IOException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        
        helper.setFrom("hq@mail.com");
        helper.setTo("wj@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(mimeMessage);
    }
}

// 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="hq@mail.com"/>
    <property name="password" value="hq"/>
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
        </props>
    </property>
</bean>

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

常見問題排查

  • 連接超時:檢查防火牆、James 端口綁定、網絡連通性
  • 認證失敗:確認用戶名密碼、SMTP AUTH 配置
  • 中文亂碼:設置 charset=UTF-8,附件名用 MimeUtility.encodeWord
  • 附件大小限制:James 配置 maxmessagesize、Spring maxUploadSize

總結

James + JavaMail 提供輕量級郵件解決方案,適合開發測試及中小型項目。生產環境建議對接企業級郵件服務(Exchange、阿里云企業郵箱等),並引入重試、熔斷、異步隊列機制保障可靠性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved