国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

結合Spring發送郵件的四種正確姿勢,你知道幾種?

doodlewind / 2332人閱讀

摘要:我拿網易郵箱賬號舉例子,那么我們如何才能讓你的郵箱賬號可以利用第三方發送郵件這里的第三方就是我們即將編寫的程序。

一 前言 測試所使用的環境

測試使用的環境是企業主流的SSM 框架即 SpringMVC+Spring+Mybatis。為了節省時間,我直接使用的是我上次的“SSM項目中整合Echarts開發”該項目已經搭建完成的SSM環境。

標題說的四種姿勢指的是哪四種姿勢?

發送text格式的郵件

發送HTML格式的郵件

基于FreeMarker模板引擎發送郵件

基于Velocity模板引擎發送郵件

如何獲取以及運行我的Demo

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

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

然后選擇導入Maven項目即可(不懂Maven的可以自行百度學習).

二 準備工作

既然要發送郵件,那么你首先要提供一個能在第三方軟件上發送郵件功能的賬號。在這里,我選擇的網易郵箱賬號。

我拿網易郵箱賬號舉例子,那么我們如何才能讓你的郵箱賬號可以利用第三方發送郵件(這里的第三方就是我們即將編寫的程序)。

大家應該清楚:客戶端和后臺交互數據的時候用到了Http協議,那么相應的,郵箱傳輸也有自己的一套協議,如SMTP,POP3,IMAP。

開啟POP3/SMTP/IMAP服務

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

如果你未開啟該服務的話,運行程序會報如下錯誤(配置文件中配置的密碼是你的授權碼而不是你登錄郵箱的密碼,授權碼是你第三方登錄的憑證):

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介紹

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

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

SMTP:簡單郵件傳輸協議,用于發送電子郵件的傳輸協議;

POP3:用于接收電子郵件的標準協議;

IMAP:互聯網消息協議,是POP3的替代協議。

這三種協議都有對應SSL加密傳輸的協議,分別是SMTPS,POP3S和IMAPS。

我們如果要使用JavaMail的話,需要自己引用相應的jar包,如下圖所示:

        
            javax.mail
            mail
            1.4.7
        
相關配置文件

下圖是除了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
#服務器主機名
mail.smtp.host=smtp.163.com
#你的郵箱地址
mail.smtp.username=koushuangbwcx@163.com
#你的授權碼
mail.smtp.password=cSdN153963000
#編碼格式
mail.smtp.defaultEncoding=utf-8
#是否進行用戶名密碼校驗
mail.smtp.auth=true
#設置超時時間
mail.smtp.timeout=20000

如果你的授權碼填寫錯誤的話,會報如下錯誤:

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
            
        
    


    
    
        
        
    

三 開始編寫工具類

我這里說是工具類,其實只是我自己做了簡單的封裝,實際項目使用的話,可能會需要根據需要簡單修改一下。

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

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

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

我在sendMail()方法中添加了一個boolean類型的變量type作為標志,如果為ture就表示發送html格式的郵件否則直接發送text格式的郵件。實現起來很簡單,我們通過下面的判斷語句就可以實現了

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

效果:

