PHP 8.3.4 Released!

imap_delete

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

imap_deleteMarque le fichier pour l'effacement, dans la boîte aux lettres courante

Description

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

Marque les messages message_nums pour l'effacement. L'effacement réel n'interviendra que lors de l'appel de la fonction imap_expunge() ou de imap_close() avec le paramètre optionnel CL_EXPUNGE.

Liste de paramètres

imap

Une instance de IMAP\Connection.

message_nums

Une chaîne de caractères représentant un ou plusieurs messages dans un style de format d'une séquence IMAP4 ("n", "n:m", ou une combinaison de ceci, délimité par des virgules).

flags

Vous pouvez le définir à FT_UID qui demande à la fonction de traiter l'argument message_nums comme un UID.

Valeurs de retour

Retourne toujours true.

Erreurs / Exceptions

Lance une exception ValueError si le paramètre flags est invalide.

Historique

Version Description
8.1.0 La paramètre imap attend désormais une instance de IMAP\Connection ; auparavant, une ressource imap était attendue.
8.0.0 Une exception ValueError est désormais lancée pour des valeurs de paramètre flags invalides. Auparavant, un avertissement était émis et la fonction retournait false.

Exemples

Exemple #1 Exemple avec imap_delete()

<?php

$mbox
= imap_open("{imap.example.org}INBOX", "username", "password")
or die(
"Connexion impossible : " . imap_last_error());

$check = imap_mailboxmsginfo($mbox);
echo
"Nombre de messages avant effacement : " . $check->Nmsgs . "<br />\n";

imap_delete($mbox, 1);

$check = imap_mailboxmsginfo($mbox);
echo
"Nombre de messages après effacement : " . $check->Nmsgs . "<br />\n";

imap_expunge($mbox);

$check = imap_mailboxmsginfo($mbox);
echo
"Nombre de messages après imap_expunge : " . $check->Nmsgs . "<br />\n";

imap_close($mbox);
?>

Notes

Note:

Les boîtes aux lettres IMAP n'ont pas les flags de leurs messages de sauvegardés entre les connexions, aussi la fonction imap_expunge() doit être appelée pendant la même connexion pour que les messages marquées pour effacement soient réellement purgés.

Voir aussi

add a note

User Contributed Notes 10 notes

up
7
erational
10 years ago
the function is using the message number (and not the uid !)
$uid = $mail->uid;
$msgno = $mail->msgno;

if you want to use the uid, simply option value
imap_delete($mbox, $uid, FT_UID);
up
4
rueda dot raul at gmail dot com
10 years ago
This function seems not to work on "[Gmail]/All Mail" mailbox. This is because Gmails keeps only one copy of the message and mailboxes are no more than labels.
Deleting a message from a mailbox only removes that label (except for "All Mail" mailbox).
To delete from "All Mail" you have to use imap_mail_move() function and move the message to "[Gmail]/Trash" mailbox.

Note: Names of mailboxes in Gmail depends on the language you're using. E.g.: in Spanish "All Mail" is "Todos" and "Trash" is "Papelera".
up
1
jacky at jackyhome dot myvnc dot com
20 years ago
// is not a complete code but enough to clear out an entire mailbox.
// hope this can save your time :-)

<?php

if (isset($_REQUEST['DoNow']))
{
# PULL ADDITIONAL FILES
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 !");

// delete email(s)
@imap_delete($conn,'1:*'); // to clear out an entire mailbox.
@imap_expunge($conn);
echo
"Trash is empty.";

imap_close($conn);
}
else
{
echo
"<form name='formA' action='".$_SERVER['PATH_INFO']."' method='POST'>"; ?>
Are you sure to empty trash ?
<p>
<input type="submit" value="Go Ahead" name="DoNow">&nbsp;
<input type="button" value="Cancel" name="Cancel" onClick='javascript:self.history.go(-1)'></form></p>
<?php
} ?>
up
1
Daniel Dafoe
8 years ago
Just so anyone using this function is aware: if you mark an email to be deleted from a mailbox, that flag does not persist. You need to call imap_expunge() or use the CL_EXPUNGE option with imap_close() to remove the marked email in the same PHP script you marked it in.

I hope this helps someone out.
up
0
Olle
11 years ago
I couldn't get imap_delete to work when I used it with pop3. Instead i wrote:
<?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)));
}
?>
up
0
chris at financialservicesonline dot com dot au
15 years ago
After a little experimentation i found out how to mark a single message for deletion...

<?php

$msgid
= '5'; //For example

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

?>

imap_delete() seems to want a range, so to select one, simply range from your id to your id.

Hope this helps.
up
0
iwantsimplelife at lycos dot com
15 years ago
Somehow, when ever I try to delete an email using the message number returned by imap_header, any email with a message number below 999 will fail.

I discovered that the imap_header will pad the message number with spaces. You will need to trim the number before calling imap_delete.

I am using qmail and it took me over a month to figure it out.

Hope this will be helpful to some poor soul out there facing the same problem.
up
0
James G
20 years ago
I had some major issues deleting emails using this function. Using IIS 5.0 and a win based Mail Server, I could not delete the emails individually.

My script merely needed to check the emails and update the database for bounce backs, after which I simply wanted to erase all emails.

If imap_delete($mbox,$email->MsgNo) just isnt working for you, you can try using

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

to clear out an entire mailbox.

Hope this helps cause it drove me insane for about 5 hours. :)
up
-1
thisemailaddress at gmail dot com
14 years ago
In case you feel the need to kill all emails from before a certain year on your Gmail account, this would work:

<?php
error_reporting
(E_ALL ^ (E_NOTICE | E_WARNING));

echo
"parsing ini file...\n";
$ini = parse_ini_file('g.ini');
$user = $ini['user'];
$pass = $ini['pass'];
$year = $ini['year'];
echo
"account {$user} - killing msgs from before {$year}\n\n";

echo
"connecting...\n";
$imap = imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}[Gmail]/All Mail", $user, $pass) or die("can't connect: " . imap_last_error() . "\n");

echo
"checking current mailbox...\n";
$mbox = imap_check($imap);

echo
"fetching overview...\n";
$flaggedForDelete = 0;
for(
$n = 0; $n < $mbox->Nmsgs; $n++) {
echo
"processing {$n} of {$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
"expunging mailbox ({$flaggedForDelete} messages flagged)... ";
echo ((
imap_expunge($imap)) ? "ok" : "failed!")."\n";
imap_close($imap);

?>
up
-3
Alex
14 years ago
I think you don't have to give a range to imap_delete() if you want to delete a single one.

This works well:

<?php

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

?>
To Top