springboot实现添加邮件发送及压缩功能

  这次本来只讲讲邮件发送功能的,惮于内容比较贫乏,故加了点儿文件压缩的功能讲解。

  首先邮件发送,邮件功能在springboot里面是有对应的依赖组件,这个:

 <dependency>
  <groupId>org.springframework.boot</groupId>
 <artifactId>
spring-boot-starter-mail</artifactId>
 </dependency>

邮件功能开发在springboot里面相当简单,这里我大致总结下开发内容:

    A>添加依赖包

    B>配置Mail基本参数(ymal或propertie里面)

    C>Service中注入JavaMailSender,调用相关方法即可

但是这里面可能会有个问题,就是在具体服务器部署的时候服务器会封堵邮件服务端口,以及普通邮件安全问题,这里讲解的时候我会顺道给出解决之道。

  首先,需要在工程的pom.xml中引入邮件组件,组件的版本需对应springboot的版本(可不写,这里我略去):

 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
 </dependency>

  接下来就是在配置文件中配置邮件的基本参数:

spring:
 mail:
  host: smtp.exmail.qq.com
  username: username@hostname.com
  password: 密码
  default-encoding: UTF-8
  ssl:
  trust: smtp.exmail.qq.com
  properties:
  mail:
   smtp:
   auth: true #是否需要认证
   socketFactory:
    class: javax.net.ssl.SSLSocketFactory #SSL证书Socket工厂
    port: 465 #使用SMTP465端口

配置参数的时候一定要注意缩进,因为我给的是yaml的配置格式,若是properties配置,大致是这样子(例子):spring.mail.host:smtp.exmail.qq.com,每一个子项都是完整的格式,一开始我是省略了properties项以下的配置(是否认真,SSL,端口),后来发现服务器将邮件的25端口封了,所以在本地可以但是在服务器就行不通了,所以需要指定邮件服务端口为465,我这里使用的是qq邮箱,如果使用163或其他邮箱需自行查阅服务商支持的端口,至于邮件安全问题,在这里需要声明两个,一个是ssl信任,以及mail的socket工厂,具体请见以上红色部分,以上配置仅对qq邮箱有效,不保证其他邮箱也适用。

  ok,配置完成,这里就开始写具体的实现类:

