我使用library PHP作为IMAP连接。如何使用IMAP获取邮箱的完整大小?我尝试了以下代码,但它只返回收件箱目录的大小:
var_dump($imap->getMailboxStatistics());
字符串
sqyvllje1#
在IMAP中没有获得邮箱总大小的标准方法。RFC 3501不包括用于此的命令,并且也没有提供这样的功能的扩展。您的代码可能会发出类似FETCH 1:* (RFC822.SIZE)的命令并在本地求和。不幸的是,这是一种相当浪费的方法。
FETCH 1:* (RFC822.SIZE)
8i9zcol22#
被接受的答案在发布时是正确的,但现在不一定是正确的了。2018年发布的RFC 8438提供了STATUS=SIZE扩展,允许在STATUS命令中请求邮箱大小,例如更妙的是,如果服务器还支持LIST-EXTENDED和LIST-STATUS,您可以通过将其作为SIZE项请求,在LIST STATUS响应中获得它。如果不使用流水线,则可能涉及2n+1或3n+1 RTT的单次往返。不幸的是,很少有IMAP服务器支持此扩展;你可以打赌没有商业供应商会支持它。在这种情况下,您将不得不退回到FETCH 1:* (RFC822.SIZE)。除了浪费,这可能需要非常长的时间(想想10秒或更长时间)在大型邮箱(具有数万封邮件)。响应的绝对大小也可以很大:几个MB。如果您这样做,我还建议缓存这个值,如果可能的话,并使用STATUS响应来使该高速缓存无效。这样,如果邮箱没有更改,就不需要重新计算大小。您还可以进行进一步的优化(如增量FETCH),在此代码片段中讨论了在STATUS=SIZE不可用时计算远程IMAP文件夹的大小。
STATUS=SIZE
STATUS
LIST-EXTENDED
LIST-STATUS
SIZE
2n+1
3n+1
2条答案
按热度按时间sqyvllje1#
在IMAP中没有获得邮箱总大小的标准方法。RFC 3501不包括用于此的命令,并且也没有提供这样的功能的扩展。
您的代码可能会发出类似
FETCH 1:* (RFC822.SIZE)
的命令并在本地求和。不幸的是,这是一种相当浪费的方法。8i9zcol22#
被接受的答案在发布时是正确的,但现在不一定是正确的了。
2018年发布的RFC 8438提供了
STATUS=SIZE
扩展,允许在STATUS
命令中请求邮箱大小,例如更妙的是,如果服务器还支持
LIST-EXTENDED
和LIST-STATUS
,您可以通过将其作为SIZE
项请求,在LIST STATUS响应中获得它。如果不使用流水线,则可能涉及2n+1
或3n+1
RTT的单次往返。不幸的是,很少有IMAP服务器支持此扩展;你可以打赌没有商业供应商会支持它。在这种情况下,您将不得不退回到
FETCH 1:* (RFC822.SIZE)
。除了浪费,这可能需要非常长的时间(想想10秒或更长时间)在大型邮箱(具有数万封邮件)。响应的绝对大小也可以很大:几个MB。如果您这样做,我还建议缓存这个值,如果可能的话,并使用STATUS
响应来使该高速缓存无效。这样,如果邮箱没有更改,就不需要重新计算大小。您还可以进行进一步的优化(如增量FETCH),在此代码片段中讨论了在STATUS=SIZE
不可用时计算远程IMAP文件夹的大小。