imap_mail_move复制电子邮件

问题描述 投票:1回答:3

我用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' );
php email imap gmail-imap
3个回答
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
投票

IMAP基本规范有2个不同的ID - 唯一ID(UID)和序列号(seqnum)。

除非UIDVALIDITY发生变化,否则UID永远不会改变,这不是会话期间发生的事情。相反,seqnum标识文件夹中消息的序号位置; 1是第一个消息,2是第2个,等等。结果,移动/删除消息导致所有更新的消息更新其seqnum。

通过UID移动可能是最安全的方法,但从最高seqnum到最低seqnum也应该没问题。


0
投票

每次调用imap_mail_move时,它都会更改基础消息号

imap_mail_move($mbox, $msgno, '[Gmail]/Trash');

imap_mail_move($mbox, '1,2', '[Gmail]/Trash');   
imap_close($connection, CL_EXPUNGE);
© www.soinside.com 2019 - 2024. All rights reserved.