I am using Horde IMAP Client to fetch emails from an IMAP server. So far so good, I can authenticate, connect to a mailbox, download and parse emails.
The problem now is I need to parse emails with attachments, and I am finding it a bit tricky figuring out how to set the fetch query, then fetch and get access to email attachments.
I have tried searching the web but not much info on how to use Horde IMAP Client is available on the net, and their documentation is not helping at all.
How can I fetch the attachments from an email?
Here is the code I am using to fetch the envelope details, and plain-text emails from a mailbox (using Composer, rather than PEAR, hence the autoload
):
<?php
// Init
require_once('./vendor/autoload.php');
echo '<pre>';
// Function: Returns a comma-separated list of names and email addresses from a Horde_Mail_Rfc822_List object
function get_parties($addresses) {
$parties = [];
foreach($addresses as $address){
$name = trim($address->personal, "'") ;
$email = $address->bare_address;
$parties[] = $name ? "$name ($email)" : $email;
}
return implode(', ', $parties);
}
// Connect to IMAP
try {
$client = new Horde_Imap_Client_Socket(array(
'username' => '[email protected]',
'password' => 'S0m3PASS',
'hostspec' => 'mygreat.webhost.com',
'port' => '143',
'secure' => 'tls'
));
}
// Failed to connect
catch (Horde_Imap_Client_Exception $e) {
echo "<H1>ERROR!!</H1>";
}
// Search for messages in the Inbox
$query = new Horde_Imap_Client_Search_Query();
$results = $client->search('INBOX', $query);
// Loop over each email found
foreach($results['match'] as $match) {
$query = new Horde_Imap_Client_Fetch_Query();
$query->envelope();
$query->structure();
$uid = new Horde_Imap_Client_Ids($match);
$list = $client->fetch('INBOX', $query, array('ids' => $uid));
$envelope = $list->first()->getEnvelope();
$subject = $envelope->subject;
$from = get_parties($envelope->from);
$to = get_parties($envelope->to);
$cc = get_parties($envelope->cc);
$timestamp = $envelope->date->getTimestamp();
$bst = date('I', $timestamp) * 3600;
$date = gmdate('d/m/Y H:i', $timestamp + $bst); // If no date is specified in the email header, it will default to now
$part = $list->first()->getStructure();
$id = $part->findBody();
$body = $part->getPart($id);
// Output the envelope details
echo "<h1>$date</h1>" .
"<h1>From: $from</h1>" .
"<h1>To: $to</h1>" .
($cc ? "<h1>CC: $cc</h1>" : '') .
"<h1>$subject</h1>";
// Get the message
$query2 = new Horde_Imap_Client_Fetch_Query();
$query2->bodyPart($id, array(
'decode' => true,
'peek' => true
));
$list2 = $client->fetch('INBOX', $query2, array(
'ids' => $uid
));
$message2 = $list2->first();
$text = $message2->getBodyPart($id);
$body->setContents($text);
echo $text = $body->getContents();
echo '<br><br>';
echo '<H1>ENVELOPE</H1>';
print_r($envelope);
echo '<br><br>';
echo '<H1>STRUCTURE</H1>';
print_r($part);
echo '<hr>';
}
echo '</pre>';
?>