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

Spring boot搭建郵件服務的完整步驟

 更新時間:2019年09月12日 17:10:37   作者:祥哥去哪里啊  
這篇文章主要給大家介紹了關于Spring boot搭建郵件服務的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言:

發(fā)送郵件,肯定是每個公司都會有的基本業(yè)務。很多公司都會選擇把發(fā)送郵件作為一個基礎服務,對外提供接口。直接調(diào)用就可發(fā)郵件了。但是我們都知道發(fā)送郵件耗時都比較長。那么今天就介紹下使用Spring boot+eventbus來打造一個簡單郵件服務

規(guī)劃接口列表

發(fā)送郵件的類型準備的有三種

  • 發(fā)送普通郵件
  • 發(fā)送html郵件
  • 發(fā)送圖文郵件

還有一個細節(jié),如果我們同步的取發(fā)送郵件會有兩個問題。

  • 接口響應時間比較長
  • 遇到并發(fā)的情況,容易導致服務器壓力過大或者郵箱服務封ip

所以我們準備使用隊列來執(zhí)行發(fā)送郵件的操作??梢越鉀Q這個問題。隊列我選用的是Google的eventbus。是一款很輕量的隊列。直接走的內(nèi)存

準備工作

首先要在pom.xml中引入 需要使用的包

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-mail</artifactId>
 </dependency>
 <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>23.0</version>
  </dependency>
  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
  </dependency>
  • spring-boot-starter-mail :spring-boot提供的發(fā)郵件的maven庫
  • guava:google提供的開源庫。里面包含來很多工具
  • lombok:可以幫你省去編寫實體類的工具

引入之后,我們還需要配置發(fā)送郵件所需要的必要配置

在application.properties中配置郵箱

spring.mail.host=smtp.mail.me.com //郵箱發(fā)送服務器
spring.mail.port=587//服務器端口
spring.mail.username=xxx6666@icloud.com//發(fā)件人郵箱
spring.mail.password=password//客戶端專用密碼
//如果和我一樣使用的icloud郵箱 還需要下列兩個配置,別的有的郵箱不需要
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

做到這里其實就已經(jīng)完成了,發(fā)郵件所需要的配置了。但是我們是要用隊列來發(fā)送,所以還需要配置下隊列

@Configuration
public class AsyncEventBusConfig {
 //實例化bean,采用單例形式注入容器
 @Bean
 @Scope("singleton")
 public AsyncEventBus asyncEventBus(){
  //創(chuàng)建線程池對象
  final ThreadPoolExecutor executor=executor();
  return new AsyncEventBus(executor);
 }
 //創(chuàng)建線程池方法
 private ThreadPoolExecutor executor(){
  return new
    ThreadPoolExecutor(2,
    2,0L,
    TimeUnit.MICROSECONDS,
    new LinkedBlockingQueue<>());
 }
}

封裝EmailService

準備好了之后,就可以直接來封裝發(fā)送郵件的業(yè)務了。之前有提到我們需要三個接口,同樣的,我們也需要三個service方法

@Service
public class EmailService {

 @Autowired
 private JavaMailSender javaMailSender;

 /**
  * 發(fā)件人。這里發(fā)件人一般是同使用的發(fā)件郵箱一致
  */
 @Value("${spring.mail.username}")
 private String from;


 /**
  * 發(fā)送文本郵件
  * @param to 收件人郵箱地址
  * @param subject 主題
  * @param content 內(nèi)容
  */
 public void sendTextMail(String to,
        String subject,
        String content) {
  SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
  simpleMailMessage.setTo(to);
  simpleMailMessage.setSubject(subject);
  simpleMailMessage.setText(content);
  simpleMailMessage.setFrom(from);
  javaMailSender.send(simpleMailMessage);
 }


