• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imap_delete()

    (PHP 4, PHP 5, PHP 7)

    Mark a message for deletion from current mailbox

    说明

    imap_delete(resource $imap_stream,int $msg_number[,int $options= 0]): bool

    Marks messages listed in$msg_numberfor deletion. Messages marked for deletion will stay in the mailbox until either imap_expunge() is called or imap_close() is called with the optional parameter CL_EXPUNGE.

    参数

    $imap_stream

    由imap_open()返回的 IMAP 流。

    $msg_number

    The message number

    $options

    You can set the FT_UID which tells the function to treat the$msg_numberargument as aUID.

    返回值

    Returns TRUE.

    范例

    Example #1 imap_delete() example

    <?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);
    ?>
    

    注释

    Note:

    IMAP mailboxes may not have their message flags saved between connections, so imap_expunge() should be called during the same connection in order to guarantee that messages marked for deletion will actually be purged.

    参见

    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);
    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".
    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.
    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.
    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)));
    }
    ?>
    
    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);
    ?>
    
    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.
    // 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
    } ?>
    
    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. :)
    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));  
    ?>