激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - springboot實現添加郵件發送及壓縮功能

springboot實現添加郵件發送及壓縮功能

2021-05-17 14:17funnyZpC Java教程

這篇文章主要介紹了springboot實現添加郵件發送及壓縮功能 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

  這次本來只講講郵件發送功能的,憚于內容比較貧乏,故加了點兒文件壓縮的功能講解。

  首先郵件發送,郵件功能在springboot里面是有對應的依賴組件,這個:

?
1
2
3
4
5
<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的版本(可不寫,這里我略去):

?
1
2
3
4
<dependency>
 <groupid>org.springframework.boot</groupid>
 <artifactid>spring-boot-starter-mail</artifactid>
</dependency>

  接下來就是在配置文件中配置郵件的基本參數:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,配置完成,這里就開始寫具體的實現類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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("文件名", 文件))方法即可,這里因為無實際需求,遂就略去了,好了,郵件發送功能已經完成,這里看下實際效果:

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的壓縮實現做講解。

  先,需要引入依賴包:

?
1
2
3
4
5
6
<!--壓縮:支持加密壓縮-->
<dependency>
  <groupid>net.lingala.zip4j</groupid>
  <artifactid>zip4j</artifactid>
  <version>1.3.2</version>
 </dependency>

  再,封裝一個壓縮/解壓縮工具類以方便使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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實現添加郵件發送及壓縮功能 ,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

原文鏈接:https://www.cnblogs.com/funnyzpc/archive/2018/07/14/9190233.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久草视频国产在线 | 精品久久久久久亚洲精品 | 欧美a视频在线观看 | 免费毛片播放 | 最新av网址在线观看 | 失禁高潮抽搐喷水h | 91专区在线观看 | 色婷婷a v | 久久91久久 | 羞羞色院91精品网站 | 中文字幕免费一区 | 久久综合久久美利坚合众国 | av免播放| 99热草| 欧美激情第一区 | 久久久av亚洲男天堂 | 国产亚洲精品久久久久久网站 | 免费a级网站 | 国产一区日韩精品 | 密室逃脱第一季免费观看完整在线 | 国产精品麻豆一区二区三区 | 免费a级毛片大学生免费观看 | 日韩av在线网 | 毛片中文字幕 | 亚洲一区免费电影 | www.99av| 一区二区三区日韩在线 | 日韩精品网站在线观看 | 久久亚洲精品国产一区 | 在线小视频国产 | 欧美亚洲免费 | 污污黄 | 免费黄色在线电影 | 国产妞干网 | 欧产日产国产精品v | 久久久国产视频 | 国产老师做www爽爽爽视频 | 毛片在哪里看 | 亚洲国产精品一区二区久久 | xnxx 美女19| 欧美成人三级视频 |