亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

結(jié)合Spring發(fā)送郵件的四種正確姿勢(shì),你知道幾種?

doodlewind / 2506人閱讀

摘要:我拿網(wǎng)易郵箱賬號(hào)舉例子,那么我們?nèi)绾尾拍茏屇愕泥]箱賬號(hào)可以利用第三方發(fā)送郵件這里的第三方就是我們即將編寫的程序。

一 前言 測(cè)試所使用的環(huán)境

測(cè)試使用的環(huán)境是企業(yè)主流的SSM 框架即 SpringMVC+Spring+Mybatis。為了節(jié)省時(shí)間,我直接使用的是我上次的“SSM項(xiàng)目中整合Echarts開發(fā)”該項(xiàng)目已經(jīng)搭建完成的SSM環(huán)境。

標(biāo)題說(shuō)的四種姿勢(shì)指的是哪四種姿勢(shì)?

發(fā)送text格式的郵件

發(fā)送HTML格式的郵件

基于FreeMarker模板引擎發(fā)送郵件

基于Velocity模板引擎發(fā)送郵件

如何獲取以及運(yùn)行我的Demo

Github地址:https://github.com/Snailclimb/J2ee-Advanced。

你可以選擇直接下載或者直接在DOS窗口運(yùn)行:git clone https://github.com/Snailclimb/J2ee-Advanced.git命令,這樣項(xiàng)目就被拷貝到你的電腦了。

然后選擇導(dǎo)入Maven項(xiàng)目即可(不懂Maven的可以自行百度學(xué)習(xí)).

二 準(zhǔn)備工作

既然要發(fā)送郵件,那么你首先要提供一個(gè)能在第三方軟件上發(fā)送郵件功能的賬號(hào)。在這里,我選擇的網(wǎng)易郵箱賬號(hào)。

我拿網(wǎng)易郵箱賬號(hào)舉例子,那么我們?nèi)绾尾拍茏屇愕泥]箱賬號(hào)可以利用第三方發(fā)送郵件(這里的第三方就是我們即將編寫的程序)。

大家應(yīng)該清楚:客戶端和后臺(tái)交互數(shù)據(jù)的時(shí)候用到了Http協(xié)議,那么相應(yīng)的,郵箱傳輸也有自己的一套協(xié)議,如SMTP,POP3,IMAP。

開啟POP3/SMTP/IMAP服務(wù)

所以,我們第一步首先要去開啟這些服務(wù),如下圖所示:

如果你未開啟該服務(wù)的話,運(yùn)行程序會(huì)報(bào)如下錯(cuò)誤(配置文件中配置的密碼是你的授權(quán)碼而不是你登錄郵箱的密碼,授權(quán)碼是你第三方登錄的憑證):

HTTP Status 500 - Request processing failed; nested exception is org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 550 User has no permission
JavaMail介紹

我們需要用到的發(fā)郵件的核心jar包,所以這里好好介紹一下。

JavaMail是由Sun定義的一套收發(fā)電子郵件的API,不同的廠商可以提供自己的實(shí)現(xiàn)類。但它并沒(méi)有包含在JDK中,而是作為JavaEE的一部分。廠商所提供的JavaMail服務(wù)程序可以有選擇地實(shí)現(xiàn)某些郵件協(xié)議,常見(jiàn)的郵件協(xié)議包括:

SMTP:簡(jiǎn)單郵件傳輸協(xié)議,用于發(fā)送電子郵件的傳輸協(xié)議;

POP3:用于接收電子郵件的標(biāo)準(zhǔn)協(xié)議;

IMAP:互聯(lián)網(wǎng)消息協(xié)議,是POP3的替代協(xié)議。

這三種協(xié)議都有對(duì)應(yīng)SSL加密傳輸?shù)膮f(xié)議,分別是SMTPS,POP3S和IMAPS。

我們?nèi)绻褂肑avaMail的話,需要自己引用相應(yīng)的jar包,如下圖所示:

        
            javax.mail
            mail
            1.4.7
        
相關(guān)配置文件

