php imap проверь если в письме есть вложение - PullRequest
3 голосов
/ 30 марта 2012

Я пытаюсь создать небольшое приложение для веб-почты.Когда я читаю все электронные письма в папке «Входящие», я хочу показать для каждого письма, если оно имеет вложения.Это работает, но проблема в том, что это занимает много времени, около 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;
 }

Ответы [ 2 ]

1 голос
/ 17 марта 2017

Чтобы проверить, есть ли в письме вложение, используйте $ 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
}
1 голос
/ 30 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...