中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在springboot中添加郵件發送和壓縮功能

發布時間:2021-05-14 17:48:40 來源:億速云 閱讀:181 作者:Leah 欄目:編程語言

怎么在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("<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("<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("<h4 style=\"text-align:right\">Best wishes</h4>");
    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("<h4>This message is automatically sent to the system.</h4>");
   strBuilder.append("<h4>Send Date by "+DateUtil.getDateFormat(new Date(),DateUtil.DATETIME_DEFAULT_FORMAT) +"</h4>");
   strBuilder.append("<h4>The following is the details:</h4>");
   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("<h4 style=\"text-align:right;font-weight:normal;\">Best wishes</h4>");
   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("文件名", 文件))方法即可,這里因為無實際需求,遂就略去了,好了,郵件發送功能已經完成,這里看下實際效果:

怎么在springboot中添加郵件發送和壓縮功能

郵件功能實現完畢,現在我講講文件壓縮功能,壓縮功能的實現大致有四種,分別是:

  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是什么

springboot一種全新的編程規范,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。

關于怎么在springboot中添加郵件發送和壓縮功能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏山县| 文化| 五家渠市| 顺平县| 永德县| 永清县| 井冈山市| 丰都县| 大姚县| 广宗县| 开封市| 雷波县| 托克逊县| 赤峰市| 焉耆| 库尔勒市| 乌拉特后旗| 新巴尔虎左旗| 永春县| 瓦房店市| 砚山县| 开化县| 衢州市| 鹰潭市| 略阳县| 临武县| 斗六市| 田林县| 开原市| 淮滨县| 乌海市| 沈丘县| 越西县| 清河县| 洪洞县| 信阳市| 灵川县| 隆德县| 容城县| 江源县| 历史|