现在的位置: 首页 > 综合 > 正文

javamail读发邮件

2017年08月23日 ⁄ 综合 ⁄ 共 9179字 ⁄ 字号 评论关闭

一、基本概念:

  SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,它定义了发送电子邮件的机制。在
JavaMail API 环境中,基于 JavaMail 的程序将和您的公司或因特网服务供应商的(Internet Service
Provider's,ISP's)SMTP 服务器通信。SMTP 服务器可将消息中转至接收方 SMTP 服务器,以便最终让用户经由 POP 或
IMAP 获得。这不是要求 SMTP 服务器成为开放的中继,尽管 SMTP
服务器支持身份验证,不过还是得确保它的配置正确。像配置服务器来中继消息或添加删除邮件账号这类任务的实现,JavaMail API 中并不支持。

  POP(Post Office Protocol),即邮局协议。目前用的是版本3,所以人们通常将它称为 POP3,RFC 1939
定义了这个协议。POP
和SMTP一样,也是一种机制,Internet上大多数人通过它得到邮件。该协议规定每个用户只能有一个邮箱的支持。这就是它所能做的,而这也造成了许
多混淆。使用 POP 时,用户熟悉的许多性能并不是由 POP 协议支持的,如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或
Microsoft Outlook 之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。所以当使用
JavaMail API 时,如果读者想要这类信息,就只能由自己来计算了。

  IMAP(Internet Message Access
Protocol),即Internet消息访问协议,是更高级的用于接收消息的协议,在 RFC 2060
中有它的定义。目前使用的IMAP版本为4,人们习惯将它称为 IMAP4。在用到 IMAP 时,邮件服务器必需支持这个协议。不能仅仅把使用
POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假设邮件服务器支持 IMAP,基于 JavaMail
的程序可以利用这种情况--用户在服务器上可以有多个文件夹(folder),并且这些文件夹可以被多个用户共享。

  因为有这一更高级的性能,您也许会认为所有用户都会使用
IMAP。事实并不是这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每个用户的多个文件夹中维护消息。这样虽然能将消息集中备份,但随
着用户长期的邮件夹越来越大,到磁盘空间耗尽时,每个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。

  MIME(Multipurpose Internet Mail
Extensions),即多用途Internet邮件扩展标准。它不是邮件传输协议,而是对传输内容的消息、附件及其它的内容定义了格式。这里有很多不
同的RFC(Requirement of Comment)文档:RFC 822、RFC 2045、RFC 2046 和 RFC
2047。作为一个 JavaMail API 的用户,您通常不必对这些格式操心。无论如何,一定存在这些格式而且程序会用到它。

 

三、如何实现消息的删除

    消息的删除涉及到与消息相关的 Flags(标志)。不同 flag 表示不同的状态,有些标志由系统定义,而有些则由用户自己定义。下面列出在内部类 Flags.Flag 中预定义的标志:

  ·Flags.Flag.ANSWERED

  ·Flags.Flag.DELETED

  ·Flags.Flag.DRAFT

  ·Flags.Flag.FLAGGED

  ·Flags.Flag.RECENT

  ·Flags.Flag.SEEN

  ·Flags.Flag.USER

  上述这些标志只是标准定义,并不意味着所有邮件服务器或供应商都支持所有这些标志。例如,除了删除消息标志外,POP
协议不再支持其它任何标志。检查是否存在新邮件,这不是个 POP 任务,而是内建于邮件客户机的任务。为找出哪些标志能被支持,可以用
getPermanentFlags() 向 folder 提出请求。

  要删除消息,您可以设置消息的 DELETED flag:

  message.setFlag(Flags.Flag.DELETED, true);

  首先,请以 READ_WRITE 模式打开 folder:

  folder.open(Folder.READ_WRITE);

  然后,当所有消息的处理完成后,关闭 folder,并传递一个 true 值,从而擦除(expunge)有 delete 标志的消息。

  folder.close(true);

  一个 Folder 的 expunge() 方法可以用来删除消息。但 Sun 的 POP3
供应商不支持。其它供应商有的或许能够实现这一功能,而有的则不能。IMAP 供应商极有可能实现此功能。因为 POP 只支持单个对邮箱的访问,对
Sun 的供应商来说,您必需关闭 folder 以删除消息。

  要取消标志,只要传递 false 给 setFlag() 方法就行了。想知道是否设置过标志,可以用 isSet() 检查。

抱歉!评论已关闭.