На самом деле ... Причина, по которой электронные письма были оставлены во входящей почте, заключалась в том, что когда imap_mail_move делал это, идентификаторы всех оставшихся сообщений уменьшались на единицу, поэтому, когда цикл foreach перемещался к следующему сообщению, одно сообщение был оставлен позади. Этот пропуск сообщения повторяется для каждой итерации. Вот почему казалось, что imap_mail_move не работает.
Решение состоит в том, чтобы использовать уникальные идентификаторы сообщений вместо потенциально повторяющихся идентификаторов:
$inbox = imap_open( $host, $user, $pass );
$emails = imap_search( $inbox, 'ALL', SE_UID );
if( $emails ) {
foreach( $emails as $email_uid ) {
imap_mail_move($inbox, $email_uid, 'processed', CP_UID);
}
}