解放双手300行代码打造智能邮件转发机器人飞书/钉钉全适配你是否经常错过GitHub仓库动态、服务器告警邮件重要通知被淹没在收件箱里今天分享一个极简解决方案——用Java 300行代码实现邮件自动转发到飞书/钉钉的轻量级机器人。无需复杂框架仅需OkHttp和JavaMail两个依赖就能搭建全天候邮件监听服务。1. 核心设计极简主义的自动化哲学这个项目的本质是搭建一个邮件-IM的桥梁。与传统企业级方案相比我们的设计有三大特点无状态服务每次执行都是独立任务即使服务重启也不会丢失数据最小依赖仅需Java标准库两个轻量级第三方库可插拔架构通过修改单个类即可适配不同IM平台关键组件关系如下模块职责实现方式邮件监听获取未读邮件并过滤JavaMail IMAP协议内容处理器提取邮件正文并清洗正则表达式MIME解析Webhook发送器适配不同IM平台的消息格式OkHTTP POST请求定时触发器控制检查频率Spring Scheduled// 架构核心接口定义 public interface MailProcessor { void processUnseenMails() throws Exception; String extractMailContent(Message message) throws Exception; boolean sendToBot(String content); }2. 实战从零搭建邮件监听服务2.1 环境准备首先确保你的邮箱已开启IMAP服务。以QQ邮箱为例登录网页版QQ邮箱进入设置→账户开启IMAP/SMTP服务获取授权码非登录密码必备依赖pom.xmldependencies dependency groupIdcom.sun.mail/groupId artifactIdjavax.mail/artifactId version1.6.2/version /dependency dependency groupIdcom.squareup.okhttp3/groupId artifactIdokhttp/artifactId version4.9.3/version /dependency /dependencies2.2 核心代码解析邮件监听的核心逻辑集中在MailFetcher类public class MailFetcher { private static final String IMAP_HOST imap.qq.com; private static final int IMAP_PORT 993; public ListMessage fetchUnseenMails(String username, String password) { Properties props new Properties(); props.put(mail.imap.ssl.enable, true); Session session Session.getInstance(props); try (Store store session.getStore(imap)) { store.connect(IMAP_HOST, IMAP_PORT, username, password); Folder inbox store.getFolder(INBOX); inbox.open(Folder.READ_WRITE); return Arrays.stream(inbox.getMessages()) .filter(msg - !msg.isSet(Flags.Flag.SEEN)) .collect(Collectors.toList()); } } }提示使用try-with-resources确保资源释放避免内存泄漏3. 多平台适配一套代码支持飞书/钉钉通过抽象BotSender接口我们可以轻松扩展不同IM平台public interface BotSender { boolean send(String content); } // 飞书实现 public class FeishuSender implements BotSender { private final OkHttpClient client new OkHttpClient(); private final String webhookUrl; Override public boolean send(String content) { String json String.format({\msg_type\:\text\,\content\:{\text\:\%s\}}, content.replace(\, \\\)); Request request new Request.Builder() .url(webhookUrl) .post(RequestBody.create(json, MediaType.get(application/json))) .build(); try (Response response client.newCall(request).execute()) { return response.isSuccessful(); } } }钉钉适配只需新增一个类public class DingTalkSender implements BotSender { // 钉钉的JSON结构略有不同 private static final String DINGTALK_TEMPLATE {\msgtype\:\text\,\text\:{\content\:\%s\}}; // 实现逻辑与飞书类似... }4. 高级技巧与性能优化4.1 邮件过滤策略在application.yml中配置过滤规则mail: filters: - type: subject_contains # 按主题过滤 value: [ALERT] - type: from_matches # 按发件人过滤 value: noreplygithub.com - type: priority_high # 仅处理高优先级邮件对应的Java实现public boolean isTargetMail(Message message) { return filters.stream().allMatch(filter - { switch (filter.getType()) { case subject_contains: return message.getSubject().contains(filter.getValue()); case from_matches: return Arrays.toString(message.getFrom()).contains(filter.getValue()); default: return true; } }); }4.2 性能调优建议连接池配置OkHttpClient client new OkHttpClient.Builder() .connectionPool(new ConnectionPool(5, 5, TimeUnit.MINUTES)) .build();定时任务优化Scheduled(fixedDelay 30000, initialDelay 5000) public void checkMails() { // 添加执行时间监控 long start System.currentTimeMillis(); mailProcessor.processUnseenMails(); log.info(执行耗时{}ms, System.currentTimeMillis()-start); }邮件处理批量化// 分批处理避免内存溢出 ListListMessage batches Lists.partition(unseenMails, 20); batches.forEach(this::processBatch);5. 安全防护与异常处理5.1 敏感信息保护永远不要在代码中硬编码凭据。推荐做法使用环境变量export MAIL_PASSWORDyour_auth_code在Spring中引用mail: password: ${MAIL_PASSWORD}5.2 健壮性增强为关键操作添加重试机制RetryTemplate retryTemplate new RetryTemplate(); retryTemplate.execute(context - { mailService.fetchAndProcess(); return null; });异常处理最佳实践try { processMail(message); } catch (MessagingException e) { log.error(邮件处理失败, e); // 标记为未读以便下次重试 message.setFlag(Flags.Flag.SEEN, false); }6. 扩展应用场景这套框架经过简单改造还能支持智能家居通知将物联网设备报警邮件转发到手机客服工单提醒自动抓取客户邮件创建工单日志监控解析日志邮件内容触发告警一个真实的GitHub通知转发配置示例rules: - name: GitHub PR通知 conditions: - field: from pattern: notificationsgithub.com - field: subject pattern: Pull Request actions: - type: forward target: feishu template: | 【GitHub动态】${subject} 发件人${from} 时间${date} ${content:0:200}...在3个月的实际使用中这个机器人帮我减少了80%的邮件检查时间。最惊喜的是它的稳定性——即使在服务器重启后所有未处理邮件都能被正确抓取。现在我可以更专注地写代码而不用担心错过任何重要通知了。