spring boot定时任务接收邮件并且存储附件的方法讲解

 更新时间:2019年03月26日 11:46:45   作者:CLG_CSDN  
今天小编就为大家分享一篇关于spring boot定时任务接收邮件并且存储附件的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

在spring boot中写定时任务很简单,两个注解就可以实现。在启动类中加@EnableScheduling ,然后在你需要定时的方法上加上@Scheduled(cron="0 10 8 * * ?");括号内为cron表达式。如下图:

接收邮件及其判断是否有附件,并且存储附件。

public class TimerTaskServiceImpl implements TimerTaskService {
  @Autowired
  private ParseTxtServiceImpl parseTxtService;
  /**
   * 接收邮件 
   */
  @Override
  @Scheduled(cron="0 10 8 * * ?")
  public void timerTaskInfo(){
    //邮件配置信息
    String host=Constants.MAIL_HOST;
    String userName=Constants.MAIL_USER_NAME;
    String passWord=Constants.MAIL_PASS_WORD;
    //邮件配置类
    Properties properties=new Properties();
    //邮件配置缓存
    Session session=Session.getDefaultInstance(properties);
    session.setDebug(true);
    String fileName=null;
    try {
      //邮件服务器的类型
      Store store = session.getStore("pop3");
      //连接邮箱服务器
      store.connect(host,userName,passWord);
      // 获得用户的邮件帐户
      Folder folder=store.getFolder("INBOX");
      if (folder == null) {
        logger.info("获取邮箱文件信息为空");
      }
      // 设置对邮件帐户的访问权限可以读写
      folder.open(Folder.READ_WRITE);
      Calendar calendar=Calendar.getInstance();
      calendar.add(Calendar.DATE,-1);
      Date mondayDate = calendar.getTime();
      SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.GT, mondayDate);
      SearchTerm address=new SubjectTerm( "MU Report");
      SearchTerm comparisonAndTerm = new AndTerm(address, comparisonTermLe);
      Message[] messages = folder.search(comparisonAndTerm);
      for(int i = 0 ; i < messages.length ; i++){
        MimeMessage msg = (MimeMessage) messages[i];
        //判断是否有附件
        boolean isContainerAttachment = isContainAttachment(msg);
        if (isContainerAttachment) {
          //保存附件
          fileName=saveAttachment(msg,Constants.STORAGE_FILE);
          //保存接收到的邮件并且收件箱删除邮件
         msg.setFlag(Flags.Flag.DELETED, true);
        }
        if(!isContainerAttachment) {
          continue;
        }
      }
      folder.close(true);
      store.close();
      parseTxtService.readTxt(fileName);
    }catch (NoSuchProviderException e){
      loggerError.error("接收邮箱信息异常:{}",e);
    }catch (MessagingException e){
      loggerError.error("连接邮箱服务器信息异常:{}",e);
    }catch (IOException e){
      loggerError.error("接收邮箱信息解析异常:{}",e);
    }catch (IllegalStateException e){
      loggerError.error("接收邮箱信息为空:{}",e);
    }
  }
  /**
   * 判断邮件中是否包含附件
   * @return 邮件中存在附件返回true,不存在返回false
   * @throws MessagingException
   * @throws IOException
   */
  public static boolean isContainAttachment(Part part) throws MessagingException, IOException {
    boolean flag = false;
    if (part.isMimeType(Constants.MULTI_PART)) {
      MimeMultipart multipart = (MimeMultipart) part.getContent();
      int partCount = multipart.getCount();
      for (int i = 0; i < partCount; i++) {
        BodyPart bodyPart = multipart.getBodyPart(i);
        String disp = bodyPart.getDisposition();
        if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) ||
            disp.equalsIgnoreCase(Part.INLINE))) {
          flag = true;
        } else if (bodyPart.isMimeType(Constants.MULTI_PART)) {
          flag = isContainAttachment(bodyPart);
        } else {
          String contentType = bodyPart.getContentType();
          if (contentType.indexOf(Constants.APPLICATION_CONTEXT) != -1) {
            flag = true;
          }
          if (contentType.indexOf(Constants.NAME_CONTEXT) != -1) {
            flag = true;
          }
        }
        if (flag){
          break;
        }
      }
    } else if (part.isMimeType(Constants.MESSAGE_RFC)) {
      flag = isContainAttachment((Part)part.getContent());
    }
    return flag;
  }
  /**
   * 保存附件
   * @param part 邮件中多个组合体中的其中一个组合体
   * @param destDir 附件保存目录
   * @throws UnsupportedEncodingException
   * @throws MessagingException
   * @throws FileNotFoundException
   * @throws IOException
   */
  public String saveAttachment(Part part, String destDir) throws UnsupportedEncodingException,
      MessagingException, FileNotFoundException, IOException {
    String fileName=null;
    if (part.isMimeType(Constants.MULTI_PART)) {
      Multipart multipart = (Multipart) part.getContent();  //复杂体邮件
      //复杂体邮件包含多个邮件体
      int partCount = multipart.getCount();
      for (int i = 0; i < partCount; i++) {
        //获得复杂体邮件中其中一个邮件体
        BodyPart bodyPart = multipart.getBodyPart(i);
        //某一个邮件体也有可能是由多个邮件体组成的复杂体
        String disp = bodyPart.getDisposition();
        if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase
            (Part.INLINE))) {
          InputStream is = bodyPart.getInputStream();
          saveFile(is, destDir, decodeText(bodyPart.getFileName()));
          fileName=decodeText(bodyPart.getFileName());
        } else if (bodyPart.isMimeType(Constants.MULTI_PART)) {
          saveAttachment(bodyPart,destDir);
        } else {
          String contentType = bodyPart.getContentType();
          if (contentType.indexOf(Constants.NAME_CONTEXT) != -1 || contentType.indexOf
              (Constants.APPLICATION_CONTEXT) != -1) {
            saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName()));
            fileName=decodeText(bodyPart.getFileName());
          }
        }
      }
    } else if (part.isMimeType(Constants.MESSAGE_RFC)) {
      saveAttachment((Part) part.getContent(),destDir);
    }
    return fileName;
  }
  /**
   * 读取输入流中的数据保存至指定目录
   * @param is 输入流
   * @param fileName 文件名
   * @param destDir 文件存储目录
   * @throws FileNotFoundException
   * @throws IOException
   */
  private void saveFile(InputStream is, String destDir, String fileName)
      throws FileNotFoundException, IOException {
    BufferedInputStream bis = new BufferedInputStream(is);
    if(fileName.contains(Constants.TXT_SUFIXX)) {
      BufferedOutputStream bos = new BufferedOutputStream(
          new FileOutputStream(new File(destDir + fileName)));
      int len = -1;
      while ((len = bis.read()) != -1) {
        bos.write(len);
        bos.flush();
      }
      bos.close();
      bis.close();
    }
  }
}

