国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能

springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能

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

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

  這次本來只講講郵件發(fā)送功能的,憚于內(nèi)容比較貧乏,故加了點(diǎn)兒文件壓縮的功能講解。

  首先郵件發(fā)送,郵件功能在springboot里面是有對應(yīng)的依賴組件,這個:

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

郵件功能開發(fā)在springboot里面相當(dāng)簡單,這里我大致總結(jié)下開發(fā)內(nèi)容:

    a>添加依賴包

    b>配置mail基本參數(shù)(ymal或propertie里面)

    c>service中注入javamailsender,調(diào)用相關(guān)方法即可

但是這里面可能會有個問題,就是在具體服務(wù)器部署的時(shí)候服務(wù)器會封堵郵件服務(wù)端口,以及普通郵件安全問題,這里講解的時(shí)候我會順道給出解決之道。

  首先,需要在工程的pom.xml中引入郵件組件,組件的版本需對應(yīng)springboot的版本(可不寫,這里我略去):

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

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

?
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 #是否需要認(rèn)證
   socketfactory:
    class: javax.net.ssl.sslsocketfactory #ssl證書socket工廠
    port: 465 #使用smtp465端口

配置參數(shù)的時(shí)候一定要注意縮進(jìn),因?yàn)槲医o的是yaml的配置格式,若是properties配置,大致是這樣子(例子):spring.mail.host:smtp.exmail.qq.com,每一個子項(xiàng)都是完整的格式,一開始我是省略了properties項(xiàng)以下的配置(是否認(rèn)真,ssl,端口),后來發(fā)現(xiàn)服務(wù)器將郵件的25端口封了,所以在本地可以但是在服務(wù)器就行不通了,所以需要指定郵件服務(wù)端口為465,我這里使用的是qq郵箱,如果使用163或其他郵箱需自行查閱服務(wù)商支持的端口,至于郵件安全問題,在這里需要聲明兩個,一個是ssl信任,以及mail的socket工廠,具體請見以上紅色部分,以上配置僅對qq郵箱有效,不保證其他郵箱也適用。

  ok,配置完成,這里就開始寫具體的實(shí)現(xiàn)類:

?
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;
 /**
  *  發(fā)送簡單郵件
  * @param receive 收件人
  * @param obj  發(fā)送主題
  * @param content 郵件內(nèi)容
  */
 public void sendsimplemail(string receive,string obj,string content) {
  if(!stringutils.isnotblank(content) || !stringutils.isnotblank(receive))
   return;//不發(fā)送空郵件
  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;
 /**
  * 發(fā)送html郵件 多列表單的形式
  * @param receive 收件人
  * @param obj  發(fā)送主題(題目)
  * @param content 郵件內(nèi)容
  */
 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);
  }
 /**
  * 發(fā)送html郵件 單列記錄形式
  * @param receive 收件人
  * @param obj  發(fā)送主題(題目)
  * @param content 郵件內(nèi)容
  */
 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);
 }
}


以上我是將郵件功能封裝成一個服務(wù)類,使用的時(shí)候只需要將當(dāng)前類注入 然后直接調(diào)用即可,以上封裝了兩個方法:一個是簡單郵件發(fā)送,一個是帶html table的郵件,如果需要發(fā)送附件,需將附件放入到mimemessagehelper里面(調(diào)用addattachment("文件名", 文件))方法即可,這里因?yàn)闊o實(shí)際需求,遂就略去了,好了,郵件發(fā)送功能已經(jīng)完成,這里看下實(shí)際效果:

springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能

郵件功能實(shí)現(xiàn)完畢,現(xiàn)在我講講文件壓縮功能,壓縮功能的實(shí)現(xiàn)大致有四種,分別是:

  a>利用java.util.zip提供的api壓縮

  b>利用apache的ant包提供的api壓縮(org.apache.tools.ant.taskdefs.zip)

  c>使用zip4j提供的api壓縮(net.lingala.zip4j)

  d>調(diào)用宿主機(jī)的shell命令壓縮

這里需要特別提到三個問題:

  a>普通郵件壓縮中文亂碼(不支持中文)

  b>壓縮后無法解壓(解壓錯誤)

  c>文件壓縮添加壓縮密碼問題

