I need the code to search for emails that meet the subject (which it does) but only to return ones that arrived between two dates. The code I’m using at the moment is searching SINCE but even that returns emails that are older than the 20th Jan 2013:
$emailSearch = "SUBJECT \"PerformanceStatement ($orgSaboName)\" SINCE \"20-Jan-2013\"";
function downloadDataSearch($emailAddress, $reportUrl, $reportType, $emailSearch)
{
$result = "error";
// DOWNLOAD DATA
// the max time allows for the email to download
set_time_limit(30000);
// connect to gmail with your credentials
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = $emailAddress; # e.g somebody@gmail.com
$password = '*************';
// try to connect
$inbox = imap_open($hostname,$username,$password) or die('Cannot download information: ' . imap_last_error());
$max_emails = 1;
/* get all new emails. If set to 'ALL' instead
* of 'NEW' retrieves all the emails, but can be
* resource intensive, so the following variable,
* $max_emails, puts the limit on the number of emails downloaded.
*
*/
$emails = imap_search($inbox, "$emailSearch");
// if any emails found, iterate through each email
if($emails > 0)
{
$count = 1;
// put the newest emails on top
//rsort($emails);
// for every email...
foreach($emails as $email_number)
{
// get information specific to this email
$overview = imap_fetch_overview($inbox,$email_number,0);
// get mail structure
$structure = imap_fetchstructure($inbox, $email_number);
$attachments = array();
// if any attachments found...
if(isset($structure->parts) && count($structure->parts))
{
for($i = 0; $i < count($structure->parts); $i++)
{
$attachments[$i] = array(
'is_attachment' => false,
'filename' => '',
'name' => '',
'attachment' => ''
);
if($structure->parts[$i]->ifdparameters)
{
foreach($structure->parts[$i]->dparameters as $object)
{
if(strtolower($object->attribute) == 'filename')
{
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['filename'] = $object->value;
}
}
}
if($structure->parts[$i]->ifparameters)
{
foreach($structure->parts[$i]->parameters as $object)
{
if(strtolower($object->attribute) == 'name')
{
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['name'] = $object->value;
}
}
}
if($attachments[$i]['is_attachment'])
{
$attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i+1);
// 4 = QUOTED-PRINTABLE encoding
if($structure->parts[$i]->encoding == 3)
{
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
}
// 3 = BASE64 encoding
elseif($structure->parts[$i]->encoding == 4)
{
$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
}
//imap_delete($inbox,$email_number);
//imap_mail_move($inbox, $email_number,'[Gmail]/Bin');
}
}
}
// iterate through each attachment and save it
foreach($attachments as $attachment)
{
if($attachment['is_attachment'] == 1)
{
// SCAN REPORT SET OUTSIDE OF FUNCTION
$filename = $reportUrl;
if(empty($filename)) $filename = $attachment['filename'];
if(empty($filename)) $filename = time() . ".dat";
/* prefix the email number to the filename in case two emails
* have the attachment with the same file name.
*/
$fp = fopen($filename, "w+");
fwrite($fp, $attachment['attachment']);
fclose($fp);
$result = "success";
}
}
// Only include if you have set $max_emails above //
// if($count++ >= $max_emails) break;
}
}
// close the connection
imap_close($inbox,CL_EXPUNGE);
return $result;
}
Any ideas what I’m doing wrong to have it return the first email since a particular date or a way to search between two dates?
EDIT
With no suggestions I decided to order the resulting emails from oldest to newest and then as I go through each one I number them from 1 on. From that I get the x most recent or oldest, etc. It doesn’t answer this question but it worked for what I needed.
With no suggestions I decided to order the resulting emails from oldest to newest and then as I go through each one I number them from 1 on. From that I get the x most recent or oldest, etc. It doesn’t answer this question but it worked for what I needed.