其中查询邮件的条件,你可以自行更改。

接收邮件服务器的配置

可能出现的bug

说说用模板可能会碰到的bug。

怎么回事呢?代码写了,看了好几遍也没错,就是运行就报错,在网上看了别人的代码拿过来还是报错,报错如下:

这个错误大概意思就是我的模板的html中每个标签都要是闭标签,要这种类型的<a></a>,假如是<img xxx>这种标签就会报错。

如下所示,最坑的方法就是修改的,而且以后html的标签都要是一对一对的,坑啊、

后来有找了很多资料,原来发现是这里,themeleaf默认应该是2.xx版本,这个版本解析标签都要是一对一对的,到了3.xx之后,就不需要这么麻烦了!

都是版本问题

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java8中Lambda表达式的理解与应用

    Java8中Lambda表达式的理解与应用

    Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,下面这篇文章主要给大家介绍了关于Java8中Lambda表达式的相关资料,需要的朋友可以参考下
    2022-02-02
  • mybatis-plus返回map自动转驼峰配置操作

    mybatis-plus返回map自动转驼峰配置操作

    这篇文章主要介绍了mybatis-plus返回map自动转驼峰配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SpringCloud_Sleuth分布式链路请求跟踪的示例代码

    SpringCloud_Sleuth分布式链路请求跟踪的示例代码

    Spring Cloud Sleuth是一款针对Spring Cloud的分布式跟踪工具,本文通过实例代码介绍了SpringCloud_Sleuth分布式链路请求跟踪,感兴趣的朋友跟随小编一起看看吧
    2023-02-02
  • java文件操作练习代码 读取某个盘符下的文件

    java文件操作练习代码 读取某个盘符下的文件

    这篇文章主要介绍了java读取某个盘符下的文件示例,代码中要求的是绝对路径,编译过程中要注意绝对路径问题和异常的抓取
    2014-01-01
  • IDEA的崛起自己定义快捷生成代码块的详细步骤

    IDEA的崛起自己定义快捷生成代码块的详细步骤

    这篇文章主要介绍了IDEA的崛起自己定义快捷生成代码块的详细步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • springboot对象为null的属性在json中不显示的解决

    springboot对象为null的属性在json中不显示的解决

    这篇文章主要介绍了springboot对象为null的属性在json中不显示的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot 集成JUnit5的详细操作过程

    SpringBoot 集成JUnit5的详细操作过程

    JUnit5是最新的Java单元测试框架,提供了灵活的测试支持,它由JUnit Platform、JUnit Jupiter和JUnit Vintage组成,支持不同环境下的测试运行,SpringBoot从2.2版本开始默认支持JUnit5,本文介绍了SpringBoot 集成JUnit5的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • Java实现京东联盟API数据获取功能

    Java实现京东联盟API数据获取功能

    这篇文章介绍了Java获取京东联盟API数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Intellij IDEA创建web项目的超详细步骤记录

    Intellij IDEA创建web项目的超详细步骤记录

    如果刚开始接触IDEA,或者之前使用的是eclipse/myEclipse的话,即使是创建一个JAVA WEB项目,估计也让很多人费了好几个小时,下面这篇文章主要给大家介绍了关于Intellij IDEA创建web项目的超详细步骤,需要的朋友可以参考下
    2022-08-08
  • Java SSM框架如何添加写日志功能

    Java SSM框架如何添加写日志功能

    这篇文章主要介绍了Java SSM框架如何添加写日志功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论