import XXX.common.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
public class MailService {
 private static final Logger LOG = LoggerFactory.getLogger(MailService.class);
 @Value("${spring.mail.username}")
 private String SEND_USER_ADDR;
 @Autowired
 private JavaMailSender mailSender;
 /**
  *  发送简单邮件
  * @param receive 收件人
  * @param obj  发送主题
  * @param content 邮件内容
  */
 public void sendSimpleMail(String receive,String obj,String content) {
  if(!StringUtils.isNotBlank(content) || !StringUtils.isNotBlank(receive))
   return;//不发送空邮件
  SimpleMailMessage message = new SimpleMailMessage();
  message.setFrom(SEND_USER_ADDR);
  if(receive.contains(";"))
   message.setTo(receive.split(";"));
  else
   message.setTo(receive);
  message.setSubject(obj);
  message.setText(content);
  try {
   mailSender.send(message);
   LOG.info("Simple mail send success!");
  } catch (Exception e) {
   LOG.error("sendSimpleMail ERROR!", e);
  }
 }
 private StringBuilder strBuilder;
 /**
  * 发送html邮件 多列表单的形式
  * @param receive 收件人
  * @param obj  发送主题(题目)
  * @param content 邮件内容
  */
 public void sendHtmlMailByList(String receive,String obj,List<Map> content){
   if(content.isEmpty() || !StringUtils.isNotBlank(receive) || null==obj)
    return;
   MimeMessage msg = mailSender.createMimeMessage();
   try {
    MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8"); //解决乱码问题
    helper.setFrom(SEND_USER_ADDR);
    if(receive.contains(";"))
     helper.setTo(receive.split(";"));
    else
     helper.setTo(receive);
    helper.setSubject(obj);
    strBuilder=new StringBuilder();
    strBuilder.append("<!DOCTYPE html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head><body style=\"padding:3% 2%;\">");
    strBuilder.append("<h2>This message is automatically sent to the system.</h2>");
    strBuilder.append("<h2>Send Date by "+DateUtil.getDateFormat(new Date(),DateUtil.DATETIME_DEFAULT_FORMAT) +"</h2>");
    strBuilder.append("<h2>The following is the details:</h2>");
    strBuilder.append("<table border=\"2px solid red\" width=\"100%\">");
    //头
    strBuilder.append("<thead style=\"background-color: #aea2e2;\">");
    strBuilder.append("<tr>");
    Object[] st=content.get(0).keySet().toArray();
    for(int i=0;i<st.length;i++)
     strBuilder.append("<th>"+st[i]+"</th>");
    strBuilder.append("</tr>");
    strBuilder.append("</thead>");
    //体
    strBuilder.append("<tbody>");
    for(Map item:content){
     strBuilder.append("<tr>");
     for(Object str:st)
      strBuilder.append("<td>"+item.get(str)+"</td>");
     strBuilder.append("</tr>");
    }
    strBuilder.append("</tbody>");
    strBuilder.append("</table>");
    strBuilder.append("<h3 style=\"text-align:right\">Best wishes</h3>");
    strBuilder.append("</body></html>");
    //LOG.info(strBuilder.toString());
    helper.setText(strBuilder.toString(),true);
   }catch (Exception e){
    LOG.error("sendHtmlMail ERROR:",e);
   }
   mailSender.send(msg);
  }
 /**
  * 发送html邮件 单列记录形式
  * @param receive 收件人
  * @param obj  发送主题(题目)
  * @param content 邮件内容
  */
 public void sendHtmlMailByItem(String receive,String obj,List<String> content){
  if(content.isEmpty() || !StringUtils.isNotBlank(receive) || null==obj)
   return;
  MimeMessage msg = mailSender.createMimeMessage();
  try {
   MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8"); //解决乱码问题
   helper.setFrom(SEND_USER_ADDR);
   if(receive.contains(";"))
    helper.setTo(receive.split(";"));
   else
    helper.setTo(receive);
   helper.setSubject(obj);
   strBuilder=new StringBuilder();
   strBuilder.append("<!DOCTYPE html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head><body style=\"padding:3% 2%;\">");
   strBuilder.append("<h3>This message is automatically sent to the system.</h3>");
   strBuilder.append("<h3>Send Date by "+DateUtil.getDateFormat(new Date(),DateUtil.DATETIME_DEFAULT_FORMAT) +"</h3>");
   strBuilder.append("<h3>The following is the details:</h3>");
   strBuilder.append("<table border=\"2px solid red\" width=\"100%\">");
   //头
   strBuilder.append("<thead style=\"background-color: #aea2e2;\">");
   strBuilder.append("<th>"+obj.toUpperCase()+" DETAIL</th>");
   strBuilder.append("</thead>");
   //体
   strBuilder.append("<tbody>");
   for(String item:content){
    strBuilder.append("<tr><td>"+item+"</td></tr>");
   }
   strBuilder.append("</tbody>");
   strBuilder.append("</table>");
   strBuilder.append("<h3 style=\"text-align:right;font-weight:normal;\">Best wishes</h3>");
   strBuilder.append("</body></html>");
   LOG.info(strBuilder.toString());
   helper.setText(strBuilder.toString(),true);
  }catch (Exception e){
   LOG.error("sendHtmlMail ERROR:",e);
  }
  mailSender.send(msg);
 }
}

以上我是将邮件功能封装成一个服务类,使用的时候只需要将当前类注入 然后直接调用即可,以上封装了两个方法:一个是简单邮件发送,一个是带html table的邮件,如果需要发送附件,需将附件放入到MimeMessageHelper里面(调用addAttachment("文件名", 文件))方法即可,这里因为无实际需求,遂就略去了,好了,邮件发送功能已经完成,这里看下实际效果:

