该函数使用消息编号(而不是 uid!)。
$uid = $mail->uid;
$msgno = $mail->msgno;
如果您想使用 uid,只需使用选项值
imap_delete($mbox, $uid, FT_UID);
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_delete — 标记当前邮箱中要删除的消息
标记 message_nums
中列出的消息以供删除。标记为删除的消息将保留在邮箱中,直到 imap_expunge() 被调用,或者 imap_close() 被调用,其可选参数为 CL_EXPUNGE
。
imap
一个 IMAP\Connection 实例。
message_nums
一个 string,表示以 IMAP4 样式序列格式 ("n"
, "n:m"
, 或以逗号分隔的这些组合) 表示的一个或多个消息。
flags
您可以设置 FT_UID
,它告诉函数将 message_nums
参数视为 UID
。
始终返回 true
。
如果 flags
无效,则抛出 ValueError。
版本 | 描述 |
---|---|
8.1.0 | imap 参数现在需要一个 IMAP\Connection 实例;之前需要一个有效的 imap 资源。 |
8.0.0 | 现在在无效的 flags 参数值上抛出一个 ValueError。之前会发出警告,函数返回 false 。 |
范例 #1 imap_delete() 范例
<?php
$mbox = imap_open("{imap.example.org}INBOX", "username", "password")
or die("Can't connect: " . imap_last_error());
$check = imap_mailboxmsginfo($mbox);
echo "Messages before delete: " . $check->Nmsgs . "<br />\n";
imap_delete($mbox, 1);
$check = imap_mailboxmsginfo($mbox);
echo "Messages after delete: " . $check->Nmsgs . "<br />\n";
imap_expunge($mbox);
$check = imap_mailboxmsginfo($mbox);
echo "Messages after expunge: " . $check->Nmsgs . "<br />\n";
imap_close($mbox);
?>
注意:
IMAP 邮箱可能不会在连接之间保存其消息标志,因此 imap_expunge() 应该在同一个连接期间调用,以确保标记为删除的消息实际被清除。
该函数使用消息编号(而不是 uid!)。
$uid = $mail->uid;
$msgno = $mail->msgno;
如果您想使用 uid,只需使用选项值
imap_delete($mbox, $uid, FT_UID);
此函数似乎在 "[Gmail]/所有邮件" 邮箱中不起作用。这是因为 Gmail 只保留邮件的单一副本,而邮箱不再是标签。
从邮箱中删除邮件只会移除该标签(除了 "所有邮件" 邮箱)。
要从 "所有邮件" 中删除邮件,您必须使用 imap_mail_move() 函数并将邮件移动到 "[Gmail]/垃圾箱" 邮箱。
注意:Gmail 中邮箱的名称取决于您使用的语言。例如:在西班牙语中,"所有邮件" 是 "Todos","垃圾箱" 是 "Papelera"。
// 这不是完整的代码,但足以清空整个邮箱。
// 希望这能节省您的时间 :-)
<?php
if (isset($_REQUEST['DoNow']))
{
# 拉取其他文件
include_once ("common.php");
$conn = @imap_open("\{$server/$serverType}Trash", $user, $pass)
or die("Connection to folder failed");
$headers = @imap_check($conn);
($headers->Nmsgs > 0) or die("Trash is empty already !");
// 删除邮件
@imap_delete($conn,'1:*'); // 清空整个邮箱。
@imap_expunge($conn);
echo "Trash is empty.";
imap_close($conn);
}
else
{
echo "<form name='formA' action='".$_SERVER['PATH_INFO']."' method='POST'>"; ?>
您确定要清空垃圾箱吗?
<p>
<input type="submit" value="继续" name="DoNow">
<input type="button" value="取消" name="Cancel" onClick='javascript:self.history.go(-1)'></form></p>
<?php
} ?>
为了让所有使用此功能的人都知道:如果将电子邮件标记为从邮箱中删除,则该标记不会持久保存。您需要调用 imap_expunge() 或使用 imap_close() 中的 CL_EXPUNGE 选项来删除您在同一个 PHP 脚本中标记的电子邮件。
希望这对某些人有帮助。
我无法在将它与 pop3 一起使用时使 imap_delete 工作。相反,我写了
<?php
function pop3_dele($connection,$message)
{
$status = imap_setflag_full($connection, '1:'.$message, '\\Deleted');
imap_expunge($connection);
return $status;
//return(imap_delete($connection,trim($message)));
}
?>
经过一番实验,我发现如何将单个邮件标记为删除...
<?php
$msgid = '5'; //例如
imap_delete($mbox, "$msgid:$msgid");
?>
imap_delete() 似乎需要一个范围,因此要选择一个,只需从您的 ID 到您的 ID 即可。
希望这有帮助。
不知何故,每当我尝试使用 imap_header 返回的消息编号删除电子邮件时,任何消息编号低于 999 的电子邮件都会失败。
我发现 imap_header 会在消息编号前添加空格。您需要在调用 imap_delete 之前修剪该编号。
我正在使用 qmail,我花了超过一个月的时间才弄清楚。
希望这对某个在外面遇到相同问题的不幸灵魂有所帮助。
我在使用此函数删除电子邮件时遇到了一些重大问题。使用 IIS 5.0 和基于 Windows 的邮件服务器,我无法单独删除电子邮件。
我的脚本只需要检查电子邮件并更新数据库以进行退回,之后我只需要删除所有电子邮件。
如果 imap_delete($mbox,$email->MsgNo) 无法正常工作,您可以尝试使用
imap_delete($mbox,'1:*');
清除整个邮箱。
希望这有帮助,因为它让我发疯了大约 5 个小时。:)
如果您想从 Gmail 帐户中删除所有早于特定年份的电子邮件,此方法将起作用
<?php
error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));
echo "解析 ini 文件...\n";
$ini = parse_ini_file('g.ini');
$user = $ini['user'];
$pass = $ini['pass'];
$year = $ini['year'];
echo "帐户 {$user} - 删除早于 {$year} 的消息\n\n";
echo "连接...\n";
$imap = imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}[Gmail]/All Mail", $user, $pass) or die("无法连接: " . imap_last_error() . "\n");
echo "检查当前邮箱...\n";
$mbox = imap_check($imap);
echo "获取概述...\n";
$flaggedForDelete = 0;
for($n = 0; $n < $mbox->Nmsgs; $n++) {
echo "处理 {$n} 项,共 {$mbox->Nmsgs} 项...\r";
$hdr = imap_fetchheader($imap, $n);
preg_match('/^Date: (.*?)$/m', $hdr, $matches);
$date = date_parse(strtotime($matches[1]));
if($date['year'] < $year) {
imap_delete($imap, $msg->msgno);
$flaggedForDelete++;
}
}
echo "清空邮箱(已标记 {$flaggedForDelete} 条消息)... ";
echo ((imap_expunge($imap)) ? "成功" : "失败!")."\n";
imap_close($imap);
?>