javaMail直接发送附件,无须生成临时文件

来源:互联网 发布:淘宝在哪里买装修模板 编辑:程序博客网 时间:2024/06/05 19:33

以excel附件为例:

先引入依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>


邮件发送服务:

@Servicepublic class MailService {private final Logger logger = LoggerFactory.getLogger(this.getClass());private final JavaMailSender sender;@Value("${spring.mail.username}")private String from;public MailService(JavaMailSender sender) {this.sender = sender;}/** * 利用helper设置各种邮件发送相关的信息 */private MimeMessageHelper setInfoByHelper(String to, String subject, String content, MimeMessage message)throws MessagingException {//true表示需要创建一个multipart messageMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);return helper;}/** * 发送带附件的邮件 * @param to 收件人列表 * @param subject 邮件标题 * @param content 邮件内容 * @param inputStreamSource 附件streamSource,可以这样获得:new ByteArrayResource(ByteArrayOutputStream.toByteArray()); * @param fileName 附件的文件名 */public void sendAttachmentsMail(String to, String subject, String content, InputStreamSource inputStreamSource, String fileName){MimeMessage message = sender.createMimeMessage();try {MimeMessageHelper helper = setInfoByHelper(to, subject, content, message);helper.addAttachment(fileName, inputStreamSource);sender.send(message);logger.debug("带附件的邮件已经发送。");} catch (MessagingException e) {logger.error("发送带附件的邮件时发生异常!", e);}}}

方法调用(测试用例):

利用ByteArrayOutputStream把excel文件输出到bytes[]中,然后由ByteArrayResource包装起来传递给邮件服务。

@Testpublic void sendMailWithExcel() throws IOException {String[] headers = {"col1","col2","col3"};// 声明一个工作薄HSSFWorkbook wb = new HSSFWorkbook();// 生成一个表格HSSFSheet sheet = wb.createSheet();HSSFRow row = sheet.createRow(0);for (int i = 0; i < headers.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellValue(headers[i]);}int rowIndex = 1;for(int j=0; j<3; j++){row = sheet.createRow(rowIndex);rowIndex++;HSSFCell cell1 = row.createCell(0);cell1.setCellValue(j);cell1 = row.createCell(1);cell1.setCellValue(j+1);cell1 = row.createCell(2);cell1.setCellValue(j+2);}for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}ByteArrayOutputStream os = new ByteArrayOutputStream(1000);wb.write(os);wb.close();InputStreamSource iss = new ByteArrayResource(os.toByteArray());os.close();mailService.sendAttachmentsMail("xjj@qq.com","attachmentMail subject","I have an attachment",iss, "abc1.xlsx");}}