php imap проверяет, есть ли в письме вложение


Я пытаюсь создать небольшое приложение для веб-почты. Когда я читаю все электронные письма в папке "Входящие", я хочу показать для каждого письма, есть ли в нем вложения. Это работает, но проблема в том, что для этого требуется много времени, около 0,5 секунды для вложения 1 Мб электронной почты. Умножьте это на все электронные письма в папке "Входящие" с большими вложенными файлами :| Мой вопрос: как проверить, есть ли в электронном письме вложение без загрузки всего письма? Возможно ли это? Ниже приведен код, который я сейчас использую:

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;
 }
Author: Adrian Neatu, 2012-03-30

2 answers

imap_fetchstructure извлекает все содержимое электронной почты, чтобы проанализировать его. К сожалению, другого способа проверить наличие привязанности нет.

Возможно, вы можете использовать информацию о размере сообщения из imap_headerinfo, чтобы получить прогноз, будут ли в сообщении вложения.

Другой способ - регулярно извлекать электронные письма в фоновом режиме и сохранять их вместе с содержимым и идентификатором для последующего поиска в базе данных. Вам все равно нужно сделать это позже, когда вы захотите, поэтому ищите конкретные сообщения. (Ты не хотите сканировать учетную запись while imap при поиске "ужин")

 1
Author: fab, 2012-03-30 08:46:34

Чтобы проверить, есть ли в письме вложение, используйте $structure->части[0]->части.

$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
}
 0
Author: Emily, 2017-03-17 03:54:11