邮件功能实现完毕,现在我讲讲文件压缩功能,压缩功能的实现大致有四种,分别是:

  A>利用java.util.zip提供的api压缩

  B>利用apache的ant包提供的api压缩(org.apache.tools.ant.taskdefs.Zip)

  C>使用zip4j提供的api压缩(net.lingala.zip4j)

  D>调用宿主机的shell命令压缩

这里需要特别提到三个问题:

  A>普通邮件压缩中文乱码(不支持中文)

  B>压缩后无法解压(解压错误)

  C>文件压缩添加压缩密码问题

实际开发过压缩功能,以上三点儿对于新手来说尤其的头痛,这里我分享下以前在开发压缩功能中碰到的问题。

  使用原生java.util包提供的压缩,如果被压缩文件使用到中文,则会乱码(据说是jdk的一个bug),而且压缩实现的代码较为复杂(尤其是设置密码),尤其是对于跨目录压缩和多文件压缩尤其麻烦。

  使用apache提供的zip工具虽避免了以上会出现的问题,但是需要提醒一点儿的是这个ant包与webLogic冲突(部署的时候会报错)且无法实现压缩设置密码,如果使用的是webLogic而不是tomocat的情况下,一定要注意到这个问题。

  使用java调用宿主机的shell命令也是个不错的选择,但是,需要编写shell命令,同时对于部署在windows平台就不太友好了,移植比较麻烦。

  最后,对于以上问题,我这里推荐zip4j,以下也是针对zip4j的压缩实现做讲解。

  先,需要引入依赖包:

  <!--压缩:支持加密压缩-->
  <dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>1.3.2</version>
   </dependency>

  再,封装一个压缩/解压缩工具类以方便使用:

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import org.springframework.util.StringUtils;
import java.io.File;
/**
 * 本工具类使用Zip4j来进行压缩以及解压缩
 */
public class ZipUtil {
 //声明压缩对象
 private static ZipParameters parameters;
 //解压文件对象
 private static ZipFile zipFile;
 /**
  *
  * @param sourceFilePath 被压缩的文件的路径(单文件,文件夹)
  * @param zipFilePath  压缩文件路径
  * @param password   压缩密码
  * @return     压缩成功:true ,压缩失败:false
  */
 public static Boolean singleFileCompress(String sourceFilePath,String zipFilePath,String password){
  parameters = new ZipParameters();
  parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 压缩方式(默认方式)
  parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别(默认级别)
  //压缩加密设置
  if (!StringUtils.isEmpty(password)) {
   parameters.setEncryptFiles(true);//是否设置文件加密(默认为否)
   parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式(此处是标准压缩)
   parameters.setPassword(password.toCharArray());
  }
  try {
   ZipFile zipFile = new ZipFile(zipFilePath);
   //如果是文件则直接压缩,若是文件夹,遍历文件全部压缩
   if(new File(sourceFilePath).isFile()) {
    zipFile.setFileNameCharset("GBK");
    zipFile.addFile(new File(sourceFilePath), parameters);
    return true;
   }
   //File ff=new File(sourceFilePath);
   File[] flst=new File(sourceFilePath).listFiles();
   System.out.println("文件个数=>"+flst.length);
   for(File f:flst){
    zipFile.setFileNameCharset("GBK");
    zipFile.addFile(f, parameters);
   }
   return true;
  } catch (ZipException e) {
   e.printStackTrace();
   return false;
  }catch (Exception id){
   id.printStackTrace();
   return false;
  }
 }
 public static Boolean unZip(String zipFile,String unZipDir){
  try {
   ZipUtil.zipFile = new ZipFile(zipFile);
   ZipUtil.zipFile.setFileNameCharset("GBK");//设置编码格式
   //用自带的方法检测一下zip文件是否合法,包括文件是否存在、是否为zip文件、是否被损坏等
   if (!ZipUtil.zipFile.isValidZipFile()) {
    throw new ZipException("文件不合法或不存在");
   }
   // 跟java自带相比,这里文件路径会自动生成,不用判断
   ZipUtil.zipFile.extractAll(unZipDir);
   return true;
  }catch(ZipException e){
   return false;
  }
 }
}

