由于在公司工作,常年出差,每天都要以日报的形式向公司汇报当天的工作内容。而日报的内容大体上就只有当天工作的主要内容时变化的,其余的都是不变 的。 而我的电脑刚打开excel有点卡,因此决定使用JavaMail结合poi写一个简单excel模板替换并使用JavaMail发送邮件的小程序。
主要思路如下:
1.加载配置文件(使用yaml作为配置文件)
配置文件中存放的是发送邮件需要用的一些配置信息和excel模板中需要替换的数据
比喻:邮件使用的协议、发送人、收件人、等等信息
2.加载excel模板,读取模板,使用上一步中配置信息替换掉模板中的数据,然后生成excel文件
3.使用JavaMail发送邮件
要注意乱码的处理。
4.将代码打包成一个可执行的Jar包(最终只需要修改一下配置文件即可使用)
5.项目的源代码,用附件上传失败了。 链接:http://pan.baidu.com/s/1dDCU593 密码:6xpi
项目采用maven构建,但是为了修改配置文件方便,并没有使用maven的规范,将配置文件放到src/main/resources目录中。
代码如下:
/** * 读取yaml配置文件,读取excel模板并生成excel文件,在使用JavaMail发送。 * * @author huan * */ public class App { // 配置文件的名称 private static final String CONFIGER_YAML_FILE_NAME = "sendMailConfig.yaml"; // 日报的excel模板 private static final String EXCEL_TEMPLETE = "ExcelTemplete.xls"; public static void main(String[] args) { // 1.加载属性文件 Map<String, String> propMap = null; try { propMap = loadConfigYamlFile(); } catch (FileNotFoundException e1) { e1.printStackTrace(); System.out.println("加载yaml文件失败"); System.exit(1); } // 将当前日期放到map中 propMap.put("${currDate}", new SimpleDateFormat("yyyyMMdd").format(new Date())); System.out.println("输出配置文件信息开始..."); for (Map.Entry<String, String> entry : propMap.entrySet()) { System.out.println(entry.getKey() + " --> " + entry.getValue()); } System.out.println("输出配置文件信息结束..."); // 2.加载excel模板 Workbook workbook = loadExcelTemplete(); if (workbook == null) { return; } // 3.获取第一个sheet页 Sheet sheet = workbook.getSheetAt(0); if (null == sheet) { System.out.println("获取第一个sheet页失败"); return; } String dayReportName = "Test-日报-" + propMap.get("${reportPer}") + "-" + propMap.get("${currDate}") + ".xls"; System.out.println("生成新的日报的名称:" + dayReportName); // 替换模板中的内容 for (Row row : sheet) { for (Cell cell : row) { int cellType = cell.getCellType(); // 根据单元格的中内容的类型,得到单元格中的值 String cellContent = getCellContentByCellType(cell, cellType); if (propMap.containsKey(cellContent)) { setCellValue(propMap, cell, cellContent); } } } // 将替换后的数据excel保存到本地 BufferedOutputStream bos = null; try { bos = new BufferedOutputStream(new FileOutputStream(dayReportName)); workbook.write(bos); workbook.close(); bos.close(); } catch (IOException e1) { e1.printStackTrace(); } System.out.println(dayReportName + " --> 生成成功!!!"); // 发送邮件开始 try { sendMail(propMap, dayReportName); } catch (Exception e) { e.printStackTrace(); System.out.println("邮件发送失败"); System.exit(1); } System.out.println("邮件发送成功"); // 归档文件 archiveFile(dayReportName); } // 归档日报 private static void archiveFile(String dayReportName) { // 1.判断目录是否存在 Calendar calendar = Calendar.getInstance(); int _month = calendar.get(Calendar.MONTH) + 1; String month = _month + ""; if (_month < 10) { month = "0" + _month; } String dir = "日报归档" + File.separator + month; File dirFile = new File(dir); if (!dirFile.exists()) { dirFile.mkdirs(); System.out.println("创建目录:" + dirFile.getAbsolutePath()); } File dayReportFile = new File(dayReportName); File f = new File(dir, dayReportName); dayReportFile.renameTo(f); System.out.println("文件归档成功:" + f.getAbsolutePath()); } /** * 发送日报 * * @param propMap * @param dayReportName * @throws MessagingException * @throws IOException */ private static void sendMail(final Map<String, String> propMap, String dayReportName) throws MessagingException, IOException { Properties props = new Properties(); props.setProperty("mail.host", propMap.get("${mail.host}")); props.setProperty("mail.smtp.auth", propMap.get("${mail.smtp.auth}")); props.setProperty("mail.transport.protocol", propMap.get("${mail.transport.protocol}")); Authenticator auth = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 邮箱的用户名和密码 return new PasswordAuthentication(propMap.get("${sendPer}"), propMap.get("${sendPerPwd}")); } }; // 1.创建邮件的第一步: 创建session对象 Session session = Session.getInstance(props, auth); // 设置调试模式 可以关闭 session.setDebug(true); // 2.创建邮件的第二步:创建MimeMessage对象 // 创建邮件对象 MimeMessage msg = new MimeMessage(session); // 设置发送人 msg.setFrom(new InternetAddress(propMap.get("${sendPer}"))); // 设置收件人 msg.addRecipients(RecipientType.TO, InternetAddress.parse(propMap.get("${receivePer}"))); // 设置收件人 类型为 抄送 msg.addRecipients(RecipientType.CC, InternetAddress.parse(propMap.get("${CC}"))); // 设置邮件的主题 msg.setSubject(dayReportName); MimeMultipart partList = new MimeMultipart(); // 写签名 MimeBodyPart part1 = new MimeBodyPart(); System.out.println(propMap.get("${mailSign}")); part1.setContent(propMap.get("${mailSign}"), "text/html;charset=utf-8"); // 写附件 MimeBodyPart part2 = new MimeBodyPart(); part2.attachFile(new File(dayReportName)); part2.setFileName(MimeUtility.encodeText(dayReportName)); // 把部件添加到集合中 partList.addBodyPart(part1); partList.addBodyPart(part2); msg.setContent(partList); // 3. 创建邮件的第三步,发送 Transport Transport.send(msg); } /** * 设置单元格的样式 * * @param propMap * @param cell * @param cellContent */ private static void setCellValue(Map<String, String> propMap, Cell cell, String cellContent) { if (cellContent.equals("${currDate}")) {// 日期单独处理 System.out.println("替换[" + cellContent + "]为[" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "]"); cell.setCellValue(new Date()); } else { String cellValue = propMap.get(cellContent); System.out.println("替换[" + cellContent + "]为[" + cellValue + "]"); cell.setCellValue(cellValue); } } /** * @param cell * @param cellType */ private static String getCellContentByCellType(Cell cell, int cellType) { String cellContent = ""; switch (cellType) { case Cell.CELL_TYPE_STRING: cellContent = cell.getStringCellValue(); break; case Cell.CELL_TYPE_BLANK: cellContent = ""; break; case Cell.CELL_TYPE_NUMERIC: cellContent = cell.getNumericCellValue() + ""; break; case Cell.CELL_TYPE_BOOLEAN: cellContent = cell.getBooleanCellValue() + ""; break; default: System.err.println("出现未知的单元格类型,系统退出。"); System.exit(1); break; } return cellContent; } /** * 生成Excel的模板 * * @throws IOException * @throws FileNotFoundException */ private static Workbook loadExcelTemplete() { try { Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(EXCEL_TEMPLETE))); return workbook; } catch (Exception e) { System.out.println("加载Excel模板出错..."); e.printStackTrace(); } return null; } // 加载配置文件文件 @SuppressWarnings("unchecked") private static Map<String, String> loadConfigYamlFile() throws FileNotFoundException { Yaml yaml = new Yaml(); Iterable<Object> iterable = yaml.loadAll(new FileInputStream(new File(CONFIGER_YAML_FILE_NAME))); Iterator<Object> it = iterable.iterator(); Map<String, String> configerMap = new HashMap<String, String>(); while (it.hasNext()) { Map<String, String> map = (Map<String, String>) it.next(); for (Map.Entry<String, String> entry : map.entrySet()) { configerMap.put("${" + entry.getKey().trim() + "}", entry.getValue().trim()); } } return configerMap; } }
项目截图如下: | 最终打包成的目录如下: |
点击run.bat执行后,就可以看到 | |
相关推荐
使用 JavaMail 库可以轻松地在 Java 应用程序中发送电子邮件。JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件协议,例如 SMTP、POP3 和 ...
在这个资源中,我们将探讨如何使用 JavaMail 实现邮件的发送、接收、查看邮件数量以及未读邮件的标记为已读。 首先,让我们从发送邮件开始。在 JavaMail 中,你需要创建一个 `Session` 对象来配置邮件服务器的连接...
对于JavaMail发送邮件过程中遇到的各种问题,通过细致地检查邮件构建逻辑、确保邮件头部信息正确设置、合理配置邮件内容编码以及完善项目环境配置,可以有效解决大多数问题。同时,利用调试工具深入理解邮件发送的...
下面我们将深入探讨JavaMail的基本概念、如何使用JavaMail发送邮件以及在Struts2框架中的实现方式。 JavaMail API主要包括以下组件: 1. `javax.mail.Session`:是JavaMail的核心,负责配置邮件服务器的信息,如...
总的来说,"Android使用javamail发送邮件"这个主题涵盖了Android平台上利用JavaMail API实现邮件发送的基本流程和注意事项,包括设置SMTP服务器、构建邮件消息、处理附件以及可能的安全性和用户体验优化。...
在本篇文章中,我们将深入探讨如何使用JavaMail API来实现邮件的发送功能。 首先,我们需要引入JavaMail所需的依赖库。在提供的文件列表中,我们看到有以下jar文件: 1. mail.jar:这是JavaMail的核心库,包含了...
这个标题"JavaMail发送邮件(文本、html、附件)"涵盖了使用JavaMail API发送不同格式邮件的核心功能。下面将详细介绍如何利用JavaMail发送文本、HTML和包含附件的邮件,以及在实际应用中需要注意的配置步骤。 1. *...
3. **创建邮件消息**:使用`Message`类实例化一个邮件对象,并设置必要的属性,如发件人、收件人、主题和正文。 ```java Message message = new MimeMessage(session); message.setFrom(new InternetAddress(...
这个例子展示了如何使用JavaMail发送带附件的邮件。需要注意的是,实际应用中应处理各种异常,确保邮件发送的健壮性。此外,如果你的邮件服务器需要身份验证,还需要提供一个Authenticator来处理登录信息。 总的来...
基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件...
不过,需要注意的是,使用JavaMail发送邮件时,必须确保你的SMTP服务器允许第三方应用程序进行授权,并且可能需要开启“不够安全的应用”的权限(对于Gmail而言)。 在提供的压缩包文件`Mail`中,可能包含了一些...
这个“javamail发送邮件.zip”压缩包显然包含了一个示例项目,演示如何使用JavaMail API发送包含正文文本、图片以及附件的邮件。以下是对这个主题的详细解释: 1. **JavaMail API**: JavaMail API 是一组接口和类...
通过以上步骤,你可以实现在Android应用中使用JavaMail API直接发送邮件,无需用户参与,只需要网络连接和正确的SMTP服务器配置。这种方式在发送错误报告、日志等自动化场景中非常有用。但请注意,由于JavaMail的...
这个项目源文件和包含的jar包是用于演示如何在Java应用中使用JavaMail来实现邮件服务功能的。下面将详细介绍JavaMail的使用方法以及相关知识点。 1. **JavaMail API简介** JavaMail API 是一套标准的Java接口,...
下面我们将详细探讨如何使用JavaMail发送邮件,以及涉及的关键知识点。 首先,要发送邮件,你需要配置一些必要的参数,包括邮箱账号、密码和SMTP服务器地址(SERVERHOST)。例如,如果你使用的是 Gmail 邮箱,SMTP ...
以下是一个简单的示例,展示如何使用JavaMail发送只包含文本的邮件: ```java public class Sendmail { public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop....
JavaMail 是一个强大的开源库,用于在Java应用程序中发送...以上就是使用JavaMail发送邮件的详细过程,以及与文本编辑器KindEditor的集成方式。在开发过程中,记得根据具体需求调整和优化代码,以满足不同的业务场景。
在这个主题“javaMail学习(七)——使用javaMail发复杂邮件”中,我们将深入探讨如何使用 JavaMail API 发送包含多种附件、HTML 内容和其他复杂元素的邮件。在提供的文件列表中,我们看到一系列名为 MailUtils 的类,...
JavaMail 是一个开源的 Java 库,...如果你想要在实际项目中使用此功能,只需要替换相应的 SMTP 服务器信息和邮件内容即可。请确保遵循你的邮件服务提供商的政策,并注意不要滥用邮件发送服务,以免被标记为垃圾邮件。