 /**
  * 發(fā)送html內(nèi)容的郵件
  * @param to 收件人
  * @param htmlContent html內(nèi)容
  * @param subject 主題
  * @throws MessagingException
  */
 public void sendHtmlMail(String to,
        String htmlContent,
        String subject) throws MessagingException {
  MimeMessage message = javaMailSender.createMimeMessage();
  MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
  messageHelper.setTo(to);
  messageHelper.setSubject(subject);
  messageHelper.setFrom(from);
  messageHelper.setText(htmlContent, true);
  javaMailSender.send(message);
 }

 /**
  * 發(fā)送圖文郵件
  * @param to 收件人
  * @param imgContent 圖文內(nèi)容
  * @param subject 主題
  * @param rscId 資源id
  * @param imgPath 資源路徑
  * @throws MessagingException
  */
 public void sendImgMail(String to,
       String imgContent,
       String subject,
       String rscId,
       String imgPath) throws MessagingException {
  MimeMessage message = javaMailSender.createMimeMessage();
  MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
  messageHelper.setTo(to);
  messageHelper.setSubject(subject);
  messageHelper.setFrom(from);
  messageHelper.setText(imgContent, true);
  messageHelper.addInline(rscId, new File(imgPath));
  javaMailSender.send(message);
 }
}

隊列監(jiān)聽

既然封裝好了方法,那么就需要調(diào)用。調(diào)用的方式,其實就是將接口傳來的數(shù)據(jù)傳到隊列里。隊列的消費者接收到了消息就將消息拿來調(diào)用發(fā)送郵件的方法

我們首先創(chuàng)建一個消費類,用來接受消息,處理消息。

@Service
public class EventBusListener {

 /**
  * 引入bean
  */
 @Autowired
 private AsyncEventBus asyncEventBus;

 @Autowired
 private EmailService emailService;

 /**
  * 注冊服務類
  */
 @PostConstruct
 public void init(){
  asyncEventBus.register(this);
 }

 /**
  * 線程安全,消費 文本消息
  * @param textEmailDTO
  */
 @AllowConcurrentEvents
 @Subscribe
 public void sendTextMail(TextEmailDTO textEmailDTO){
  emailService.sendTextMail(
    textEmailDTO.getTo(),
    textEmailDTO.getSubject(),
    textEmailDTO.getContent()
  );
 }

 /**
  * 線程安全 消費 html消息
  * @param htmlEmailDTO
  */
 @AllowConcurrentEvents
 @Subscribe
 public void sendHtmlMail(HtmlEmailDTO htmlEmailDTO){
  try {
   emailService.sendHtmlMail(
     htmlEmailDTO.getTo(),
     htmlEmailDTO.getHtmlContent(),
     htmlEmailDTO.getSubject()
   );
  } catch (MessagingException e) {
   // nothing to do
  }
 }

 /**
  * 線程安全 消費 圖文消息
  * @param imgEmailDTO
  */
 @AllowConcurrentEvents
 @Subscribe
 public void sendImgMail(ImgEmailDTO imgEmailDTO){
  try {
   emailService.sendImgMail(
     imgEmailDTO.getTo(),
     imgEmailDTO.getImgContent(),
     imgEmailDTO.getSubject(),
     imgEmailDTO.getRscId(),
     imgEmailDTO.getImgPath()
   );
  } catch (MessagingException e) {
   // nothing to do
  }
 }
}

其實eventbus拋消息都是使用的post方法來拋消息。走到不同的方法里面是利用了類的多態(tài),拋入不同的實體類就可以進行區(qū)分了。走進了不同的方法,就調(diào)用相應Service方法。

控制器與測試

控制器部分,沒什么好說的,我就貼出圖文的代碼。其余代碼可以在我的github上面看

先看眼實體類

@Data
public class ImgEmailDTO implements Serializable {
 public ImgEmailDTO() {
 }

 /**
  * 圖片路徑
  */
 private String imgPath;

 /**
  * 資源id
  */
 private String rscId;

 /**
  * 主題
  */
 private String subject;

 /**
  * 圖片正文(同樣可以使用html)
  */
 private String imgContent;

