找回密码
 立即注册
首页 业界区 业界 邮件群发工具实验报告

邮件群发工具实验报告

数察啜 昨天 21:35
邮件群发工具实验报告

目录


  • 一、项目概述
  • 二、项目架构
  • 三、项目展示

    • 3.1 目录结构
    • 3.2 主程序(MailBulkSender)
    • 3.3 核心业务模块关键逻辑

      • 3.3.1 邮件发送核心(MailSender - 批量发送 + 重试)
      • 3.3.2 Excel读取核心(ExcelReader - 数据解析)
      • 3.3.3 模板渲染核心(TemplateRenderer)

    • 3.4 实体类(简化展示)

  • 四、运行效果

    • 4.1 实际接收邮件
    • 4.2 单次邮件发送报告
    • 4.3 发送日志

  • 五、学习心得
  • 六、总结
一、项目概述

本项目是一个基于Java的邮件批量发送工具,通过整合Excel数据读取、模板渲染和邮件发送功能,实现了个性化邮件的批量推送。项目采用模块化设计,核心技术栈包括POI(Excel处理)、JavaMail(邮件发送)、FreeMarker(模板引擎),并通过Maven进行依赖管理,确保开发过程的高效与规范。
核心技术栈在项目中的落地应用


  • POI(Apache POI):作为Excel数据解析的核心工具,我通过POI的Workbook、Sheet、Row、Cell等核心类实现了对xlsx格式联系人表格的读取,兼容字符串、数字等不同单元格类型的解析逻辑,精准提取姓名、邮箱、公司等收件人信息,为批量发送提供数据基础。
  • JavaMail:是邮件发送功能的核心依赖,我基于JavaMail的Session、MimeMessage、Transport等类封装了邮件发送逻辑,配置SMTP服务器参数(如QQ邮箱的smtp.qq.com、465端口),结合身份认证实现邮件的精准投递,并通过多线程+重试机制提升发送稳定性。
  • FreeMarker:用于实现邮件内容的个性化渲染,我将固定邮件模板(email.ftl)与Excel读取的联系人数据结合,通过模板变量(如${name}、${company})动态替换内容,无需硬编码即可生成不同收件人的个性化邮件,大幅提升模板复用性和内容灵活性。
  • Maven:作为项目依赖管理工具,我通过pom.xml统一引入POI、JavaMail、FreeMarker等依赖包,自动管理各组件的版本和依赖关系,避免手动导入jar包的冲突问题,保障项目构建和运行的一致性,同时简化了项目的部署和协作流程。
二、项目架构


  • 配置初始化:设置邮件服务器参数及发件人信息
  • 数据导入:从Excel读取收件人列表
  • 模板渲染:结合联系人信息生成个性化邮件内容
  • 批量发送:多线程并发发送邮件,带重试机制
  • 结果反馈:生成发送报告,统计成功/失败情况
三、项目展示

1.目录结构

1.png

2. 主程序(MailBulkSender)


  • 串联各个模块,完成邮件群发的完整流程
  1. package com;
  2. // 省略import
  3. public class MailBulkSender {
  4.     public static void main(String[] args) {
  5.         try {
  6.             // 1. 配置邮件参数
  7.             MailConfig mailConfig = new MailConfig();
  8.             mailConfig.setSenderEmail("3407645223@qq.com");
  9.             mailConfig.setSenderPassword("lblrwihhllzjdbed");  
  10.             mailConfig.setSmtpHost("smtp.qq.com");         
  11.             mailConfig.setSmtpPort(465);                     
  12.             mailConfig.setSslEnable(true);                  
  13.             // 2. 读取Excel联系人
  14.             ExcelReader excelReader = new ExcelReader();
  15.             List<Contact> contacts = excelReader.readContacts("D:\\homework\\Java/contacts.xlsx");
  16.             System.out.println("读取到联系人数量:" + contacts.size());
  17.             // 3. 初始化发送器并批量发送
  18.             MailSender mailSender = new MailSender(mailConfig);
  19.             String subjectTemplate = "【${company}】尊敬的${name},这是一封个性化测试邮件";
  20.             List<String> attachments = null;
  21.             List<SendLog> logs = mailSender.batchSend(contacts, "email.ftl", subjectTemplate, attachments);
  22.             // 4. 生成发送报告
  23.             mailSender.generateReport(logs, "D:\\homework\\Java/send-report.txt");
  24.         } catch (Exception e) {
  25.             e.printStackTrace();
  26.             System.err.println("群发失败:" + e.getMessage());
  27.         }
  28.     }
  29. }
复制代码
3. 核心业务模块关键逻辑

(1)邮件发送核心(MailSender - 批量发送 + 重试)
  1. package com.bulk.sender;
  2. // 省略import及基础属性定义
  3. public class MailSender {
  4.     // 核心批量发送逻辑(保留核心流程)
  5.     public List<SendLog> batchSend(List<Contact> contacts, String templateName,
  6.                                    String subjectTemplate, List<String> attachmentPaths) {
  7.         List<SendLog> logs = new CopyOnWriteArrayList<>();
  8.         ExecutorService executor = Executors.newFixedThreadPool(10); // 线程池控制并发
  9.         for (Contact contact : contacts) {
  10.             SendLog log = new SendLog();
  11.             log.setContact(contact);
  12.             log.setSendTime(new Date());
  13.             logs.add(log);
  14.             executor.submit(() -> {
  15.                 int retryCount = 0;
  16.                 boolean sendSuccess = false;
  17.                 // 失败重试核心逻辑
  18.                 while (retryCount < 3 && !sendSuccess) {
  19.                     try {
  20.                         // 模板变量渲染
  21.                         Map<String, Object> dataModel = new HashMap<>();
  22.                         dataModel.put("name", contact.getName());
  23.                         dataModel.put("company", contact.getCompany());
  24.                         String subject = renderSimpleTemplate(subjectTemplate, dataModel);
  25.                         String content = new TemplateRenderer().render(templateName, dataModel);
  26.                         
  27.                         // 发送单封邮件
  28.                         sendSingleMail(contact.getEmail(), subject, content, attachmentPaths);
  29.                         sendSuccess = true;
  30.                     } catch (Exception e) {
  31.                         retryCount++;
  32.                         // 重试间隔(指数退避)
  33.                         try { Thread.sleep(1000 * retryCount); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }
  34.                     }
  35.                 }
  36.                 // 更新发送日志
  37.                 log.setSuccess(sendSuccess);
  38.                 log.setRetryCount(retryCount);
  39.             });
  40.         }
  41.         executor.shutdown();
  42.         return logs;
  43.     }
  44.     // 发送报告生成核心
  45.     public void generateReport(List<SendLog> logs, String reportPath) {
  46.         long successCount = logs.stream().filter(SendLog::isSuccess).count();
  47.         long failCount = logs.size() - successCount;
  48.         // 控制台报告+文件写入核心
  49.         logger.info("===== 邮件发送报告 =====");
  50.         logger.info("总发送数:{} | 成功数:{} | 失败数:{}", logs.size(), successCount, failCount);
  51.         // 省略文件写入细节(保留核心统计逻辑)
  52.     }
  53.     // 省略其他辅助方法
  54. }
复制代码
(2)Excel 读取核心(ExcelReader - 数据解析)

[code]package com.bulk.reader;// 省略importpublic class ExcelReader {    // 核心Excel解析逻辑    public List readContacts(String excelPath) throws Exception {        List contacts = new ArrayList();        Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(excelPath)));        Sheet sheet = workbook.getSheetAt(0);        // 跳过表头读取数据        for (int i = 1; i

相关推荐

您需要登录后才可以回帖 登录 | 立即注册