最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot配置Email發(fā)送功能實(shí)例

 更新時(shí)間:2017年04月26日 14:28:28   作者:qianweifeng123  
本篇文章主要介紹了SpringBoot配置Email發(fā)送功能實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

本篇介紹在SpringBoot中配置Email服務(wù)的具體步驟,以及常見的異常分析。

具體案例以QQ郵箱以及QQ企業(yè)郵箱為例。

  1. QQ郵箱發(fā)送方式
  2. QQ企業(yè)郵箱發(fā)送方式
  3. 總結(jié)

tips:

下面提到的hashIndex指的是一個(gè)元素put到hashmap中時(shí),要根據(jù)其key.hashcode & (table.size()-1)來決定其在table中的位置。

table是一個(gè)數(shù)組,類型為Node。Node是hashmap的一個(gè)內(nèi)部類,用來描述hashmap的元素的一些屬性。

1.相關(guān)依賴包

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RELEASE</version>
</parent>

 <dependencies>
    <!-- springBoot-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>1.3.0.RELEASE</version>
    </dependency>
    <!-- email -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <!-- html模板 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-velocity</artifactId>
    </dependency>
</dependencies>

SpringBoot以及mail的依賴包就不做解釋了。

這里簡(jiǎn)單介紹下velocity的作用:

Velocity 是一個(gè)基于 Java 的模板引擎框架,提供的模板語言可以使用在 Java 中定義的對(duì)象和變量上。

作為郵件模板也是它的一個(gè)主要應(yīng)用場(chǎng)景。

具體用法在下面會(huì)進(jìn)行說明。

2.具體案例

1.使用QQ郵箱進(jìn)行發(fā)送

application.properties

#發(fā)送郵箱(可以填你自己的郵箱)
email.from = xxxxxxx@qq.com
#目標(biāo)郵箱
email.to = 
#郵箱服務(wù)器
email.host = smtp.qq.com
#授權(quán)碼,在QQ郵箱客戶端生成
email.auth = kpzmxhrkqklwbbbd

大家可能不理解auth授權(quán)碼是干什么用的。

這相當(dāng)于是當(dāng)以第三方形式登錄時(shí)用非密碼驗(yàn)證的一種手段。

在QQ郵箱->設(shè)置->賬戶 往下拉可以找到。

同時(shí)需要把POP3/SMTP服務(wù)開啟。

授權(quán)碼

JavaMailSender

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import java.util.Properties;

/**
 * author  : qianweifeng
 * date   : 16/4/9.
 * describe :
 */
@Configuration
public class MailConfig {

  @Autowired
  private Environment env;

  @Bean(name = "JavaMailSender")
  public JavaMailSender getSender(){
    JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
    javaMailSender.setUsername(env.getProperty(ConfigConstant.EMAIL_FROM));
    javaMailSender.setHost(env.getProperty(ConfigConstant.EMAIL_HOST));
    javaMailSender.setPort(587);//①
    javaMailSender.setDefaultEncoding("UTF-8");
    Properties props = new Properties();//②
    props.setProperty("mail.smtp.host", env.getProperty(ConfigConstant.EMAIL_HOST));
    props.setProperty("mail.smtp.auth", "true");
    javax.mail.Session session = javax.mail.Session.getDefaultInstance(props,new Authenticator(){
      @Override
      protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication("xxxxxx@qq.com",env.getProperty(ConfigConstant.EMAIL_AUTH));
      }
    });
    javaMailSender.setSession(session);//③
    return javaMailSender;
  }

 
}

這是Java郵件發(fā)送的一個(gè)具體實(shí)現(xiàn)Bean。

關(guān)于JavaMailSender的內(nèi)容大家自行看源碼或者度娘。

這里說明3個(gè)方面。

1.javaMailSender.setPort(587) 這個(gè)端口不是隨意設(shè)置的,根據(jù)郵箱服務(wù)器以及協(xié)議來定的。我在網(wǎng)上找了相關(guān)資料,大家參考下:

2.關(guān)于Properties的設(shè)置。這里只需要設(shè)置其郵箱服務(wù)器以及啟用授權(quán)碼驗(yàn)證方式即可。

3.session完成的使用授權(quán)碼驗(yàn)證郵件發(fā)送方,相當(dāng)于建立起一個(gè)有效會(huì)話。