下圖是除了pom.xml之外用到的其他所有配置文件

pom.xml

需要用到的jar包。

        
        
              org.springframework
              spring-context-support
              5.0.0.RELEASE
        
        
        
            javax.mail
            mail
            1.4.7
        
        
        
            org.freemarker
            freemarker
            2.3.23
        
        
        
            org.apache.velocity
            velocity
            1.7
        
        
            org.apache.velocity
            velocity-tools
            2.0
        
mail.properties
#服務(wù)器主機(jī)名
mail.smtp.host=smtp.163.com
#你的郵箱地址
mail.smtp.username=koushuangbwcx@163.com
#你的授權(quán)碼
mail.smtp.password=cSdN153963000
#編碼格式
mail.smtp.defaultEncoding=utf-8
#是否進(jìn)行用戶名密碼校驗(yàn)
mail.smtp.auth=true
#設(shè)置超時(shí)時(shí)間
mail.smtp.timeout=20000

如果你的授權(quán)碼填寫錯(cuò)誤的話,會(huì)報(bào)如下錯(cuò)誤:

TTP Status 500 - Request processing failed; nested exception is org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535 Error: authentication failed
velocity.properties
input.encoding=UTF-8  
output.encoding=UTF-8  
contentType=ext/html;charset=UTF-8
directive.foreach.counter.name=loopCounter  
directive.foreach.counter.initial.value=0
applicationContext-email.xml



    
    

    
    
        
        
        
        
        
            
                ${mail.smtp.auth}
                ${mail.smtp.timeout}
            
        
    
    
    
        
        
        
            
                UTF-8
            
        
    


    
    
        
        
    

三 開始編寫工具類

我這里說(shuō)是工具類,其實(shí)只是我自己做了簡(jiǎn)單的封裝,實(shí)際項(xiàng)目使用的話,可能會(huì)需要根據(jù)需要簡(jiǎn)單修改一下。

所有用到的類如下圖所示:

