我正在使用 Horde IMAP 客户端从 IMAP 服务器获取电子邮件。到目前为止一切顺利,我可以进行身份验证、连接到邮箱、下载和解析电子邮件。
现在的问题是我需要解析带有附件的电子邮件,我发现弄清楚如何设置获取查询,然后获取并访问电子邮件附件有点棘手。
我试过在网上搜索,但网上没有太多关于如何使用 Horde IMAP 客户端的信息,而且他们的文档也没有任何帮助。
如何从电子邮件中获取附件?
这是我用来从邮箱中获取信封详细信息和纯文本电子邮件的代码(使用 Composer,而不是 PEAR,因此是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' => 'my@email.com',
'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>';
?>