欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

tips:

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

table是一個數(shù)組,類型為Node。Node是hashmap的一個內(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的依賴包就不做解釋了。

這里簡單介紹下velocity的作用:

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

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

具體用法在下面會進(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)以第三方形式登錄時用非密碼驗(yàn)證的一種手段。

在QQ郵箱->設(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ā)送的一個具體實(shí)現(xiàn)Bean。

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

這里說明3個方面。

1.javaMailSender.setPort(587) 這個端口不是隨意設(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)于建立起一個有效會話。

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)目啟動后就會開始發(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)容,可以后臺以對象的形式包裝起來,放入一個hashmap中,在velocity解析出來,至于如何解析,那就是velocity的語義的問題了。

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

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

過程以及代碼幾乎相同

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

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

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

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

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

給出一個簡單的樣例:

 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)容。

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

相關(guān)文章

  • 一文搞懂Java中的反射機(jī)制

    一文搞懂Java中的反射機(jī)制

    Java的反射機(jī)制是在運(yùn)行狀態(tài)中,對于任何一個類,都可以知道這個類的所有屬性和方法,對于任何一個對象,都可以調(diào)用它所有的方法和屬性,修改部分類型信息。本文就來詳細(xì)講講Java反射機(jī)制的使用
    2022-07-07
  • SpringBoot整合TKMyBatis實(shí)現(xiàn)單表增刪改查操作

    SpringBoot整合TKMyBatis實(shí)現(xiàn)單表增刪改查操作

    據(jù)說tk.mybatis能夠讓我不寫sql代碼就可以所有單表操作問題,作為熱愛偷懶的我,怎么能放過這種機(jī)會。talk is cheap, show me the code。趕緊搞個例子爽一把先
    2023-01-01
  • 手把手教你如何獲取微信用戶openid

    手把手教你如何獲取微信用戶openid

    眾所周知小程序的openid相當(dāng)重要,它是用戶的唯一標(biāo)識id,牽扯的支付,登錄,授權(quán)等,下面這篇文章主要給大家介紹了關(guān)于如何獲取微信用戶openid的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • SpringBoot+jsp項(xiàng)目啟動出現(xiàn)404的解決方法

    SpringBoot+jsp項(xiàng)目啟動出現(xiàn)404的解決方法

    這篇文章主要介紹了SpringBoot+jsp項(xiàng)目啟動出現(xiàn)404的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Spring Shell應(yīng)用程序開發(fā)流程解析

    Spring Shell應(yīng)用程序開發(fā)流程解析

    這篇文章主要介紹了Spring Shell應(yīng)用程序開發(fā)流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot3 Spring WebFlux簡介(推薦)

    SpringBoot3 Spring WebFlux簡介(推薦)

    SpringWebFlux是Spring Framework 5中引入的響應(yīng)式Web框架,用于支持非阻塞異步通信和響應(yīng)式流處理,與傳統(tǒng)的SpringMVC相比,WebFlux提供了完全異步非阻塞的編程模型,適用高并發(fā)、微服務(wù)架構(gòu)和實(shí)時數(shù)據(jù)流,本文介紹SpringBoot3 Spring WebFlux簡介,感興趣的朋友一起看看吧
    2024-10-10
  • java?webservice超時時間設(shè)置方法代碼

    java?webservice超時時間設(shè)置方法代碼

    當(dāng)我們使用WebService進(jìn)行調(diào)用時,有時會出現(xiàn)超時的情況,下面這篇文章主要給大家介紹了關(guān)于java?webservice超時時間設(shè)置方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • java多線程編程之使用runnable接口創(chuàng)建線程

    java多線程編程之使用runnable接口創(chuàng)建線程

    實(shí)現(xiàn)Runnable接口的類必須使用Thread類的實(shí)例才能創(chuàng)建線程,通過Runnable接口創(chuàng)建線程分為以下兩步
    2014-01-01
  • 如何將mybatis配置到springmvc中

    如何將mybatis配置到springmvc中

    為了更方便的連接數(shù)據(jù)庫,將mybatis配置到springMVC中。接下來通過本文給大家分享如何將mybatis配置到springmvc中,需要的朋友參考下吧
    2017-11-11
  • Java 集合的Contains和Remove方法

    Java 集合的Contains和Remove方法

    這篇文章主要介紹了Java 集合Contains和Remove方法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02

最新評論