以上压缩方法自带密码压缩功能,可以压缩单文件也可以压缩目录文件,相对于原生的实现,一下子清爽了许多,这里唯一需要说明的是,压缩的目标文件在压缩前一定不能穿件,否则会报错!另外对于解压缩一定要注意文件编码和判断文件是否存在。

总结

以上所述是小编给大家介绍的springboot实现添加邮件发送及压缩功能 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • SpringBoot使用FreeMarker模板发送邮件

    本文实例为大家分享了SpringBoot +Mail+FreeMarker发送邮件,供大家参考,具体内容如下 通过spirngboot 自带的mail服务及FreeMarker模板引擎,发送邮 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </depen

  • springboot整合freemarker详解

    前提: 开发工具:idea 框架:spring boot.maven 1.pom文件添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> <version>1.4.1.RELEASE</version> </dependency>

  • SpringBoot中发送QQ邮件功能的实现代码

    本文是vhr系列的第十二篇,项目地址 https://github.com/lenve/vhr 邮件发送也是一个老生常谈的问题了,代码虽然简单,但是许多小伙伴对过程不太理解,所以还是打算和各位小伙伴聊聊这个话题. 邮件协议 我们经常会听到各种各样的邮件协议,比如SMTP.POP3.IMAP,那么这些协议有什么作用,有什么区别?我们先来讨论一下这个问题. SMTP是一个基于TCP/IP的应用层协议,江湖地位有点类似于HTTP,SMTP服务器默认监听的端口号为25.看到这里,小伙伴们可能会想到既然S

  • SpringBoot JavaMailSender发送邮件功能

    本文实例为大家分享了SpringBoot JavaMailSender发送邮件的具体代码,供大家参考,具体内容如下 引入Maven依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 163邮箱 application.properties

  • SpringBoot集成E-mail发送各种类型邮件

    SpringBoot 集成 E-mail发送邮件,供大家参考,具体内容如下 JDK本身有自带发送邮件api,加上SpringBoot在进行封装,使得现在使用起来十分快速简洁. 话不多说,参考纯洁的微笑博客,更改jar版本为2.0.4 开干,基本没什么坑. 就是配置邮箱账号密码是,如果是qq邮箱,需要开启PO30和STMP服务,并且获取临时授权码. 开启服务链接: https://mail.qq.com/cgi-bin/frame_html?sid=a5ZSbreeNm9pHyl1&r=a8322

  • springboot实现添加邮件发送及压缩功能

    这次本来只讲讲邮件发送功能的,惮于内容比较贫乏,故加了点儿文件压缩的功能讲解. 首先邮件发送,邮件功能在springboot里面是有对应的依赖组件,这个: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> spring-boot-starter-mail</artifactId> </dependency> 邮件功能开发在springboot里面

  • Springboot整合实现邮件发送的原理详解

    目录 开发前准备 基础知识 进阶知识 加入依赖 配置邮件 测试邮件发送 通常在实际项目中,也有其他很多地方会用到邮件发送,比如通过邮件注册账户/找回密码,通过邮件发送订阅信息等等.SpringBoot集成邮件服务非常简单,通过简单的学习即可快速掌握邮件业务类的核心逻辑和企业邮件的日常服务 开发前准备 首先注册发件邮箱并设置客户端授权码,这里以QQ 免费邮箱为例,其他的邮箱的配置也大同小异. 登录 QQ 邮箱,点击设置->账户,开启IMAP/SMTP服务,并生成授权码. 基础知识 电子邮件需要在邮

  • python实现12306抢票及自动邮件发送提醒付款功能

    #写在前面,这个程序我已经弄出来了,但是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹就是技术交流. 只做技术交流..... 嗯,程序结束后,自己还是得手动付款. 废话不多说,下面就直接开始技术主要部分阐述. 先讲理论部分:首先我们需要代码实现一个浏览器功能,那么模块基本上可以确定urllib.parse.urllib.request,这两个包都是和网址有关的模块,那么咱们去登录一个网址,特别是有验证码这些的网址,我们登录进去是不是就行了?答案是对的,但是我们用代码实现的话,这个

  • springboot实现自动邮件发送任务详解

    目录 1.导入jar包 2.配置文件 3.测试 复杂的邮件发送 springboot可以很容易实现邮件的发送 具体实现步骤: 1.导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.5.2</version> </depe

  • php实现在站点里面添加邮件发送的功能

    下面夏日博客来讲下如何在站点里面添加一个邮件发送的功能. 首先需要下载一个smtp 的 php 邮件发送类,代码如下: <?php class smtp { /* Public Variables */ public $smtp_port; public $time_out; public $host_name; public $log_file; public $relay_host; public $debug; public $auth; public $user; public $pas

  • springboot+vue完成编辑页面发送接口请求功能

    目录 前言 功能实现 前言 基于 springboot+vue 的测试平台(练手项目)开发继续更新. 今天终于把已做的功能都重构完成了. 其中前端又做了个小调整,就是入参动态增删的控件,本来我是3个tab复用一个组件,后来不断发现一些问题,最后我决定还是分开写吧. 今天另一个重点是重做了编辑页发送接口请求的后端功能.这个功能重构之前是有的,但是现在我觉得之前那些做兼容不够. 因为我最近在工作中接入飞书的一些开放API,发现存在一些接口的入参是组合来的,比如 post 请求中,既有查询参数,也有请

  • python实现SMTP邮件发送功能

    一直想着给框架添加邮件发送功能.所以整理下python下邮件发送功能 首先python是支持邮件的发送.内置smtp库.支持发送纯文本.HTML及添加附件的邮件.之后是邮箱.像163.qq.新浪等邮箱默认关闭SMTP服务,需要我们手动打开,打开后通过发件人邮箱.授权密码 通过发件人的SMTP服务发送 代码如下: #!/usr/bin/env python # -*- coding: utf_8 -*- from email.mime.text import MIMEText from email

  • Springboot整合RabbitMQ实现发送验证码的示例代码

    目录 1. RabbitMQ的介绍 2. 搭建环境 2.1引入jar包 2.2生产者配置 2.2.1Rabbit配置类 2.2.2 application.yml文件配置 2.3消费者配置 2.3.1 消费者配置类(同生产者) 2.3.2 application.yml文件配置 3.写发送短信验证码的代码 3.1写一个controller来调用发送验证码的接口 3.2 生成验证码 3.3发送短信验证码 3.4 实现验证码的校对 1. RabbitMQ的介绍 MQ全称为Message Queue,

  • SpringBoot实现邮件发送功能的姿势分享

    目录 前言 I. 项目环境 1. 项目依赖 2. 配置 II. 邮件发送 1. 简单文本邮件发送 2. html发送 3. 添加附件 4. Freemaker模板 5. 测试与小结 III. 不能错过的源码和相关知识点 0. 项目 总结 前言 邮件发送,在实际的项目开发中,可能用的不是特别多,如果没有特定的需求,相信也没有多少小伙伴会特意的去关注,那么如果现在我们希望针对项目做一个异常的报警系统,当出现异常的时候,可以向指定的小伙伴发送邮件提醒,那么让我们来实现这个功能,可以怎么办呢? 这里介绍

  • springboot 整合邮件发送功能

     pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 代码实现 import org.springframework.core.io.FileSystemResource; import org.springframework.mail

随机推荐