我注意到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' );
答案 0 :(得分:2)
您可以尝试在移动功能中使用“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);
答案 1 :(得分:1)
IMAP基本规范具有2个不同的ID-唯一ID(UID)和序列号(seqnum)。
除非UIDVALIDITY发生更改,否则UID永远不会更改,并且这不会在会话中发生。相反,seqnum标识邮件在文件夹中的顺序位置; 1是第一条消息,2是第二条消息,依此类推。因此,移动/删除一条消息会使所有最近的消息的序列号都更新。
通过UID移动可能是最安全的方法,但是从最高序列号移动到最低序列号也应该可以。
答案 2 :(得分:0)
每次调用imap_mail_move都会更改基础消息号
imap_mail_move($mbox, $msgno, '[Gmail]/Trash');
解决方案
imap_mail_move($mbox, '1,2', '[Gmail]/Trash');
imap_close($connection, CL_EXPUNGE);