import com.service.config.ConfigConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.SmartLifecycle;
import org.springframework.core.env.Environment;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Component;

import javax.mail.internet.MimeMessage;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * author  : qianweifeng
 * date   : 16/4/9.
 * describe :
 */
@Component
public class MailUtil implements SmartLifecycle {
  @Autowired
  private JavaMailSender javaMailSender;

  @Autowired
  private Environment env;

  private Logger logger = LoggerFactory.getLogger(MailUtil.class);

  private ScheduledExecutorService service = Executors.newScheduledThreadPool(2);

  private final AtomicInteger count = new AtomicInteger(1);

  public MimeMessagePreparator Send(final String text) {
    MimeMessagePreparator preparator = new MimeMessagePreparator() {
      public void prepare(MimeMessage mimeMessage) throws Exception {
        MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
        message.setTo(env.getProperty(ConfigConstant.EMAIL_TO));
        message.setFrom(env.getProperty(ConfigConstant.EMAIL_FROM));
        message.setSubject("java email send test");
//        String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "velocity/report.vm", "UTF-8", model);
        message.setText(text, true);
      }
    };
    return preparator;
  }


  @Override
  public boolean isAutoStartup() {
    return true;
  }

  @Override
  public void stop(Runnable runnable) {

  }

  @Override
  public void start() {
    service.scheduleWithFixedDelay(new Runnable() {
      @Override
      public void run() {
        try {
          if (count.get() == 2) {
            service.shutdown();
            logger.info("the task is down");
          }
          logger.info("start send email and the index is " + count);

          javaMailSender.send(Send("test !" + "*" + count.getAndIncrement()));

          logger.info("send email success");
        }catch (Exception e){
          logger.error("send email fail" , e);
        }

      }
    },2000,2000, TimeUnit.MILLISECONDS);
  }

  @Override
  public void stop() {

  }

  @Override
  public boolean isRunning() {
    return false;
  }

  @Override
  public int getPhase() {
    return 0;
  }
}

使用方式:

將郵件服務(wù)器,授權(quán)碼,發(fā)送方,接受放在application.properties配置好。

項(xiàng)目啟動(dòng)后就會(huì)開始發(fā)送,總共發(fā)送2封郵件。

使用velocity來構(gòu)建郵件正文

public void send(final String date, final String date2) {


    final List<UVBean> uVBean = getUV(start, end);
    final List<UserResAndLoginReport> resAndLoginReports = dao.RegisterAndLogin(start, end);

    Map model = new HashMap();
    model.put("uVBean", uVBean);
    model.put("resAndLoginReports", resAndLoginReports);
        String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "velocity/report.vm", "UTF-8", model);
}

<h3>1.UV</h3>
<TABLE border="1px" style="border-collapse: collapse;">
  <TR>
    <td nowrap="nowarp" style="width:80px;" class="date">日期</td>
    <td nowrap="nowarp" style="width:120px;" class="head">UV</td>
  </TR>
  #foreach( $data in $uVBean )
    <TR>
      <TD nowrap="nowarp" class="date">${data.date}</TD>
      <TD nowrap="nowarp" class="count">${data.data}</TD>
    </TR>
  #end
</TABLE>
...

假設(shè)我們需要在郵件中顯示的一些復(fù)雜內(nèi)容,可以后臺(tái)以對(duì)象的形式包裝起來,放入一個(gè)hashmap中,在velocity解析出來,至于如何解析,那就是velocity的語義的問題了。

使用velocity可以在郵件正文中以html的方式來豐富化郵件。

2.使用QQ企業(yè)郵箱進(jìn)行發(fā)送

過程以及代碼幾乎相同

區(qū)別是郵件服務(wù)器為:smtp.exmail.qq.com或者pop.exmail.qq.com

沒有授權(quán)碼這一概念。

發(fā)送端口號(hào)25或者SMTP協(xié)議下端口為465,POP協(xié)議下端口為995。

推薦驗(yàn)證方式為直接用戶名+密碼,或者用ssl方式進(jìn)行驗(yàn)證。

具體參考騰訊企業(yè)郵箱客戶端設(shè)置

給出一個(gè)簡(jiǎn)單的樣例:

 JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
    javaMailSender.setUsername(env.getProperty("spring.mail.username"));
    javaMailSender.setHost(env.getProperty("spring.mail.host"));
    javaMailSender.setPassword(env.getProperty("spring.mail.password"));
    javaMailSender.setPort(25);
    javaMailSender.setDefaultEncoding("UTF-8");
    javaMailSender.send(preparator);

