2012-03-30 3 views
3

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

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

ответ

1

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

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

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

0

Чтобы проверить, есть ли вложение электронной почты, используйте $ 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 
} 
+0

Это загружает все электронное письмо, которое я хотел избежать –

Смежные вопросы