2012-03-30 3 views
3

Ich versuche, eine kleine Webmail-App zu bauen. Wenn ich alle E-Mails im Posteingang lese, möchte ich für jede E-Mail anzeigen, ob Anhänge vorhanden sind. Das funktioniert, aber das Problem ist, dass es zu lange dauert, etwa 0,5 Sekunden für 1Mb E-Mail-Attach. Multiplizieren Sie das mit allen E-Mails im Posteingang, die große Attach-Dateien haben: | Meine Frage ist: Wie überprüft man, ob eine E-Mail angehängt ist, ohne die gesamte E-Mail zu laden? Ist das möglich ? Bellow ist der Code ich jetzt benutze:php imap überprüfen, ob E-Mail Anhang hat

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

Antwort

1

imap_fetchstructure nicht holt die gesamten E-Mail-Inhalte, um sie zu analysieren. Leider gibt es keine andere Möglichkeit, nach Anhang zu suchen.

Vielleicht können Sie die Nachrichtengröße Info von imap_headerinfo verwenden, um eine Vorhersage zu erhalten, wenn die Nachricht Anhänge haben wird.

Eine andere Möglichkeit besteht darin, die E-Mails in einem regelmäßigen Intervall im Hintergrund abzurufen und sie mit ihrem Inhalt und ihrer UID für eine spätere Suche in einer Datenbank zu speichern. Sie müssen das später trotzdem machen, wenn Sie nach bestimmten Nachrichten suchen möchten. (Sie wollen nicht den while IMAP-Account scannen, wenn Sie nach "Abendessen" suchen)

0

Um zu überprüfen, ob die E-Mail einen Anhang hat, verwenden Sie $ 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

Das downloadet die ganze E-Mail, was ich vermeiden wollte –