溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

發(fā)布時(shí)間:2021-08-07 11:57:09 來(lái)源:億速云 閱讀:122 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

在spring boot中寫定時(shí)任務(wù)很簡(jiǎn)單,兩個(gè)注解就可以實(shí)現(xiàn)。在啟動(dòng)類中加@EnableScheduling ,然后在你需要定時(shí)的方法上加上@Scheduled(cron="0 10 8 * * ?");括號(hào)內(nèi)為cron表達(dá)式。如下圖:

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

接收郵件及其判斷是否有附件,并且存儲(chǔ)附件。

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 {
      //郵件服務(wù)器的類型
      Store store = session.getStore("pop3");
      //連接郵箱服務(wù)器
      store.connect(host,userName,passWord);
      // 獲得用戶的郵件帳戶
      Folder folder=store.getFolder("INBOX");
      if (folder == null) {
        logger.info("獲取郵箱文件信息為空");
      }
      // 設(shè)置對(duì)郵件帳戶的訪問(wèn)權(quán)限可以讀寫
      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("連接郵箱服務(wù)器信息異常:{}",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 郵件中多個(gè)組合體中的其中一個(gè)組合體
   * @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();  //復(fù)雜體郵件
      //復(fù)雜體郵件包含多個(gè)郵件體
      int partCount = multipart.getCount();
      for (int i = 0; i < partCount; i++) {
        //獲得復(fù)雜體郵件中其中一個(gè)郵件體
        BodyPart bodyPart = multipart.getBodyPart(i);
        //某一個(gè)郵件體也有可能是由多個(gè)郵件體組成的復(fù)雜體
        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;
  }
  /**
   * 讀取輸入流中的數(shù)據(jù)保存至指定目錄
   * @param is 輸入流
   * @param fileName 文件名
   * @param destDir 文件存儲(chǔ)目錄
   * @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();
    }
  }
}

其中查詢郵件的條件,你可以自行更改。

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

接收郵件服務(wù)器的配置

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

可能出現(xiàn)的bug

說(shuō)說(shuō)用模板可能會(huì)碰到的bug。

怎么回事呢?代碼寫了,看了好幾遍也沒錯(cuò),就是運(yùn)行就報(bào)錯(cuò),在網(wǎng)上看了別人的代碼拿過(guò)來(lái)還是報(bào)錯(cuò),報(bào)錯(cuò)如下:

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

這個(gè)錯(cuò)誤大概意思就是我的模板的html中每個(gè)標(biāo)簽都要是閉標(biāo)簽,要這種類型的<a></a>,假如是<img xxx>這種標(biāo)簽就會(huì)報(bào)錯(cuò)。

如下所示,最坑的方法就是修改的,而且以后html的標(biāo)簽都要是一對(duì)一對(duì)的,坑啊、

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

后來(lái)有找了很多資料,原來(lái)發(fā)現(xiàn)是這里,themeleaf默認(rèn)應(yīng)該是2.xx版本,這個(gè)版本解析標(biāo)簽都要是一對(duì)一對(duì)的,到了3.xx之后,就不需要這么麻煩了!

spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件

都是版本問(wèn)題

以上是“spring boot如何定時(shí)任務(wù)接收郵件并且存儲(chǔ)附件”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

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

AI