zoukankan      html  css  js  c++  java
  • 邮件(一):Springboot+thymeleaf的发邮件部分

    1 邮件配置部分

    qq邮箱授权码获取

    java 邮件属性配置

    (1)写在代码中(任选其一,建议2)

    JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
    javaMailSender.setHost("smtp.qq.com");
    javaMailSender.setPort(25);
    javaMailSender.setUsername("1464245418@qq.com");
    javaMailSender.setPassword("yourAuthorizationCode");
    Properties properties = new Properties();
    properties.setProperty("mail.host", "smtp.qq.com");
    properties.setProperty("mail.transport.protocol", "smtp");
    properties.setProperty("mail.smtp.auth", "true");
    properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    properties.setProperty("mail.smtp.port", "25");
    properties.setProperty("mail.smtp.socketFactory.port", "25");
    
    javaMailSender.setJavaMailProperties(properties);
    

    (2)写在.properties文件中

    spring.mail.host=smtp.qq.com
    spring.mail.port=25
    spring.mail.username=1464245418@qq.com
    spring.mail.password=yourAuthorizationCode
    

    2 邮件简单发送

    主要使用JavaMail包,邮件内容使用thymeleaf

    <dependencies>
      <!--SpringBoot 起步依赖-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
      </dependency>
      <!--JavaMail-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
      </dependency>
      <!--thymeleaf模板-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
    </dependencies>
    

    发送邮件

    @Resource
    private TemplateEngine templateEngine;
    @Resource
    private JavaMailSenderImpl javaMailSender;
    
     /**
       * @description 仅发送简单邮件.
       * @author liuhongchen
     */  
    public void sendSimpleMail() {
      // 创建MIMEMessage对象
      MimeMessage message = javaMailSender.createMimeMessage();
      try {
          //true表示需要创建一个multipart message
          MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
          String nick;
          try {
            nick = MimeUtility.encodeText("测试邮件");
          } catch (UnsupportedEncodingException e) {
            MailService.log.error("邮件nickName有问题:" + e.getMessage());
            throw new ServiceException(MessageCode.SYSTEM_ERROR);
          }
    
          // 邮件发送信息(from,to,cc)
          helper.setFrom(new InternetAddress(nick + "<1464245418@qq.com>"));
          helper.setTo(new String[]{"1464245418@qq.com"});
          helper.setCc(new String[]{"1464245418@qq.com"});
          helper.setSubject("这是邮件的主题");
    
          // 注入邮件内容模板
          helper.setText("<h1>This is actual message</h1>", "text/html", true);
    
          try {
            javaMailSender.setPassword("记得填密码");
            javaMailSender.setUsername("1464245418@qq.com");
            javaMailSender.send(message);
            MailService.log.info("html邮件发送成功");
          } catch (Exception e) {
            MailService.log.error("邮件发送有问题:" + e.getMessage());
          }
    
        } catch (Exception e) {
          MailService.log.error("发送html邮件时发生异常!", e);
        }
    }
    

    3 邮件带附件、内嵌图片(使用thymeleaf)

    发送邮件代码

    /**
      * 发送带附件和内嵌图片的邮件.
      * 
      * @param templateName   thymeleaf模板名
      * @param mailAccount    邮箱账号密码
      * @param contextVars    邮件内容变量
      * @param inlineImgMap   内嵌图片Map
      * @param attachmentList 附件List
      * @return void
      * @author liuhongchen
      * @date 2020/8/21 10:36 上午
      */
    @Async
    public void sendSimpleMail(String templateName, Map<String, Object> contextVars,
        Map<String, String> inlineImgMap, Map<String, DataSource> attachmentList) {
      // 解决:放置附件名过长被截断,从而产生乱码问题
      System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
    
      MimeMessage message = javaMailSender.createMimeMessage();
    
      try {
        //true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
        String nick;
        try {
          nick = MimeUtility.encodeText("烛龙监控平台");
        } catch (UnsupportedEncodingException e) {
          MailService.log.error("邮件nickName有问题:" + e.getMessage());
          throw new ServiceException(MessageCode.SYSTEM_ERROR);
        }
    
        // 邮件发送信息(from,to,cc)
        helper.setFrom(new InternetAddress(nick + "<1464245418@qq.com>"));
        helper.setTo(new String[]{"1464245418@qq.com"});
        helper.setCc(new String[]{"1464245418@qq.com"});
        helper.setSubject("这是邮件的主题");
    
        // 注入邮件模板(注入变量和邮件模板内容)
        Context context = new Context();
        context.setVariables(contextVars);
        String emailContext = templateEngine.process(templateName, context);
        helper.setText(emailContext, true);
    
        // 附件
        if (attachmentList != null) {
          for (Entry<String, DataSource> fileEntry : attachmentList.entrySet()) {
            helper.addAttachment(fileEntry.getKey(), fileEntry.getValue());
          }
        }
        // 插入内嵌资源
        if (inlineImgMap != null) {
          for (Entry<String, String> imgEntry : inlineImgMap.entrySet()) {
            helper.addInline(imgEntry.getKey(), new File(imgEntry.getValue()));
          }
        }
    
        try {
          javaMailSender.setPassword("记得填密码");
          javaMailSender.setUsername("1464245418@qq.com");
          javaMailSender.send(message);
          MailService.log.info("html邮件发送成功");
        } catch (Exception e) {
          MailService.log.error("邮件发送有问题:" + e.getMessage());
        }
    
      } catch (Exception e) {
        MailService.log.error("发送html邮件时发生异常!", e);
      }
    }
    

    thymeleaf模板

    <!DOCTYPE html>
    <html lang="zh-Hans" xmlns:th="http://www.thymeleaf.org" xmlns="http://www.w3.org/1999/html">
    <head>
    <meta charset="UTF-8"/>
    </head>
    <body>
        <table th:if="${sendType eq 'preview'}">
              <tr>
                <td align="center"><img th:src="${previewAndroidTimeTop}" width="900"  /></td>
              </tr>
              <tr >
                <td align="center"><img th:src="${previewIosTimeTop}" width="900"  /></td>
              </tr>
            </table>
    </body>
    </html>
    
    1. 其中的变量sendType在contextVar中设置
    Map<String, Object> contextVars = new HashMap<>(16);
    contextVars.put("sendType", "preview");
    
    1. 图片可以直接放置图片链接,但是会出现一个问题,邮件会出于保护隐私不显示图片,此时需要手动点击”下载图片“,才会显示。
      使用cid的好处就是可以避免这一操作,但需要使用图片的绝对位置,后续需要删除该图片
    Map<String, String> inlineImgMap = new HashMap<>(16);
    inlineImgMap.put("androidTimeTop", "/Users/liuhongchen/code/androidTimeTop.png"));
    inlineImgMap.put("iosTimeTop", "/Users/liuhongchen/code/iosTimeTop.png"));
    
  • 相关阅读:
    localstorage实现带过期时间的缓存功能
    移动Web深度剖析
    对接口规范的一些思考
    css代码优化
    Web安全:你必须知道的“Cookie安全”
    androidstudio 常用快捷键
    通过oauth 认证 新浪微博 开发过程中遇到的问题
    【问题】R文件报错原因及解决办法 (转)
    为什么 SharedPreferences 可以直接 调用,前面却没有对象
    关于 android 开发中 debug不能顺利进行的各种问题的总结
  • 原文地址:https://www.cnblogs.com/hiluna/p/13534986.html
Copyright © 2011-2022 走看看