IMAP 规范的 IMAP IDLE 扩展(在 RFC 2177 中定义) 允许 IMAP 服务器在新邮件到达时和在用户邮箱中进行其他更新时通知邮件客户端。IMAP IDLE 功能具有以下优点:
邮件客户端不必向 IMAP 服务器轮询外来邮件。
取消客户端轮询可减少 IMAP 服务器上的工作负荷并提高服务器性能。当用户没有收到任何邮件或只收到很少的邮件时,客户端轮询非常浪费资源;客户端将继续按配置的时间间隔进行轮询,通常为每 5 或 10 分钟轮询一次。
邮件客户端向用户显示新邮件的时间与实际到达用户邮箱的时间非常接近。它还会以近乎实时的方式显示邮件的状态变化。
IMAP 服务器不必等待下一封 IMAP 轮询邮件,即可向客户端通知新邮件或更新邮件。只要有新的邮件到达或邮件状态发生更改,IMAP 服务器就会立即收到通知。服务器随后通过 IMAP 协议通知客户端。
IMAP IDLE 功能依赖于事件通知服务 (Event Notification Service, ENS) 来传播通知。要使用 IMAP IDLE,您必须配置以下 ENS 组件:
至少一个主机上的 enpd 服务器
所有消息存储主机上的 IBiff 通知插件
有关为 Messaging Server 配置 ENS 的信息,请参见Sun Java System Communications Services Event Notification Service Guide。
有关配置 IBiff 通知插件的信息,请参见B.1 在 Messaging Server 中装入 ENS Publisher。
将 enpd 服务器配置为仅接受来自运行消息存储的主机的连接。
要限制到消息存储主机的连接,请设置 ENS_ACCESS 环境变量。该环境变量设置允许访问 enpd 的权限列表。语法如下:
setenv ENS_ACCESS 'allowdeny ipaddress|mask; allowdeny ipaddress|mask; ...' |
其中
可以为 + (指定允许)或 — (指定拒绝)
指定点分十进制 IP 地址
指定点分十进制 IP 地址掩码
示例:
以下示例仅允许访问本地主机:
setenv ENS_ACCESS '+127.0.0.1|255.255.255.255' |
以下示例允许访问本地主机和所有 IP 地址 192.168.0.* ,但 192.168.0.17 除外:
setenv ENS_ACCESS '+192.168.0.1|255.255.255.0;+127.0.0.1|255.255.255.255; \ -192.168.0.17;255.255.255.255' |
运行 configutil 实用程序,以指定运行 ENS 服务器的主机的名称。
cd msg-svr-base ./configutil -o local.store.notifyplugin.enshost -v "ipaddress" |
其中,ipaddress 指定了 ENS 主机的点分十进制 IP 地址。
示例:
cd msg-svr-base ./configutil -o local.store.notifyplugin.enshost -v "127.0.0.1" |
指定用于通知的事件密钥。
如果将 ENS 事件密钥 (ensEventKey) 设置为默认值,则 IMAP IDLE 无法运行。
您必须将 ensEventKey 值配置为以 %M 结尾。字符串 %M 是替换代码,它将被替换为发生事件的邮箱的名称。
运行以下 configutil 命令:
./configutil -o local.store.notifyplugin.enseventkey -v "eventkey" |
其中,eventkey 是 ENS 使用的唯一标识符。其默认值为 enp://127.0.0.1/store。事件密钥的主机名部分不用于确定运行 ENS 的主机;它只是标识符的一部分。
示例:
./configutil -o local.store.notifyplugin.enseventkey -v "enp://127.0.0.1/store/%M" |
加载 libibiff 通知插件文件,它将启用 Messaging Server 的 ENS Publisher。
运行以下 configutil 命令:
./configutil -o local.store.notifyplugin -v "msg-svr-base/lib/libibiff" |
允许从所有用户邮箱发送通知,而不仅仅是收件箱。
默认情况下,仅收件箱中发生的事件生成通知。但是,IMAP IDLE RFC (2177) 规定当任何邮箱中发生事件时 IDLE 都必须通知客户端。
为了满足 RFC 的要求,IMAP IDLE 功能要求为所有邮箱启用通知。如果不启用通知,IMAP 服务器将无法公布 IDLE 功能。
要为所有邮箱配置通知,请将 configutil 命令 noneinbox 的值设置为 1:
./configutil -o local.store.notifyplugin.noneinbox.enable -v 1 |
其中,-v 1 启用来自所有邮箱的通知。
停止 Messaging Server,然后重新启动。
cd msg-svr-base/sbin ./stop-msg ./start-msg |
验证 IMAP 服务现在是否包含 IDLE 功能。使用 telnet 连接到 IMAP 主机和端口。
telnet IMAP_hostname port |
示例:
telnet myhost imap trying 192.18.01.44 ... connected to myhost.siroe.com * OK [CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS CHILDREN BINARY UNSELECT SORT LANGUAGE STARTTLS IDLE XSENDER X-NETSCAPE XSERVERINFO X-SUN-SORT X-SUN-IMAP X-ANNOTATEMORE AUTH=PLAIN] myhost.siroe.com IMAP4 service (Sun Java(tm) System Messaging Server 6.3-0.05 (built Feb 7 2006)) |