溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-09-14 01:01:56 來源:腳本之家 閱讀:273 作者:qianweifeng123 欄目:編程語言

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

具體案例以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 中定義的對象和變量上。

作為郵件模板也是它的一個主要應用場景。

具體用法在下面會進行說明。

2.具體案例

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

application.properties

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

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

這相當于是當以第三方形式登錄時用非密碼驗證的一種手段。

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

同時需要把POP3/SMTP服務開啟。

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

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ā)送的一個具體實現(xiàn)Bean。

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

這里說明3個方面。

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

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

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

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

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;
  }
}

使用方式:

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

項目啟動后就會開始發(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);
}

<h4>1.UV</h4>
<TABLE border="1px" >
  <TR>
    <td nowrap="nowarp"  class="date">日期</td>
    <td nowrap="nowarp"  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>
...

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

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

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

過程以及代碼幾乎相同

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

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

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

推薦驗證方式為直接用戶名+密碼,或者用ssl方式進行驗證。

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

給出一個簡單的樣例:

 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的實例。配置方法見上。

3.總結(jié)

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI