怎么在springboot中添加郵件發(fā)送和壓縮功能?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、南明網(wǎng)站維護(hù)、網(wǎng)站推廣。
首先郵件發(fā)送,郵件功能在springboot里面是有對應(yīng)的依賴組件,這個:
org.springframework.boot spring-boot-starter-mail
郵件功能開發(fā)在springboot里面相當(dāng)簡單,這里我大致總結(jié)下開發(fā)內(nèi)容:
A>添加依賴包
B>配置Mail基本參數(shù)(ymal或propertie里面)
C>Service中注入JavaMailSender,調(diào)用相關(guān)方法即可
但是這里面可能會有個問題,就是在具體服務(wù)器部署的時候服務(wù)器會封堵郵件服務(wù)端口,以及普通郵件安全問題,這里講解的時候我會順道給出解決之道。
首先,需要在工程的pom.xml中引入郵件組件,組件的版本需對應(yīng)springboot的版本(可不寫,這里我略去):
org.springframework.boot spring-boot-starter-mail
接下來就是在配置文件中配置郵件的基本參數(shù):
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ù)的時候一定要注意縮進(jìn),因?yàn)槲医o的是yaml的配置格式,若是properties配置,大致是這樣子(例子):spring.mail.host:smtp.exmail.qq.com,每一個子項都是完整的格式,一開始我是省略了properties項以下的配置(是否認(rèn)真,SSL,端口),后來發(fā)現(xiàn)服務(wù)器將郵件的25端口封了,所以在本地可以但是在服務(wù)器就行不通了,所以需要指定郵件服務(wù)端口為465,我這里使用的是qq郵箱,如果使用163或其他郵箱需自行查閱服務(wù)商支持的端口,至于郵件安全問題,在這里需要聲明兩個,一個是ssl信任,以及mail的socket工廠,具體請見以上紅色部分,以上配置僅對qq郵箱有效,不保證其他郵箱也適用。
ok,配置完成,這里就開始寫具體的實(shí)現(xiàn)類:
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
以上我是將郵件功能封裝成一個服務(wù)類,使用的時候只需要將當(dāng)前類注入 然后直接調(diào)用即可,以上封裝了兩個方法:一個是簡單郵件發(fā)送,一個是帶html table的郵件,如果需要發(fā)送附件,需將附件放入到MimeMessageHelper里面(調(diào)用addAttachment("文件名", 文件))方法即可,這里因?yàn)闊o實(shí)際需求,遂就略去了,好了,郵件發(fā)送功能已經(jīng)完成,這里看下實(shí)際效果:
郵件功能實(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í)現(xiàn)壓縮設(shè)置密碼,如果使用的是webLogic而不是tomocat的情況下,一定要注意到這個問題。
使用java調(diào)用宿主機(jī)的shell命令也是個不錯的選擇,但是,需要編寫shell命令,同時對于部署在windows平臺就不太友好了,移植比較麻煩。
最后,對于以上問題,我這里推薦zip4j,以下也是針對zip4j的壓縮實(shí)現(xiàn)做講解。
先,需要引入依賴包:
net.lingala.zip4j zip4j 1.3.2
再,封裝一個壓縮/解壓縮工具類以方便使用:
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; } } }
springboot一種全新的編程規(guī)范,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個服務(wù)于框架的框架,服務(wù)范圍是簡化配置文件。
關(guān)于怎么在springboot中添加郵件發(fā)送和壓縮功能問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。