JavaMail 是 Sun 發布的郵件編程 API,配合 Apache James(純 Java 實現的開源郵件服務器)可快速構建郵件收發系統。本文記錄 James 搭建、Outlook 客戶端配置、JavaMail 發送普通/帶附件郵件全流程。
Session、Message、Transport、Store、Folder、Authenticatorapache-james-2.3.2.zipbin/run.bat 啟動telnet localhost 4555 進入管理控制台(默認用戶/密碼:root/root)adduser username password 創建郵箱賬號apps/james/SAR-INF/config.xml 配置域名等hosts 文件映射域名到 127.0.0.1// 認證器
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();
}
}
}
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>
charset=UTF-8,附件名用 MimeUtility.encodeWordmaxmessagesize、Spring maxUploadSizeJames + JavaMail 提供輕量級郵件解決方案,適合開發測試及中小型項目。生產環境建議對接企業級郵件服務(Exchange、阿里云企業郵箱等),並引入重試、熔斷、異步隊列機制保障可靠性。