我正在尝试构建一个小型的webmail应用程序。当我阅读收件箱中的所有电子邮件时,我想为每封邮件显示它是否有附件。这有效,但问题是需要很长时间才能做到这一点,1Mb电子邮件附加大约需要0.5秒。将其与收件箱中具有大附件文件的所有电子邮件相乘:| 我的问题是:如何在没有加载整个电子邮件的情况下检查电子邮件是否已附加?那可能吗 ? 贝娄是我现在使用的代码:
function existAttachment($part)
{
if (isset($part->parts))
{
foreach ($part->parts as $partOfPart)
{
$this->existAttachment($partOfPart);
}
}
else
{
if (isset($part->disposition))
{
if ($part->disposition == 'attachment')
{
echo '<p>' . $part->dparameters[0]->value . '</p>';
// here you can create a link to the file whose name is $part->dparameters[0]->value to download it
return true;
}
}
}
return false;
}
function hasAttachments($msgno)
{
$struct = imap_fetchstructure($this->_connection,$msgno,FT_UID);
$existAttachments = $this->existAttachment($struct);
return $existAttachments;
}
答案 0 :(得分:1)
imap_fetchstructure
会获取整个电子邮件内容以进行分析。可悲的是,没有其他方法可以检查附件。
也许您可以使用imap_headerinfo
中的邮件大小信息来预测邮件是否包含附件。
另一种方法是在后台定期获取电子邮件,并将其与内容和UID一起存储,以便以后在数据库中查找。无论如何,当您需要搜索特定消息时,您需要稍后执行此操作。 (您不想在搜索“晚餐”时扫描while imap帐户)
答案 1 :(得分:0)
要检查电子邮件是否附件,请使用$ structure-&gt; parts [0] - &gt;部分。
$inbox = imap_open($mailserver,$username, $password, null, 1, ['DISABLE_AUTHENTICATOR' => 'PLAIN']) or die(var_dump(imap_errors()));
$unreadEmails = imap_search($inbox, 'UNSEEN');
$email_number = $unreadEmails[0];
$structure = imap_fetchstructure($inbox, $email_number);
if(isset($structure->parts[0]->parts))
{
// has attachment
}else{
// no attachment
}