整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Java秒殺系統實戰系列-開發通用的發送郵件服務

          Java秒殺系統實戰系列-開發通用的發送郵件服務

          文是“Java秒殺系統實戰系列文章”的第九篇,在這篇文章中我們將繼續完善秒殺系統中的核心處理邏輯,即“用戶秒殺~搶單”的業務邏輯!本文我們將基于JavaMail服務,開發一個通用的發送郵件服務,用于發送郵件通知消息,并與上一篇章中已經實現的RabbitMQ異步發送消息的邏輯進行整合,徹底實現“用戶秒殺成功后,異步發送郵件通知消息給到用戶郵箱,告知用戶盡快進行付款”的功能!

          對于發送郵件服務,相信各位小伙伴并不陌生,本文我們將開發一個通用的發送郵件服務,用于“用戶秒殺成功之后異步發送郵件消息給到用戶”。

          (1)同樣的道理,首先我們需要加入發送郵件服務的依賴,其依賴的版本號跟SpringBoot的版本號一致,為1.5.7.RELEASE,如下所示:

          <!--mail-->
          <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-mail</artifactId>
           <version>${spring-boot.version}</version>
          </dependency>
          

          緊接著,我們需要在application.properties配置文件中加入“發送郵件服務”所需要的額外的支持配置信息:

          #發送郵件配置
          spring.mail.host=smtp.qq.com
          spring.mail.username=1974544863@qq.com
          spring.mail.password=cmtvsjvhonkjdaje
          spring.mail.properties.mail.smtp.auth=true
          spring.mail.properties.mail.smtp.starttls.enable=true
          spring.mail.properties.mail.smtp.starttls.required=true
          mail.send.from=1974544863@qq.com
          mail.kill.item.success.subject=商品搶購成功
          mail.kill.item.success.content=您好,您已成功搶購到商品: <strong style="color: red">%s</strong> ,復制該鏈接并在瀏覽器采用新的頁面打開,即可查看搶購詳情:${system.domain.url}/kill/record/detail/%s,并請您在1個小時內完成訂單的支付,超時將失效該訂單哦!祝你生活愉快!
          

          在本秒殺系統中,發送郵件的服務我們是采用 QQ郵箱 作為主郵箱賬號,相應的SMTP服務器也是采用QQ郵箱的!其中,spring.mail.password 指的是在QQ郵箱后臺開通POP3/SMTP服務時騰訊官方給的“密鑰”(授權碼),在這里,Debug就貢獻了上面那個密鑰~授權碼 給各位使用了,而真正在企業生產環境中,其實是需要去申請一個主郵箱賬號的,至于如何申請,在這里就不贅述了!

          (2)接下來,我們就可以大顯伸手一番了!我們在MailService中開發了兩種發送郵件的功能,一種發送簡單文本的功能(即純文字的、很死板、高冷風的那種),另一種是發送帶HTML標簽的花哨文本的功能(即帶樣式的、比較俏皮的、有溫度的那種),如下所示:

          //通用的發送郵件服務
          @Service
          @EnableAsync
          public class MailService {
           private static final Logger log=LoggerFactory.getLogger(MailService.class);
           @Autowired
           private JavaMailSender mailSender;
           @Autowired
           private Environment env;
           //發送簡單文本文件
           @Async
           publicvoid sendSimpleEmail(final MailDto dto){
           try {
           SimpleMailMessage message=new SimpleMailMessage();
           message.setFrom(env.getProperty("mail.send.from"));
           message.setTo(dto.getTos());
           message.setSubject(dto.getSubject());
           message.setText(dto.getContent());
           mailSender.send(message);
           log.info("發送簡單文本文件-發送成功!");
           }catch (Exception e){
           log.error("發送簡單文本文件-發生異常: ",e.fillInStackTrace());
           }
           }
           //發送花哨郵件
           @Async
           public void sendHTMLMail(final MailDto dto){
           try {
           MimeMessage message=mailSender.createMimeMessage();
           MimeMessageHelper messageHelper=newMimeMessageHelper(message,true,"utf-8");
           messageHelper.setFrom(env.getProperty("mail.send.from"));
           messageHelper.setTo(dto.getTos());
           messageHelper.setSubject(dto.getSubject());
           messageHelper.setText(dto.getContent(),true);
           mailSender.send(message);
           log.info("發送花哨郵件-發送成功!");
           }catch (Exception e){
           log.error("發送花哨郵件-發生異常: ",e.fillInStackTrace());
           }
           }
          }
          

          其中,MailDto類主要統一封裝了在發送郵件時所需要的字段信息,比如接收人、郵件標題、郵件內容等等(提現了面向對象的重要特性)!其源代碼如下所示:

          /**統一封裝了在發送郵件時所需要的字段信息
           *@Author:debug (SteadyJack)
           *@Date:2019/6/22 10:11
           **/
          @Data
          @ToString
          @AllArgsConstructor
          @NoArgsConstructor
          public class MailDto implements Serializable{
           //郵件主題
           private String subject;
           //郵件內容
           private String content;
           //接收人
           private String[] tos;
          }
          

          (3)最后是在“RabbitMQ通用的消息接收服務類” RabbitReceiverService 的接收消息邏輯中整合進“發送郵件服務”的邏輯,如下所示:

          @Autowired
          private MailService mailService;
          @Autowired
          private Environment env;
          /**
           * 秒殺異步郵件通知-接收消息
           */
          @RabbitListener(queues={"${mq.kill.item.success.email.queue}"},containerFactory="singleListenerContainer")
          public void consumeEmailMsg(KillSuccessUserInfoinfo){
           try {
           log.info("秒殺異步郵件通知-接收消息:{}",info);
           //TODO:真正的發送郵件....
           //簡單文本
           //MailDto dto=newMailDto(env.getProperty("mail.kill.item.success.subject"),"這是測試內容",new String[]{info.getEmail()});
           //mailService.sendSimpleEmail(dto);
           //花哨文本
           finalString content=String.format(env.getProperty("mail.kill.item.success.content"),info.getItemName(),info.getCode());
           MailDto dto=newMailDto(env.getProperty("mail.kill.item.success.subject"),content,newString[]{info.getEmail()});
           mailService.sendHTMLMail(dto);
           }catch(Exception e){
           log.error("秒殺異步郵件通知-接收消息-發生異常:",e.fillInStackTrace());
           }
          }
          

          (4)至此,關于通用的發送郵件服務的代碼實戰,我們就介紹到這里了,接下來我們進入測試環節。點擊“搶購”,如果用戶秒殺成功,系統后端會在數據庫錄入一筆秒殺成功后的訂單,同時user表中“郵箱字段值”對應的郵箱會受到一封郵件,如下圖所示:

          好了,歡樂的擼碼時光總是短暫的,本篇文章我們就介紹到這里了!下篇文章我們將繼續我們的“秒殺系統實戰”之旅!

          **

          * 發送郵件

          * @param protocol:郵件傳輸協議,可空

          * @param host:郵件服務器

          * @param port:端口,可空

          * @param auth:是否驗證身份

          * @param username:用戶

          * @param password:密碼

          * @param enableSsl:是否啟用設置SSL加密

          * @param fromEmailAddress:發件人

          * @param toEmailAddress:收件人

          * @param ccEmailAddress:抄送人,可空

          * @param bccEmailAddress:密送人,可空

          * @param subject:郵件主題

          * @param content:郵件內容

          * @param contentType:內容格式,可空,HTML格式:text/html

          * @param containAttachment:是否包含附件

          * @param attachmentPath:附件路徑,可空

          * @return

          */

          public static Map<String, String> sendEmail(String protocol, String host,

          String port, boolean auth, final String username,

          final String password, boolean enableSsl, String fromEmailAddress,

          String[] toEmailAddress, String[] ccEmailAddress,

          String[] bccEmailAddress, String subject, String content,

          String contentType, boolean containAttachment, String attachmentPath) {

          Map<String, String> result=new HashMap<String, String>();

          String returnCode="1"; //返回結果,0異常,1成功

          String returnMsg=""; //返回消息

          try {

          // 創建屬性對象

          Properties properties=new Properties();

          // 設置郵件傳輸采用的協議

          if(null !=protocol && !"".equals(protocol)){

          properties.setProperty("mail.transport.protocol", protocol);

          }

          在實際項目中,經常需要用到郵件通知功能。比如,用戶通過郵件注冊,通過郵件找回密碼等;又比如通過郵件發送系統情況,通過郵件發送報表信息等等,實際應用場景很多。這篇文章,就教大家通過springboot快速的實現一個發送郵件的功能。

          引入依賴

          在springboot項目中,引入如下依賴:

          <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-mail</artifactId>
          </dependency>
          

          配置文件

          在springboot項目中引入依賴之后,即可在其配置文件中配置郵箱的參數:

          application.properties

          不同的郵箱,host的配置不一樣。如果是其它郵箱,搜索下即可找到。

          username為郵箱賬號,password為郵箱的授權碼(不是密碼,需要在郵箱的設置頁面中開啟smtp)。

          注入JavaMailSender實例

          郵箱參數配置完之后,即可直接注入JavaMailSender實例。

          @Autowired
          private JavaMailSender javaMailSender;
          

          發送普通郵件

          普通郵件,沒有樣式。實現起來最容易:

          @Test
          public void testSend() throws MessagingException {
           SimpleMailMessage message=new SimpleMailMessage();
           message.setFrom("發送者郵箱地址");
           message.setTo("接受者郵箱地址");
           message.setSubject("這是標題");
           message.setText("這是內容");
           javaMailSender.send(message);
          }
          

          From需要和配置文件中的username一致,否則會報錯。

          To為郵件接收者;

          Subject為郵件的標題;

          Text為郵件的內容。

          運行方法,即可收到郵件:

          發送HTML郵件

          很多時候,我們需要郵件帶有美觀的樣式。這時候,可以使用HTML的樣式。我們需要使用javaMailSender的createMimeMessage方法,構建一個MimeMessage,然后使用MimeMessage實例創建出MimeMessageHelper。如下:

          @Test
          public void testSend() throws MessagingException {
           MimeMessage mimeMessage=javaMailSender.createMimeMessage();
           MimeMessageHelper messageHelper=new MimeMessageHelper(mimeMessage);
           messageHelper.setSubject("標題");
           messageHelper.setFrom("發送者郵箱地址");
           messageHelper.setTo("接受者郵箱地址");
           messageHelper.setText("<h1>標題</h1><br/><p>這是內容</p>", true);
           javaMailSender.send(messageHelper.getMimeMessage());
          }
          

          這里需要注意的是,setText的時候需要傳一個布爾值進去,表名需要使用HTML樣式。

          運行方法查看結果:

          可以看到,h1的樣式已經出來了。

          總結

          本文講解了如何在springboot中快速的發郵件。介紹了兩種發送郵件的方式:1、普通模式;2、HTML模式。其實還支持多種豐富的模式,比如模板引擎等,這里就不講解了,其實使用起來大同小異。


          主站蜘蛛池模板: 日韩aⅴ人妻无码一区二区| 亚洲国产国产综合一区首页| 在线视频一区二区三区三区不卡| 日韩人妻精品无码一区二区三区 | 亚洲午夜精品一区二区| 免费无码一区二区三区| 亲子乱av一区二区三区| 激情综合一区二区三区| 卡通动漫中文字幕第一区| 国产伦精品一区二区三区免费迷 | 久久精品一区二区免费看| 国产精品综合一区二区三区| 麻豆国产一区二区在线观看| 又硬又粗又大一区二区三区视频 | 国产免费播放一区二区| 国产传媒一区二区三区呀| 成人精品视频一区二区三区| 亚洲AV无码一区二区三区网址| 午夜DV内射一区区| 中文无码精品一区二区三区| 色一乱一伦一区一直爽| 少妇无码一区二区二三区| 久久精品国产一区二区三区日韩| 国产精品视频一区二区噜噜| 日韩一区二区在线观看视频| 中文字幕日韩丝袜一区| 亚洲国产成人久久一区WWW | 国产婷婷色一区二区三区深爱网| 伊人无码精品久久一区二区| 免费无码一区二区三区蜜桃大| 国产精品亚洲一区二区三区 | 在线视频一区二区| 国产在线一区二区杨幂| 农村人乱弄一区二区| 91视频一区二区| 国产高清一区二区三区四区| 日韩精品一区二区三区色欲AV| 国产一区二区三区韩国女主播| 成人精品一区二区三区电影| 国产一区麻豆剧传媒果冻精品 | 91福利视频一区|