preparator就是上面出現(xiàn)過的MimeMessagePreparator的實(shí)例。配置方法見上。

3.總結(jié)

1.發(fā)送郵件我們首要配置的包括:郵箱服務(wù)器,協(xié)議,端口。

2.一般驗(yàn)證有兩種方式,一種是直接的用戶名密碼,另一種是通過授權(quán)碼或者ssl進(jìn)行驗(yàn)證。

3.郵件的正文可以是純文本,或者是html內(nèi)容,html內(nèi)容可以由velocity模板構(gòu)建或者直接用字符串構(gòu)建出html內(nèi)容。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Security內(nèi)存中認(rèn)證的實(shí)現(xiàn)

    Spring Security內(nèi)存中認(rèn)證的實(shí)現(xiàn)

    本文主要介紹了Spring Security內(nèi)存中認(rèn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Java獲取此次請(qǐng)求URL以及服務(wù)器根路徑的方法

    Java獲取此次請(qǐng)求URL以及服務(wù)器根路徑的方法

    這篇文章主要介紹了Java獲取此次請(qǐng)求URL以及服務(wù)器根路徑的方法,需要的朋友可以參考下
    2015-08-08
  • Java ArrayList擴(kuò)容機(jī)制原理深入分析

    Java ArrayList擴(kuò)容機(jī)制原理深入分析

    在Java中,ArrayList是最常用的集合之一。它是一種容器,它的內(nèi)部定義了一個(gè)Object類型的數(shù)組elementData,因此可用于存儲(chǔ)任意類型的數(shù)據(jù)。我們知道,數(shù)組是長(zhǎng)度恒定的。而ArrayList相當(dāng)于是一個(gè)長(zhǎng)度可變的動(dòng)態(tài)數(shù)組,一起來看看的它的擴(kuò)容機(jī)制
    2023-02-02
  • Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)

    Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)

    這篇文章主要給大家介紹了關(guān)于Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)的相關(guān)資料,Java中的JUC(java.util.concurrent)包提供了一些并發(fā)編程中常用的類,這些類可以幫助我們更方便地實(shí)現(xiàn)多線程編程,需要的朋友可以參考下
    2024-02-02
  • Spring實(shí)現(xiàn)IoC的多種方式小結(jié)

    Spring實(shí)現(xiàn)IoC的多種方式小結(jié)

    本篇文章主要介紹了Spring實(shí)現(xiàn)IoC的多種方式小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • 理解maven命令package、install、deploy的聯(lián)系與區(qū)別

    理解maven命令package、install、deploy的聯(lián)系與區(qū)別

    這篇文章主要介紹了理解maven命令package、install、deploy的聯(lián)系與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • JAVA集合框架工具類自定義Collections集合方法

    JAVA集合框架工具類自定義Collections集合方法

    今天小編就為大家分享一篇關(guān)于JAVA集合框架工具類自定義Collections集合方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot生產(chǎn)環(huán)境打包如何去除無用依賴

    SpringBoot生產(chǎn)環(huán)境打包如何去除無用依賴

    這篇文章主要介紹了SpringBoot生產(chǎn)環(huán)境打包如何去除無用依賴問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 2020版IDEA整合GitHub的方法詳解

    2020版IDEA整合GitHub的方法詳解

    這篇文章主要介紹了2020版IDEA整合GitHub的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • add方法理解ArrayList的擴(kuò)容機(jī)制

    add方法理解ArrayList的擴(kuò)容機(jī)制

    這篇文章主要為大家介紹了add方法理解ArrayList的擴(kuò)容機(jī)制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論

大新县| 瓦房店市| 阿拉善左旗| 泌阳县| 全南县| 京山县| 洪江市| 修文县| 昂仁县| 健康| 安达市| 凤凰县| 江油市| 镶黄旗| 伊川县| 济南市| 海伦市| 乐东| 宜宾市| 九龙县| 安岳县| 肥西县| 临汾市| 南郑县| 新龙县| 天长市| 拜城县| 赫章县| 石台县| 勃利县| 施甸县| 张家港市| 石城县| 灯塔市| 油尖旺区| 台南市| 无为县| 开江县| 台北市| 扬中市| 蚌埠市|