如何使用Java拦截Java应用发出的外发邮件并读取邮件内容
实现方案概述
你需要在Java中实现一个轻量级SMTP服务端,监听2525端口,接收客户端发送的SMTP请求并解析邮件内容即可,不需要执行真实邮件转发逻辑,和FakeSMTP的核心运行逻辑完全一致。
推荐实现方式
方式1:使用SubEtha SMTP库(最高效便捷)
SubEtha SMTP是Java生态专门用于快速构建嵌入式SMTP服务的工具,封装了SMTP协议底层交互逻辑,开箱即用,不用自行实现协议细节。
- 第一步:引入依赖(Maven示例)
<dependency> <groupId>org.subethamail</groupId> <artifactId>subethasmtp</artifactId> <version>3.1.7</version> </dependency>
- 第二步:编写邮件拦截处理逻辑
通过实现对应监听器接口,即可在邮件投递回调方法中拿到完整的邮件数据,解析后即可读取所有字段:
import org.subethamail.smtp.*; import javax.mail.internet.MimeMessage; import java.io.InputStream; import java.util.Properties; public class CustomSmtpServer { public static void main(String[] args) { // 配置SMTP服务监听2525端口 SMTPServer server = new SMTPServer(new SimpleMessageListenerAdapter() { @Override public boolean accept(String from, String recipient) { // 可在此处配置邮件过滤规则,返回false即拒收对应邮件 return true; } @Override public void deliver(String from, String recipient, InputStream data) { try { // 把输入流解析为标准邮件对象 MimeMessage message = new MimeMessage(javax.mail.Session.getDefaultInstance(new Properties()), data); // 读取各类邮件字段 System.out.println("发件人: " + from); System.out.println("收件人: " + recipient); System.out.println("邮件主题: " + message.getSubject()); System.out.println("邮件正文: " + message.getContent()); // 如需读取附件、抄送、HTML正文等内容,直接调用MimeMessage对应API即可 } catch (Exception e) { e.printStackTrace(); } } }); server.setPort(2525); server.start(); System.out.println("自定义SMTP服务已启动,正在监听2525端口"); } }
运行上述代码后,Web应用向localhost:2525发送的所有邮件都会被该服务拦截,你可以在deliver方法中自行实现存储、转发、分析等后续处理逻辑。
方式2:基于Netty自行实现SMTP协议(适合高度自定义场景)
如果不想引入第三方依赖,可基于Netty网络框架实现SMTP协议的基础交互逻辑,按SMTP协议规范处理HELO、MAIL FROM、RCPT TO、DATA等指令,接收完整邮件内容后自行解析即可。该方式灵活性最高,但需要你对SMTP协议有基础了解。
注意事项
- 启动服务前请确保2525端口未被其他进程占用,否则会启动失败
- 如果需要处理加密SMTP请求(SMTPS),上述两种方式都支持配置SSL证书实现
- 解析MimeMessage需要JavaMail相关依赖,如果项目中未引入可单独添加:
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency>
内容的提问来源于stack exchange,提问作者Alvandi
相关产品推荐
相关产品推荐