發(fā)送Text或者HTML格式的郵件的方法
    /**
     * 
     * Text或者HTML格式郵件的方法
     * 
     * @param text
     *            要發(fā)送的內(nèi)容
     * @param subject
     *            郵件的主題也就是郵件的標(biāo)題
     * @param location
     *            文件的地址
     * @param emailAdress
     *            目的地
     * @param javaMailSender
     *            發(fā)送郵件的核心類(在xml文件中已經(jīng)配置好了)
     * @param type
     *            如果為true則代表發(fā)送HTML格式的文本
     * @return
     * @throws TemplateException
     */
    public String sendMail(String text, String subject, String location, String emailAdress,
            JavaMailSender javaMailSender, Boolean type) {
        MimeMessage mMessage = javaMailSender.createMimeMessage();// 創(chuàng)建郵件對(duì)象
        MimeMessageHelper mMessageHelper;
        Properties prop = new Properties();
        try {
            // 從配置文件中拿到發(fā)件人郵箱地址
            prop.load(this.getClass().getResourceAsStream("/mail.properties"));
            String from = prop.get("mail.smtp.username") + "";
            mMessageHelper = new MimeMessageHelper(mMessage, true, "UTF-8");
            // 發(fā)件人郵箱
            mMessageHelper.setFrom(from);
            // 收件人郵箱
            mMessageHelper.setTo(emailAdress);
            // 郵件的主題也就是郵件的標(biāo)題
            mMessageHelper.setSubject(subject);
            // 郵件的文本內(nèi)容,true表示文本以html格式打開
            if (type) {
                mMessageHelper.setText(text, true);
            } else {
                mMessageHelper.setText(text, false);
            }

            // 通過(guò)文件路徑獲取文件名字
            String filename = StringUtils.getFileName(location);
            // 定義要發(fā)送的資源位置
            File file = new File(location);
            FileSystemResource resource = new FileSystemResource(file);
            FileSystemResource resource2 = new FileSystemResource("D:/email.txt");
            mMessageHelper.addAttachment(filename, resource);// 在郵件中添加一個(gè)附件
            mMessageHelper.addAttachment("JavaApiRename.txt", resource2);//
            // 在郵件中添加一個(gè)附件
            javaMailSender.send(mMessage);// 發(fā)送郵件
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "發(fā)送成功";
    }

我在sendMail()方法中添加了一個(gè)boolean類型的變量type作為標(biāo)志,如果為ture就表示發(fā)送html格式的郵件否則直接發(fā)送text格式的郵件。實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,我們通過(guò)下面的判斷語(yǔ)句就可以實(shí)現(xiàn)了

            if (type) {
                //表示文本以html格式打開
                mMessageHelper.setText(text, true);
            } else {
                mMessageHelper.setText(text, false);
            }

效果:

基于FreeMarker模板引擎發(fā)送郵件

下圖是我們用到的FreeMarker模板文件以及Velocity模板文件的位置。

    /**
     * FreeMarker模板格式的郵件的方法
     * 
     * @param subject
     *            郵件的主題也就是郵件的標(biāo)題
     * @param location
     *            文件的地址
     * @param emailAdress
     *            目的地
     * @param javaMailSender
     *            發(fā)送郵件的核心類(在xml文件中已經(jīng)配置好了)
     * @param freeMarkerConfiguration
     *            freemarker配置管理類
     * @return
     * @throws TemplateException
     */
    public String sendMailFreeMarker(String subject, String location, String emailAdress, JavaMailSender javaMailSender,
            Configuration freeMarkerConfiguration) {
        MimeMessage mMessage = javaMailSender.createMimeMessage();// 創(chuàng)建郵件對(duì)象
        MimeMessageHelper mMessageHelper;
        Properties prop = new Properties();
        try {
            // 從配置文件中拿到發(fā)件人郵箱地址
            prop.load(this.getClass().getResourceAsStream("/mail.properties"));
            String from = prop.get("mail.smtp.username") + "";
            mMessageHelper = new MimeMessageHelper(mMessage, true);
            // 發(fā)件人郵箱
            mMessageHelper.setFrom(from);
            // 收件人郵箱
            mMessageHelper.setTo(emailAdress);
            // 郵件的主題也就是郵件的標(biāo)題
            mMessageHelper.setSubject(subject);
            // 解析模板文件
            mMessageHelper.setText(getText(freeMarkerConfiguration), true);
            // 通過(guò)文件路徑獲取文件名字
            String filename = StringUtils.getFileName(location);
            // 定義要發(fā)送的資源位置
            File file = new File(location);
            FileSystemResource resource = new FileSystemResource(file);
            mMessageHelper.addAttachment(filename, resource);// 在郵件中添加一個(gè)附件
            javaMailSender.send(mMessage);// 發(fā)送郵件
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "發(fā)送成功";
    }
    
      /**
     * 讀取freemarker模板的方法
     */
    private String getText(Configuration freeMarkerConfiguration) {
        String txt = "";
        try {
            Template template = freeMarkerConfiguration.getTemplate("email.ftl");
            // 通過(guò)map傳遞動(dòng)態(tài)數(shù)據(jù)
            Map map = new HashMap();
            map.put("user", "Snailclimb");
            // 解析模板文件
            txt = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
            System.out.println("getText()->>>>>>>>>");// 輸出的是HTML格式的文檔
            System.out.println(txt);
        } catch (IOException e) {
            // TODO 異常執(zhí)行塊!
            e.printStackTrace();
        } catch (TemplateException e) {
            // TODO 異常執(zhí)行塊!
            e.printStackTrace();
        }

        return txt;
    }

我們通過(guò)getText(Configuration freeMarkerConfiguration)方法讀取freemarker模板,返回的格式如下圖所示:




測(cè)試



你好Snailclimb

其實(shí)就是HTML,然后我們就可以像前面發(fā)送HTML格式郵件的方式發(fā)送這端消息了。

email.ftl




測(cè)試



你好${user}

效果:

不知道為啥,騰訊每次把我使用模板引擎發(fā)的郵件直接放到垃圾箱。大家如果遇到接收不到郵件,但是又沒(méi)報(bào)錯(cuò)的情況,可以看看是不是到了自己郵箱的垃圾箱。

基于Velocity模板引擎發(fā)送郵件
    /**
     * 
     * @param subject
     *            郵件主題
     * @param location
     *            收件人地址
     * @param emailAdress
     *            目的地
     * @param javaMailSender
     *            發(fā)送郵件的核心類(在xml文件中已經(jīng)配置好了)
     * @param velocityEngine
     *            Velocity模板引擎
     * @return
     */
    public String sendMailVelocity(String subject, String location, String emailAdress, JavaMailSender javaMailSender,
            VelocityEngine velocityEngine) {
        MimeMessage mMessage = javaMailSender.createMimeMessage();// 創(chuàng)建郵件對(duì)象
        MimeMessageHelper mMessageHelper;
        Properties prop = new Properties();
        try {
            // 從配置文件中拿到發(fā)件人郵箱地址
            prop.load(this.getClass().getResourceAsStream("/mail.properties"));
            System.out.println(this.getClass().getResourceAsStream("/mail.properties"));
            String from = prop.get("mail.smtp.username") + "";
            mMessageHelper = new MimeMessageHelper(mMessage, true, "UTF-8");
            // 發(fā)件人郵箱
            mMessageHelper.setFrom(from);
            // 收件人郵箱
            mMessageHelper.setTo(emailAdress);
            // 郵件的主題也就是郵件的標(biāo)題
            mMessageHelper.setSubject(subject);
            Map map = new HashMap<>();
            // 獲取日期并格式化
            Date date = new Date();
            DateFormat bf = new SimpleDateFormat("yyyy-MM-dd E a HH:mm:ss");
            String str = bf.format(date);
            map.put("date", str);
            String content = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "email.vm", "UTF-8", map);
            mMessageHelper.setText(content, true);
            // 通過(guò)文件路徑獲取文件名字
            String filename = StringUtils.getFileName(location);
            // 定義要發(fā)送的資源位置
            File file = new File(location);
            FileSystemResource resource = new FileSystemResource(file);
            mMessageHelper.addAttachment(filename, resource);// 在郵件中添加一個(gè)附件
            // mMessageHelper.addAttachment("JavaApiRename.txt", resource2);//
            // 在郵件中添加一個(gè)附件
            javaMailSender.send(mMessage);// 發(fā)送郵件
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "發(fā)送成功";
    }

email.vm




    
    
 

今天的日期是:${date}

效果:

controller層
/**
 * 測(cè)試郵件發(fā)送controller
 * @author Snailclimb
 */
@RestController
@RequestMapping("mail")
public class SendMailController {
    @Autowired
    private JavaMailSender javaMailSender;// 在spring中配置的郵件發(fā)送的bean
    @Autowired
    private Configuration configuration;
    @Autowired
    private VelocityEngine velocityEngine;

    // text
    @RequestMapping("send")
    public String sendEmail() {
        EmailUtils emailUtils = new EmailUtils();
        return emailUtils.sendMail("大傻子大傻子大傻子,你好?。?!", "發(fā)送給我家大傻子的~", "D:/picture/meizi.jpg", "1361583339@qq.com",
                javaMailSender, false);
    }

    // html
    @RequestMapping("send2")
    public String sendEmail2() {
        EmailUtils emailUtils = new EmailUtils();
        return emailUtils.sendMail(
                "

大傻子大傻子大傻子,你好?。?!


" + " 四 總結(jié)

上面我們總結(jié)了Spring發(fā)送郵件的四種正確姿勢(shì),并且將核心代碼提供給了大家。代碼中有我很詳細(xì)的注釋,所以我對(duì)于代碼以及相關(guān)類的講解很少,感興趣的同學(xué)可以自行學(xué)習(xí)。最后,本項(xiàng)目Github地址:https://github.com/Snailclimb/J2ee-Advanced。

五 推薦一個(gè)自己的開源的后端文檔

Java-Guide: Java面試通關(guān)手冊(cè)(Java學(xué)習(xí)指南)。(star:1.4k)

Github地址:https://github.com/Snailclimb/Java-Guide

文檔定位:一個(gè)專門為Java后端工程師準(zhǔn)備的開源文檔,相信不論你是Java新手還是已經(jīng)成為一名Java工程師都能從這份文檔中收獲到一些東西。

你若盛開,清風(fēng)自來(lái)。 歡迎關(guān)注我的微信公眾號(hào):“Java面試通關(guān)手冊(cè)”,一個(gè)有溫度的微信公眾號(hào)。公眾號(hào)有大量資料,回復(fù)關(guān)鍵字“1”你可能看到想要的東西哦!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/76677.html

相關(guān)文章

  • Spring Boot 2.x(四):整合Mybatis四種方式

    摘要:前言目前的大環(huán)境下,使用作為持久層框架還是占了絕大多數(shù)的,下面我們來(lái)說(shuō)一下使用的幾種姿勢(shì)。測(cè)試測(cè)試的程序與之前的一致,我們直接訪問(wèn),可以看到成功的結(jié)果姿勢(shì)三使用的姿勢(shì)和可以與上面兩種方式進(jìn)行結(jié)合,。。。接口的實(shí)現(xiàn)是通過(guò)。然后我們將的改為。 前言 目前的大環(huán)境下,使用Mybatis作為持久層框架還是占了絕大多數(shù)的,下面我們來(lái)說(shuō)一下使用Mybatis的幾種姿勢(shì)。 姿勢(shì)一:零配置注解開發(fā) 第...

    felix0913 評(píng)論0 收藏0
  • @ConfigurationProperties 注解使用姿勢(shì),這一篇就夠了

    摘要:在項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過(guò)注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個(gè)發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個(gè)模塊中的屬性變得容易。 在編寫項(xiàng)目代碼時(shí),我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...

    SolomonXie 評(píng)論0 收藏0
  • @ConfigurationProperties 注解使用姿勢(shì),這一篇就夠了

    摘要:在項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過(guò)注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個(gè)發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個(gè)模塊中的屬性變得容易。 在編寫項(xiàng)目代碼時(shí),我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...

    KoreyLee 評(píng)論0 收藏0
  • Java開發(fā) 大廠面試整理

    摘要:用戶態(tài)不能干擾內(nèi)核態(tài)所以指令就有兩種特權(quán)指令和非特權(quán)指令不同的狀態(tài)對(duì)應(yīng)不同的指令。非特權(quán)指令所有程序均可直接使用。用戶態(tài)常態(tài)目態(tài)執(zhí)行非特權(quán)指令。 這是我今年從三月份開始,主要的大廠面試經(jīng)過(guò),有些企業(yè)面試的還沒(méi)來(lái)得及整理,可能有些沒(méi)有帶答案就發(fā)出來(lái)了,還請(qǐng)各位先思考如果是你怎么回答面試官?這篇文章會(huì)持續(xù)更新,請(qǐng)各位持續(xù)關(guān)注,希望對(duì)你有所幫助! 面試清單 平安產(chǎn)險(xiǎn) 飛豬 上汽大通 浩鯨科...

    Scorpion 評(píng)論0 收藏0
  • Spring Boot 郵件發(fā)送的 5 種姿勢(shì)

    摘要:也就是說(shuō)用戶先將郵件投遞到騰訊的服務(wù)器這個(gè)過(guò)程就使用了協(xié)議,然后騰訊的服務(wù)器將郵件投遞到網(wǎng)易的服務(wù)器這個(gè)過(guò)程也依然使用了協(xié)議,服務(wù)器就是用來(lái)收郵件。 郵件發(fā)送其實(shí)是一個(gè)非常常見(jiàn)的需求,用戶注冊(cè),找回密碼等地方,都會(huì)用到,使用 JavaSE 代碼發(fā)送郵件,步驟還是挺繁瑣的,Spring Boot 中對(duì)于郵件發(fā)送,提供了相關(guān)的自動(dòng)化配置類,使得郵件發(fā)送變得非常容易,本文我們就來(lái)一探究竟!看...

    W4n9Hu1 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<