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;
}
2 answers
imap_fetchstructure
извлекает все содержимое электронной почты, чтобы проанализировать его. К сожалению, другого способа проверить наличие привязанности нет.
Возможно, вы можете использовать информацию о размере сообщения из imap_headerinfo
, чтобы получить прогноз, будут ли в сообщении вложения.
Другой способ - регулярно извлекать электронные письма в фоновом режиме и сохранять их вместе с содержимым и идентификатором для последующего поиска в базе данных. Вам все равно нужно сделать это позже, когда вы захотите, поэтому ищите конкретные сообщения. (Ты не хотите сканировать учетную запись while imap при поиске "ужин")
Чтобы проверить, есть ли в письме вложение, используйте $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
}