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

时间:2010-03-15 11:14:05

标签: java imap javamail

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

我理解这些项目通过IMAP协议(通过设计或错误)作为邮件公开,但我只想处理正确的邮件。有没有办法做到这一点?到目前为止,我已经驳回了以下方法:

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

我正在寻找的是到目前为止我已经错过的一些IMAP api电话或者那些行中的东西......

1 个答案:

答案 0 :(得分:2)

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


  • 使用FETCH命令检索项目的Content-Type标头。仅当Tasklist或Calendar项的Content-Type标头字段与普通电子邮件使用的字段不同时,此方法才有效。另一个问题是,已知某些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

“...... data ...”的内容是Content-type标题:

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

  • 如果无法确定该项是否为日历项,则消息的Content-Type标头因为它是常见类型(如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.

(为了更好的可读性,添加了许多空格)


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