實(shí)際開發(fā)過壓縮功能,以上三點(diǎn)兒對于新手來說尤其的頭痛,這里我分享下以前在開發(fā)壓縮功能中碰到的問題。

  使用原生java.util包提供的壓縮,如果被壓縮文件使用到中文,則會亂碼(據(jù)說是jdk的一個bug),而且壓縮實(shí)現(xiàn)的代碼較為復(fù)雜(尤其是設(shè)置密碼),尤其是對于跨目錄壓縮和多文件壓縮尤其麻煩。

  使用apache提供的zip工具雖避免了以上會出現(xiàn)的問題,但是需要提醒一點(diǎn)兒的是這個ant包與weblogic沖突(部署的時(shí)候會報(bào)錯)且無法實(shí)現(xiàn)壓縮設(shè)置密碼,如果使用的是weblogic而不是tomocat的情況下,一定要注意到這個問題。

  使用java調(diào)用宿主機(jī)的shell命令也是個不錯的選擇,但是,需要編寫shell命令,同時(shí)對于部署在windows平臺就不太友好了,移植比較麻煩。

  最后,對于以上問題,我這里推薦zip4j,以下也是針對zip4j的壓縮實(shí)現(xiàn)做講解。

  先,需要引入依賴包:

?
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來進(jìn)行壓縮以及解壓縮
 */
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); // 壓縮方式(默認(rèn)方式)
  parameters.setcompressionlevel(zip4jconstants.deflate_level_normal); // 壓縮級別(默認(rèn)級別)
  //壓縮加密設(shè)置
  if (!stringutils.isempty(password)) {
   parameters.setencryptfiles(true);//是否設(shè)置文件加密(默認(rèn)為否)
   parameters.setencryptionmethod(zip4jconstants.enc_method_standard); // 加密方式(此處是標(biāo)準(zhǔn)壓縮)
   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("文件個數(shù)=>"+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");//設(shè)置編碼格式
   //用自帶的方法檢測一下zip文件是否合法,包括文件是否存在、是否為zip文件、是否被損壞等
   if (!ziputil.zipfile.isvalidzipfile()) {
    throw new zipexception("文件不合法或不存在");
   }
   // 跟java自帶相比,這里文件路徑會自動生成,不用判斷
   ziputil.zipfile.extractall(unzipdir);
   return true;
  }catch(zipexception e){
   return false;
  }
 }
}

以上壓縮方法自帶密碼壓縮功能,可以壓縮單文件也可以壓縮目錄文件,相對于原生的實(shí)現(xiàn),一下子清爽了許多,這里唯一需要說明的是,壓縮的目標(biāo)文件在壓縮前一定不能穿件,否則會報(bào)錯!另外對于解壓縮一定要注意文件編碼和判斷文件是否存在。

總結(jié)

以上所述是小編給大家介紹的springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能 ,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時(shí)回復(fù)大家的!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人性大片免费观看网站 | 国偷自产一区二区免费视频 | 久久男人天堂 | 色九九 | 99亚洲| 激情五月婷婷基地 | 韩日精品视频 | 久久伊人一区 | 99精品欧美一区二区三区综合在线 | 国产精品自拍视频 | 激情欧美日韩一区二区 | 亚洲区欧美区 | 国产激情视频 | 亚洲国产91 | 成人片网址 | 亚洲国产成人av | 天堂在线免费视频 | 精品亚洲一区二区 | 四虎影视在线播放 | 国产精品一区二区久久久 | 国产成人网 | 免费黄网视频 | 伊人网在线视频免费观看 | 免费成人av| 黄色在线观看网站 | 色综合久久久久 | 日韩一区二区在线观看 | 久久久免费 | 正在播放国产一区 | 亚洲视频在线一区 | 国产一区二区在线播放 | youjizz国产| 久久久91精品国产一区二区三区 | 精品一区二区三区四区 | 欧洲黄色 级黄色99片 | 私人毛片免费高清视频 | 在线观看一区视频 | 日日干日日爽 | 黄色免费网| 国产精品日韩在线观看 | 狠狠爱网站 |