 /**
  * 收件人
  */
 private String to;
}
 /**
  * 發(fā)送圖文郵件
  * @param request
  * @return
  */
 @RequestMapping(value = "/sendImgMail", method = RequestMethod.POST)
 public Result<Integer> sendImgMail(@RequestBody Request<ImgEmailDTO> request) {
  Result<Integer> result = Result.create();
  ImgEmailDTO imgEmailDTO=request.getData();
  StringBuilder sb=new StringBuilder();
  sb.append(imgEmailDTO.getImgContent());
  //cid:資源id。在spring中會自動綁定
  sb.append("<img src=\'cid:").append(imgEmailDTO.getRscId()).append("\'></img>");
  imgEmailDTO.setImgContent(sb.toString());
  asyncEventBus.post(imgEmailDTO);
  return result.success(1);
 }

圖文要稍微特殊一點,需要拼接下正文內(nèi)容。然后將實體類中的content替換。最后將實體類拋入隊列。直接返回接口請求。隊列那邊就會排著隊搞定所有的郵件

下面來做個測試

請求很迅速的返回了結果

然后去郵箱中查看結果

好了今天對郵件服務的介紹就寫到這里。知識點并不深奧,主要介紹一個思路。如有不對的地方,請大神指出。謝謝

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • Java多線程中Lock鎖的使用總結

    Java多線程中Lock鎖的使用總結

    這篇文章主要介紹了Java多線程中Lock鎖的使用總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Spring中BeanUtils.copyProperties的坑及解決

    Spring中BeanUtils.copyProperties的坑及解決

    這篇文章主要介紹了Spring中BeanUtils.copyProperties的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java二分法查找_動力節(jié)點Java學院整理

    Java二分法查找_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java二分法查找的相關資料,需要的朋友可以參考下
    2017-04-04
  • 淺談Java 并發(fā)的底層實現(xiàn)

    淺談Java 并發(fā)的底層實現(xiàn)

    這篇文章主要介紹了淺談Java 并發(fā)的底層實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java實現(xiàn)小型圖書館管理系統(tǒng)

    Java實現(xiàn)小型圖書館管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)小型圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • MyBatis-Plus如何使用枚舉自動關聯(lián)注入詳解

    MyBatis-Plus如何使用枚舉自動關聯(lián)注入詳解

    這篇文章主要給大家介紹了關于MyBatis-Plus如何使用枚舉自動關聯(lián)注入的相關資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用MyBatis-Plus具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • springboot讀取.properties配置文件中的map和list類型配置參數(shù)方式

    springboot讀取.properties配置文件中的map和list類型配置參數(shù)方式

    這篇文章主要介紹了springboot讀取.properties配置文件中的map和list類型配置參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • mybatis-plus插入失敗的問題及解決

    mybatis-plus插入失敗的問題及解決

    這篇文章主要介紹了mybatis-plus插入失敗的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java日常練習題,每天進步一點點(51)

    Java日常練習題,每天進步一點點(51)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • SpringBoot中JPA實現(xiàn)Sort排序的三種方式小結

    SpringBoot中JPA實現(xiàn)Sort排序的三種方式小結

    這篇文章主要介紹了SpringBoot中JPA實現(xiàn)Sort排序的三種方式小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

昌邑市| 黑龙江省| 宁国市| 鄯善县| 泽普县| 静安区| 西乌珠穆沁旗| 常宁市| 京山县| 临泉县| 阜城县| 辽源市| 甘肃省| 合江县| 鹤壁市| 手机| 云浮市| 宁海县| 鄂伦春自治旗| 张北县| 罗山县| 手机| 内乡县| 宁河县| 株洲市| 久治县| 钟祥市| 海淀区| 谷城县| 申扎县| 那坡县| 广饶县| 长武县| 紫云| 凤阳县| 汉川市| 合作市| 罗田县| 稻城县| 合水县| 平湖市|