Search code examples
phpgmailimap-open

Using PHP, How to search through Gmail's archived emails


(First time programming in PHP. Had some help. Need a bit more.)

Goal:

Pull the lastContactDate from a given email address from my gmail account. Hoping to answer the question, "When was the last time I contacted [Person]"

What I've done so far:

  • Connected to gmail using imap (inbox only)
  • Grabbed the date and time
  • Printed the person's name and timestamp.

What I can't do:

  • Scour emails for lastContactDate that have been archived (I'm an inbox=0 guy)

Notes:

  • The code is rough, but functional. The php should really be separated onto different pages, but this is first attempt. Thanks in advance for any help!
  • Loving programming, btw. I did a little @edw519 dance more than once the last two days.

Research:

Code used thus far:

    /* connect to gmail */
$gmailhostname = '{imap.gmail.com:993/imap/ssl}';
$gmailusername = "___@gmail.com";
$gmailpassword = "___";

    /* try to connect */
$conn = imap_open($gmailhostname,$gmailusername,$gmailpassword) or die('Cannot connect to Gmail: ' . imap_last_error());

$query = mysql_query("SELECT * FROM users");    
    while($row = mysql_fetch_array($query))
    {
        $findemail = $row["email"];

        /* grab emails */
        $emails = imap_search($conn,'FROM "'.$findemail.'"');

        /* if emails are returned, cycle through each... */
        if ($emails) { 
            /* begin output var */
            $output = '';             
            /* put the newest emails on top */
            rsort($emails);

            /* for 5 emails... */
            $emails = array_slice($emails,0,1);

            foreach ($emails as $email_number) {    
                /* get information specific to this email */
                $overview = imap_fetch_overview($conn,$email_number,0);
                $message = imap_fetchbody($conn,$email_number,2);

                /* output the email header information */
                /*
            $output.= '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">';
                $output.= '<span class="subject">'.$overview[0]->subject.'</span> ';
                $output.= '<span class="from">'.$overview[0]->from.'</span>';
            */
                $output.= '<span class="from">'.$overview[0]->from.'</span> ';
                $output.= '<span class="date">on '.$overview[0]->date.'</span> <br /><br />';
                mysql_query("UPDATE users SET lastContactDate = '".$overview[0]->date."' WHERE email = '".$findemail."'") or die(mysql_error());

                /* output the email body */
                /* $output.= '<div class="body">'.$message.'</div>'; */
            }
            echo $output;
        }
    } 
/* close the connection */
imap_close($conn);
?>

Solution

  • Problem solved!

    Here's the solution. Using the original code above, we only modified the location in which our program searches. Instead of INBOX, it's:

        /* connect to gmail */
    $gmailhostname = '{imap.gmail.com:993/imap/ssl}[Gmail]/All Mail';
    

    Specifically

    [Gmail]/All Mail
    

    Found the syntax here: http://php.net/manual/en/function.imap-delete.php

    But would not have been possible without Ben's epic solution below.. In large part for this bit:

        //You can find out what folders are available with this command:
    print_r(imap_list($conn, $gmailhostname, '*'));
    

    print_r listed all the folders in my account by name. We spotted "All Mail", in my case - 22,000+, found a sample piece of code on php.net with the syntax, plugged it in and viola!

    Thanks to mmmshuddup for cleaning my code and especially Ben for the enormous researching effort and leading solutions.

    This is fun as hell.