如果您在使用 imap_mail_copy 和 imap_mail_move 时遇到问题,请检查您是否已安装 imap_devel(imap 开发库)以及 imap(imap 守护程序)。如果没有,PHP 似乎已正确配置 --with-imap,但某些功能无法正常工作。
我花了大约 12 个小时才弄明白这一点!!
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_mail_copy — 将指定邮件复制到邮箱
将由 message_nums
指定的邮件复制到指定邮箱。
imap
一个 IMAP\Connection 实例。
message_nums
message_nums
是一个范围,不仅仅是邮件编号(如 » RFC2060 中所述)。
mailbox
邮箱名称,有关详细信息,请参见 imap_open()
将不受信任的数据传递给此参数是不安全的,除非 imap.enable_insecure_rsh 被禁用。
flags
flags
是一个或多个的位掩码
CP_UID
- 序列号包含 UID
CP_MOVE
- 复制后从当前邮箱中删除邮件。如果设置此标志,该函数的行为与 imap_mail_move() 相同。
版本 | 描述 |
---|---|
8.1.0 | 现在 imap 参数需要一个 IMAP\Connection 实例;以前,需要一个有效的 imap 资源。 |
如果您在使用 imap_mail_copy 和 imap_mail_move 时遇到问题,请检查您是否已安装 imap_devel(imap 开发库)以及 imap(imap 守护程序)。如果没有,PHP 似乎已正确配置 --with-imap,但某些功能无法正常工作。
我花了大约 12 个小时才弄明白这一点!!
经过一番折腾,imap_mail_copy 对我来说确实有效。如果您遇到问题,您可能想检查一下新邮箱的名称。确保它只是一个文件夹名称,例如 INBOX.haha,没有服务器部分。
如果您使用此函数并收到以下通知
Notice: Unknown: IMAP protocol error: Could not parse command (errflg=2) in Unknown on line 0
Notice: Unknown: Could not parse command (errflg=2) in Unknown on line 0
您应该检查函数参数。此通知出现(根据我在互联网上找到的信息以及我的问题)是在它收到无效的 $msglist 时。因此请确保给出正确的数字(作为字符串!)
"$msg_num"、$msg_num 或 (string) $msg_num。
在调用函数时不要使用 '$msg_num',这将逐字发送字符串 $msg_num。
您可以给出像 "1,3,5,7,8" 这样的字符串,这将完美地工作以移动给定的邮件。
我把所有的邮件编号都放在一个数组中($messageSet),并使用了
<?php
$messageSetImpl = implode ( "," , $messageSet );
imap_mail_copy( $imapStream, $messageSetImpl, $mailBox )
?>
我没想到的是我的 $messageSet 有时是空的,那是当我收到通知的时候。因此,您可能想通过首先放置以下内容来检查这一点
<?php
if ( !( empty( $messageSet ) ) ) {
$messageSetImpl = implode ( "," , $messageSet );
imap_mail_copy( $imapStream, $messageSetImpl, $mailBox )
}
?>
这应该可以工作。
当我们想要复制多封邮件时,可以在 msg_num 前面写 '(string)'。比如..
$msg_num = "1,2,3,4,5,6,7";
$copy = imap_mail_copy($imap_stream, (string) $msg_num, '[Gmail]/Important', CP_UID);
imap_ mail_ move 和 imap_mail_copy 在 MS Exchange 上无法使用序列号。imap_ uid 与 CP_UID 结合使用可以正常工作。