You are currently viewing eMails abfragen mit PHP und IMAP

Wenn man möchte, dass mehrere User die eMails eines bestimmten Accounts lesen können (z.B. der Support-Account bei einer größeren Webseite vom ganzen Support-Team) kann man natürlich entweder die Login-Daten an alle User weitergeben oder man fragt die eMails einfach via PHP ab und lässt sie in einem geschützten Bereich allen Berechtigten anzeigen, dank IMAP ist das Ganze auch gar nicht so schwierig.


Ich werde hier übrigens bewusst nur auf IMAP eingehen, da dies mehr Möglichkeiten bietet als POP3 und zudem mittlerweile auch von so ziemlich jedem eMail-Anbieter unterstützt wird.

Zunächst muss man dafür die Verbindung zu seiner Mailbox aufbauen:

$srv = '{imap.gmail.com:993/imap/ssl}INBOX';
$usr = 'blablubb@gmail.com';
$pw = 'deinpw';
$mailbox = imap_open($srv, $usr, $pw) or die('Cannot connect to Mailserver: ' . imap_last_error());

Ich verwende für dieses Beispiel einen GMail Account, da dies einer der am weitesten verbreiteten Anbieter ist, bei anderen Anbietern muss man natürlich neben dem Mailserver ggf auch noch den Port und den Usernamen (meist die eMail Adresse) anpassen, die genauen Daten dafür erfahrt ihr von eurem eMail Anbieter. Im Falle von GMail müsst ihr außerdem in eurem Konto in den Sicherheitseinstellungen den Zugriff durch „weniger sichere Apps“ zulassen.

Nun können wir die eMails abfragen, zunächst einmal holen wir uns die IDs aller eMails des heutigen Tages und anschließend die dazugehörigen Header sowie natürlich die Nachrichten selbst um sie dann zu formatieren und auszugeben:

// eMails von Heute abfragen, zu weiteren Abfragemöglichkeiten siehe unten
$emails = imap_search($mailbox,'ON '. date('Y-m-d'));

foreach ($emails as $m) {
    $header = imap_headerinfo($mailbox, $m);
    $message = imap_fetchbody($mailbox, $m, 2);
    $structure = imap_fetchstructure($mailbox, $m);

    // Damit die Nachricht korrekt dargestellt werden kann muss ermittelt werden wie diese kodiert ist
    $part = $structure->parts[1];

    if($part->encoding == 3) {
        $message = imap_base64($message);
    } else if($part->encoding == 1) {
        $message = imap_8bit($message);
    } else {
        $message = imap_qprint($message);
    }

    echo 'Betreff: '. imap_utf8($header->subject) .'<br>';
    echo 'Absender: '. $header->fromaddress .'<br>';
    echo 'Nachricht: '. $message .'<hr>';
}

// Verbindung beenden
imap_expunge($mailbox);
imap_close($mailbox);

Die Ausgabe habe ich in diesem Beispiel bewusst sehr einfach gehalten, das wird in der Regel ja sowieso jeder so gestalten wie er es bevorzugt.

Anstelle der eMails des aktuellen Tages gib es natürlich noch einige weitere Möglichkeiten die eMails mittels imap_search() zu filtern:

    ALL - alle Nachrichten
    ANSWERED - beantwortete Nachrichten (mit dem  \\ANSWERED flag versehen)
    BCC "string" - Nachrichten, die "string" im Bcc: Feld enthalten
    BEFORE "date" - Nachrichten vor "date" (Y-m-d)
    BODY "string" - Nachrichten, die "string" im Body
    CC "string" - Nachrichten, die "string" im Cc: Feld
    DELETED - gelöschte Nachrichten
    FLAGGED - mit dem \\FLAGGED Flag versehene Nachrichten (oft auch "Wichtig" oder "Dringend")
    FROM "string" - Nachrichten, die "string" im From: Feld
    KEYWORD "string" - Nachrichten, die "string" als Keyword haben
    NEW - neue Nachrichten
    OLD - alte Nachrichten
    ON "date" - Nachrichten vom Datum "date" (Y-m-d)
    RECENT - mit dem \\RECENT Flag versehene Nachrichten
    SEEN - gelesene Nachrichten (mit dem \\SEEN Flag versehen)
    SINCE "date" - Nachrichten nach dem "date" (Y-m-d)
    SUBJECT "string" - Nachrichten, die "string" im Subject:
    TEXT "string" - Nachrichten, die "string" im Text
    TO "string" - Nachrichten, die "string" im To: Feld
    UNANSWERED - unbeantwortete Nachrichten
    UNDELETED - ungelöschte Nachrichten
    UNFLAGGED - Nachrichten ohne Flag
    UNKEYWORD "string" - Nachrichten, die das Keyword "string" NICHT enthalten
    UNSEEN - ungelesene Nachrichten

Damit das alles funktioniert muss auf dem Server natürlich die IMAP Extension für PHP installiert und aktiviert sein, falls das nicht der Fall ist, könnt ihr das folgendermaßen ganz einfach nachholen indem ihr euch via SSH mit dem Server verbindet und folgendes eingebt:

sudo apt-get install php5-imap
sudo php5enmod imap
sudo service apache2 restart

(gilt für Debian-basierte Systeme, muss für andere Distributionen ggf angepasst werden)

Solltet ihr keinen SSH-Zugriff zu eurem Server haben, so wendet euch an euren Anbieter, damit dieser das ggf aktivieren kann.

Weitere Informationen zum Thema:
IMAP Funktionen im PHP Manual
(hier findet ihr auch weitere Optionen / Informationen, die ihr bei Bedarf abfragen könnt, ich habe hier nur die wichtigsten genannt)



Dieser Beitrag hat einen Kommentar

  1. Otto W.

    Hallo, nur einen kurzen Gruß und 1000x Dank für Dein Tutorial. Habe im netz soviel Müll dazugefunden, aber Dein Script hat mir wirklich sehr geholfen! Danke Dir für Deine Mühe!!!!
    Gruß Otto.

Schreibe einen Kommentar