以下代码设置IMAP标记,并将已删除或未删除的电子邮件移动到各自的文件夹中。不是问题,而是我的好奇心是,当我清除删除标志(\\已删除,实际上是\已删除)时,我收到以下通知“注意:未知:IMAP协议错误:无法解析命令(errflg = 2)在第0行的“未知”中。然而,一切似乎工作得很好,电子邮件删除标志被清除,电子邮件被移回收件箱,实际上没有任何意外发生。
我已经在网上和StackOverflow上寻找答案,但我没有找到答案我的问题。从imap_mail_copy()
下的PHP文档中,通知是引用,并且注释说确保$ message_num传递一个字符串(例如。"$msg_num"
,$msg_num
或(string) $msg_num
)。没有什么能解决我的特殊好奇心,因为正如我所说,代码仍能完美地完成工作。
作为一个附带问题,我通过ajax和jquery发布到这个脚本,在javascript中,当我传递标志时我必须逃避“\”\如此删除:flag: "\\Deleted"
但是当我通过\时看见我传递如下:flag: "\Seen"
逃脱在这里不是必须的。为什么呢?
<?php
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/../constants.php';
$setFlags = [
'\Seen' => true,
'\Answered' => true,
'\Flagged' => true,
'\Deleted' => true,
'\Draft' => true
];
$resetFlags = [
'\\\\Seen' => true,
'\\\\Answered' => true,
'\\\\Flagged' => true,
'\\\\Deleted' => true,
'\\\\Draft' => true
];
$folder = $_POST['folder'];
$flag = $_POST['flag'];
$uid = $_POST['uid'];
$action = isset($_POST['action'])? strtoupper($_POST['action']): '';
if(($imap = imap_open(IMAPSEQUENCE.$folder, IMAPUSER, IMAPPASS)) == false){
echo 'failed to open email server';
exit();
}
if($action == 'SET' && $setFlags[$flag]){
echo imap_setflag_full($imap, $uid, $flag, ST_UID);
if($flag == '\Deleted'){
imap_mail_move($imap, "$uid:$uid", '[Gmail]/Trash', CP_UID);
}
imap_close($imap);
exit();
} elseif($action == 'RESET' && $resetFlags[$flag]){
echo imap_clearflag_full($imap, $uid, $flag, ST_UID);
if($flag == '\\\\Deleted'){
echo imap_mail_move($imap, "$uid:$uid", 'INBOX', CP_UID);
}
imap_close($imap);
exit();
}
echo '<strong style="color: red;">Email action failed';
imap_close($imap);
exit();
?>