我用PHP imap_mail_move
函数注意到一种奇怪的行为。假设收件箱文件夹中有两封邮件,我想将它移到另一个不同的文件夹中,我遇到了一些麻烦(至少在gmail中)。
如果我正在使用
imap_mail_move( $imap_connection, 1, 'ARCHIVE' );
imap_mail_move( $imap_connection, 2, 'ARCHIVE' );
消息1标记从INBOX
更改为IMAP/ARCHIVE
消息2标签从INBOX
变为IMAP/ARCHIVE
INBOX
(两者)而不仅仅是IMAP/ARCHIVE
我不确定为什么会这样。为什么第二次没有按预期工作。
注意:如果我使用此代码,它可以正常工作。
imap_mail_move( $imap_connection, 2, 'ARCHIVE' );
imap_mail_move( $imap_connection, 1, 'ARCHIVE' );
要么
imap_mail_move( $imap_connection, 1, 'ARCHIVE' );
$imap_connection = imap_open( $mailbox, $connection_details['username'], $connection_details['password'] );
imap_mail_move( $imap_connection, 2, 'ARCHIVE' );
你可以尝试在移动功能而不是消息号码中使用“UID”吗?对我来说,这项工作符合预期。
$connection = imap_open($mailConnectionLine, $mailUser, $mailPassword);
// get emails
$emailsInbox = imap_search($connection, 'ALL', SE_UID);
foreach ($emailsInbox as $emailUID) {
// Move
$movingResult = imap_mail_move($connection, $emailUID, $destinationFolder, CP_UID);
}
imap_close($connection, CL_EXPUNGE);
IMAP基本规范有2个不同的ID - 唯一ID(UID)和序列号(seqnum)。
除非UIDVALIDITY发生变化,否则UID永远不会改变,这不是会话期间发生的事情。相反,seqnum标识文件夹中消息的序号位置; 1是第一个消息,2是第2个,等等。结果,移动/删除消息导致所有更新的消息更新其seqnum。
通过UID移动可能是最安全的方法,但从最高seqnum到最低seqnum也应该没问题。
每次调用imap_mail_move时,它都会更改基础消息号
imap_mail_move($mbox, $msgno, '[Gmail]/Trash');
解
imap_mail_move($mbox, '1,2', '[Gmail]/Trash');
imap_close($connection, CL_EXPUNGE);