php imap检查电子邮件是否有附件

php imap检查电子邮件是否有附件,php,email,imap,Php,Email,Imap,我正在尝试构建一个小的webmail应用程序。当我阅读收件箱中的所有电子邮件时,我想显示每封邮件是否有附件。这是可行的,但问题是这样做需要很长时间,1Mb电子邮件附加大约需要0.5秒。将其与收件箱中具有大附件的所有电子邮件相乘:| 我的问题是:如何在不加载整个电子邮件的情况下检查电子邮件是否已附加?可能吗? 下面是我现在使用的代码: function existAttachment($part) { if (isset($part->parts)) { foreach

我正在尝试构建一个小的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;
 }
函数existAttachment($part)
{ 
if(isset($part->parts))
{ 
foreach($part->parts as$partOfPart)
{ 
$this->existAttachment($partOfPart);
} 
} 
其他的
{ 
如果(isset($part->disposition))
{ 
如果($part->disposition=='attachment')
{ 
回显“”。$part->dparameters[0]->值。“

”; //在这里,您可以创建一个指向文件名为$part->dparameters[0]->value的链接来下载它 返回true; } } } 返回false; } 函数hasAttachments($msgno) { $struct=imap\u fetchstructure($this->\u连接,$msgno,FT\u UID); $existAttachments=$this->existAttachment($struct); 返回$existAttachments; }
imap\u fetchstructure
会提取整个电子邮件内容以进行分析。遗憾的是,没有其他方法来检查附件

也许您可以使用
imap\u headerinfo
中的邮件大小信息来预测邮件是否有附件


另一种方法是在后台定期提取电子邮件,并将其与内容和UID一起存储,以便以后在数据库中查找。当你想搜索特定的消息时,你需要稍后再做。(搜索“晚餐”时,您不想扫描while imap帐户。)

要检查电子邮件是否有附件,请使用$structure->parts[0]->parts

$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
}

这会下载整个电子邮件,这正是我想要避免的