基于FreeMarker模板引擎發送郵件

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

    /**
     * FreeMarker模板格式的郵件的方法
     * 
     * @param subject
     *            郵件的主題也就是郵件的標題
     * @param location
     *            文件的地址
     * @param emailAdress
     *            目的地
     * @param javaMailSender
     *            發送郵件的核心類(在xml文件中已經配置好了)
     * @param freeMarkerConfiguration
     *            freemarker配置管理類
     * @return
     * @throws TemplateException
     */
    public String sendMailFreeMarker(String subject, String location, String emailAdress, JavaMailSender javaMailSender,
            Configuration freeMarkerConfiguration) {
        MimeMessage mMessage = javaMailSender.createMimeMessage();// 創建郵件對象
        MimeMessageHelper mMessageHelper;
        Properties prop = new Properties();
        try {
            // 從配置文件中拿到發件人郵箱地址
            prop.load(this.getClass().getResourceAsStream("/mail.properties"));
            String from = prop.get("mail.smtp.username") + "";
            mMessageHelper = new MimeMessageHelper(mMessage, true);
            // 發件人郵箱
            mMessageHelper.setFrom(from);
            // 收件人郵箱
            mMessageHelper.setTo(emailAdress);
            // 郵件的主題也就是郵件的標題
            mMessageHelper.setSubject(subject);
            // 解析模板文件
            mMessageHelper.setText(getText(freeMarkerConfiguration), true);
            // 通過文件路徑獲取文件名字
            String filename = StringUtils.getFileName(location);
            // 定義要發送的資源位置
            File file = new File(location);
            FileSystemResource resource = new FileSystemResource(file);
            mMessageHelper.addAttachment(filename, resource);// 在郵件中添加一個附件
            javaMailSender.send(mMessage);// 發送郵件
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "發送成功";
    }
    
      /**
     * 讀取freemarker模板的方法
     */
    private String getText(Configuration freeMarkerConfiguration) {
        String txt = "";
        try {
            Template template = freeMarkerConfiguration.getTemplate("email.ftl");
            // 通過map傳遞動態數據
            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 異常執行塊!
            e.printStackTrace();
        } catch (TemplateException e) {
            // TODO 異常執行塊!
            e.printStackTrace();
        }

        return txt;
    }

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




測試



你好Snailclimb

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

email.ftl




測試



你好${user}

效果:

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

基于Velocity模板引擎發送郵件
    /**
     * 
     * @param subject
     *            郵件主題
     * @param location
     *            收件人地址
     * @param emailAdress
     *            目的地
     * @param javaMailSender
     *            發送郵件的核心類(在xml文件中已經配置好了)
     * @param velocityEngine
     *            Velocity模板引擎
     * @return
     */
    public String sendMailVelocity(String subject, String location, String emailAdress, JavaMailSender javaMailSender,
            VelocityEngine velocityEngine) {
        MimeMessage mMessage = javaMailSender.createMimeMessage();// 創建郵件對象
        MimeMessageHelper mMessageHelper;
        Properties prop = new Properties();
        try {
            // 從配置文件中拿到發件人郵箱地址
            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");
            // 發件人郵箱
            mMessageHelper.setFrom(from);
            // 收件人郵箱
            mMessageHelper.setTo(emailAdress);
            // 郵件的主題也就是郵件的標題
            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);
            // 通過文件路徑獲取文件名字
            String filename = StringUtils.getFileName(location);
            // 定義要發送的資源位置
            File file = new File(location);
            FileSystemResource resource = new FileSystemResource(file);
            mMessageHelper.addAttachment(filename, resource);// 在郵件中添加一個附件
            // mMessageHelper.addAttachment("JavaApiRename.txt", resource2);//
            // 在郵件中添加一個附件
            javaMailSender.send(mMessage);// 發送郵件
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "發送成功";
    }

email.vm




    
    
 

今天的日期是:${date}

效果:

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

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

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

大傻子大傻子大傻子,你好!!!


" + " 四 總結

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

五 推薦一個自己的開源的后端文檔

Java-Guide: Java面試通關手冊(Java學習指南)。(star:1.4k)

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

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

你若盛開,清風自來。 歡迎關注我的微信公眾號:“Java面試通關手冊”,一個有溫度的微信公眾號。公眾號有大量資料,回復關鍵字“1”你可能看到想要的東西哦!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76677.html

相關文章

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

    摘要:前言目前的大環境下,使用作為持久層框架還是占了絕大多數的,下面我們來說一下使用的幾種姿勢。測試測試的程序與之前的一致,我們直接訪問,可以看到成功的結果姿勢三使用的姿勢和可以與上面兩種方式進行結合,。。。接口的實現是通過。然后我們將的改為。 前言 目前的大環境下,使用Mybatis作為持久層框架還是占了絕大多數的,下面我們來說一下使用Mybatis的幾種姿勢。 姿勢一:零配置注解開發 第...

    felix0913 評論0 收藏0
  • @ConfigurationProperties 注解使用姿勢,這一篇就夠了

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

    SolomonXie 評論0 收藏0
  • @ConfigurationProperties 注解使用姿勢,這一篇就夠了

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

    KoreyLee 評論0 收藏0
  • Java開發 大廠面試整理

    摘要:用戶態不能干擾內核態所以指令就有兩種特權指令和非特權指令不同的狀態對應不同的指令。非特權指令所有程序均可直接使用。用戶態常態目態執行非特權指令。 這是我今年從三月份開始,主要的大廠面試經過,有些企業面試的還沒來得及整理,可能有些沒有帶答案就發出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會持續更新,請各位持續關注,希望對你有所幫助! 面試清單 平安產險 飛豬 上汽大通 浩鯨科...

    Scorpion 評論0 收藏0
  • Spring Boot 郵件發送的 5 種姿勢

    摘要:也就是說用戶先將郵件投遞到騰訊的服務器這個過程就使用了協議,然后騰訊的服務器將郵件投遞到網易的服務器這個過程也依然使用了協議,服務器就是用來收郵件。 郵件發送其實是一個非常常見的需求,用戶注冊,找回密碼等地方,都會用到,使用 JavaSE 代碼發送郵件,步驟還是挺繁瑣的,Spring Boot 中對于郵件發送,提供了相關的自動化配置類,使得郵件發送變得非常容易,本文我們就來一探究竟!看...

    W4n9Hu1 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<