imap_delete

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_delete标记当前邮箱中要删除的消息

描述

imap_delete(IMAP\Connection $imap, string $message_nums, int $flags = 0): true

标记 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() 应该在同一个连接期间调用,以确保标记为删除的消息实际被清除。

参见

添加备注

用户贡献的备注 10 备注

7
erational
11 年前
该函数使用消息编号(而不是 uid!)。
$uid = $mail->uid;
$msgno = $mail->msgno;

如果您想使用 uid,只需使用选项值
imap_delete($mbox, $uid, FT_UID);
4
rueda dot raul at gmail dot com
10 年前
此函数似乎在 "[Gmail]/所有邮件" 邮箱中不起作用。这是因为 Gmail 只保留邮件的单一副本,而邮箱不再是标签。
从邮箱中删除邮件只会移除该标签(除了 "所有邮件" 邮箱)。
要从 "所有邮件" 中删除邮件,您必须使用 imap_mail_move() 函数并将邮件移动到 "[Gmail]/垃圾箱" 邮箱。

注意:Gmail 中邮箱的名称取决于您使用的语言。例如:在西班牙语中,"所有邮件" 是 "Todos","垃圾箱" 是 "Papelera"。
1
jacky at jackyhome dot myvnc dot com
20 年前
// 这不是完整的代码,但足以清空整个邮箱。
// 希望这能节省您的时间 :-)

<?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">&nbsp;
<input type="button" value="取消" name="Cancel" onClick='javascript:self.history.go(-1)'></form></p>
<?php
} ?>
1
Daniel Dafoe
8 年前
为了让所有使用此功能的人都知道:如果将电子邮件标记为从邮箱中删除,则该标记不会持久保存。您需要调用 imap_expunge() 或使用 imap_close() 中的 CL_EXPUNGE 选项来删除您在同一个 PHP 脚本中标记的电子邮件。

希望这对某些人有帮助。
0
Olle
11 年前
我无法在将它与 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)));
}
?>
0
chris at financialservicesonline dot com dot au
15 年前
经过一番实验,我发现如何将单个邮件标记为删除...

<?php

$msgid
= '5'; //例如

imap_delete($mbox, "$msgid:$msgid");

?>

imap_delete() 似乎需要一个范围,因此要选择一个,只需从您的 ID 到您的 ID 即可。

希望这有帮助。
0
iwantsimplelife at lycos dot com
15 年前
不知何故,每当我尝试使用 imap_header 返回的消息编号删除电子邮件时,任何消息编号低于 999 的电子邮件都会失败。

我发现 imap_header 会在消息编号前添加空格。您需要在调用 imap_delete 之前修剪该编号。

我正在使用 qmail,我花了超过一个月的时间才弄清楚。

希望这对某个在外面遇到相同问题的不幸灵魂有所帮助。
0
James G
21 年前
我在使用此函数删除电子邮件时遇到了一些重大问题。使用 IIS 5.0 和基于 Windows 的邮件服务器,我无法单独删除电子邮件。

我的脚本只需要检查电子邮件并更新数据库以进行退回,之后我只需要删除所有电子邮件。

如果 imap_delete($mbox,$email->MsgNo) 无法正常工作,您可以尝试使用

imap_delete($mbox,'1:*');

清除整个邮箱。

希望这有帮助,因为它让我发疯了大约 5 个小时。:)
-1
thisemailaddress at gmail dot com
14 年前
如果您想从 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);

?>
-3
Alex
15 年前
我认为如果您要删除单个电子邮件,则不必向 imap_delete() 提供范围。

此方法效果很好

<?php

imap_delete
($conn,trim($msgno));

?>
To Top