有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检测IMAPMessage不是电子邮件,而是任务或日历项

我通过IMAP使用javamail访问Lotus和Groupwise,递归地访问所有文件夹并处理我找到的电子邮件。但是在像Tasklist和Calendar这样的文件夹中(这些文件夹来自Groupwise,但我记得Lotus也有类似的东西),我将项目作为IMAPMessage的实例放在那里,因此它们就像邮件一样被处理

我知道这些项目通过IMAP协议被公开为邮件(无论是设计还是错误),但我只想处理正确的邮件。有办法做到这一点吗?到目前为止,我已经摒弃了以下方法:

  • 确保邮件具有邮件id,至少在Groupwise日历项目中具有该id
  • 按名称忽略文件夹(如日历和任务列表):不完全正确,因为用户可以在这些文件夹中移动邮件

我正在寻找的是一些到目前为止我错过的IMAP api调用,或者这些行中的某些东西


共 (1) 个答案

  1. # 1 楼答案

    我不熟悉javamail,但我熟悉IMAP协议(RFC 3501),我会尝试以下方法:


    • 使用FETCH命令检索项目的内容类型标题。仅当任务列表或日历项的内容类型标题字段与普通电子邮件使用的字段不同时,此选项才有效。另一个问题是,已知某些IMAP服务器不支持检索单个标题字段(但在本例中,您可能仍然能够使用BODY.PEEK[header])检索包含所有字段的所有完整标题

    IMAP命令示例:

    TAG0001 FETCH 1 BODY.PEEK[HEADER.FIELDS (CONTENT-TYPE)]
    

    IMAP服务器响应示例:

    * 1 FETCH (BODY[HEADER.FIELDS (CONTENT-TYPE)] {69}...data..})
    TAG0001 OK Success
    

    “…数据…”的内容是内容类型标题:

    Content-Type: text/calendar;
     name="meeting.ics";
     method=REQUEST
    

    • 如果无法确定该项是否为日历项,因为它是一种常见类型(如multipart/something),因此无法确定消息的内容类型标题,请使用FETCH命令检索消息结构,并在MIME树中搜索具有适当内容类型的任何日历项

    IMAP命令示例:

    TAG0002 FETCH 2 (BODY)
    

    IMAP服务器响应示例:

    * 1 FETCH (
      BODY
      (
        (
          ("text" "plain" ("charset" "iso-8859-2") NIL NIL "quoted-printable" 194 1)
          ("text" "html" ("charset" "iso-8859-2") NIL NIL "quoted-printable" 1173 1)
          ("text" "calendar"
            ("name" "meeting.ics" "charset" "windows-1252" "method" "REQUEST") NIL NIL "8bit" 1531 1)
            "alternative"
          )
          "mixed"
        )
      )
    TAG0002 OK FETCH completed.
    

    (添加大量空白以提高可读性)


    查看RFC3501的6.4.57.4.2部分,了解有关FETCH命令及其响应格式的更多信息。不幸的是,我不知道如何使用javamail实现这一点