Benutzer-Werkzeuge

Webseiten-Werkzeuge


php:imap

E-Mails aus IMAP-Konto mit PHP auslesen

Mit PHP ist es sehr einfach möglich, auf die E-Mails in einem E-Mail-Konto zuzugreifen und deren Inhalte auszulesen. Mit der nachfolgenden PHP-Klasse können IMAP-Konten ausgelesen werden. Voraussetzung hierfür ist, dass PHP mit der Erweiterung „imap“ installiert wurde:

Sollte die Erweiterung nicht installiert sein suchen Sie in der php.info nach der Zeile „;extension=php_imap.dll“ und entfernen Sie das vorangestellte Semikolon „;“.

Tragen Sie in der folgenden PHP-Klasse den Server, Usernamen und das Passwort für das abzufragende E-Mail-Konto ein.

class.imap.php
class imap
{
    private $server     = '';
    private $username   = '';
    private $password   = '';
    private $port       = 143;
    private $type       = 'IMAP';
    private $ssl        = true;
 
    /**
     * @var resource $stream
     */
    private $stream = NULL;
 
    public function getEmails( $onlyUnread = false )
    {
        $ssl = '';
 
        if( $this->ssl )
        {
            $ssl = '/ssl';
        }
 
        $mailbox = sprintf( "{%s:%d/%s%s/novalidate-cert}INBOX", $this->server, $this->port, $this->type, $ssl );
        $this->stream = imap_open( $mailbox, $this->username, $this->password );
        $MC = imap_check( $this->stream );
        $emails = imap_fetch_overview( $this->stream, "1:{$MC->Nmsgs}", 0 );
 
        if( $onlyUnread ) // nur ungelesene E-Mails
        {
            foreach( $emails as $key=>$email )
            {
                if( $email->seen ) // Email wurde bereits gelesen
                {
                    unset( $emails[$key] ); // Email aus Liste entfernen
                }
            }
        }
 
        return $emails;
    }
 
    public function getEmailBody( $uid )
    {
        $body = imap_fetchbody( $this->stream, $uid, 1 );
        return imap_qprint( $body );
    }
 
    /**
     * @param string $uid
     * @return bool|string
     */
    public function getAttachments( $uid )
    {
        $structure = imap_fetchstructure( $this->stream, $uid );
 
        foreach( $structure->parts as $key=>$part )
        {
            if( isset( $part->disposition ) && $part->disposition === 'attachment' )
            {
                $attachment = imap_fetchbody( $this->stream, $uid, $key+1, FT_INTERNAL );
                return str_replace( '=0A=', '', $attachment ); // Zeilenumbrueche
            }
        }
 
        return false;
    }
 
    public function close()
    {
        if( $this->stream !== false )
        {
            imap_close( $this->stream );
        }
    }
}

Hinweis: Sobald eine E-Mail mit der Funktion „imap_fetchbody“ ausgelesen wurde wird sie automatisch als „gelesen“ (seen = 1) gekennzeichnet. Bei einem erneuten Aufruf von „getEmails( true)“ werden diese E-Mails nicht mehr mit ausgegeben.

Beispiel

$imap = new imap();
$emails = $imap->getEmails( true );
$bodies = [];
 
foreach( $emails as $email )
{
    $bodies[] = $imap->getEmailBody( $email->uid );
}
$imap->close();
 
print_r( $bodies );

Mit regulären Ausdrücken wäre es jetzt z. B. Möglich, den Inhalt der E-Mails nach bestimmten Inhalten zu parsen.


Beispiel für Dateianhänge (Attachments)

$imap = new imap();
$emails = $imap->getEmails( true );
 
foreach( $emails as $email )
{
    $attachment = $imap->getAttachments( $email->uid );
 
    if( $attachment !== false )
    {
        echo "Anhang gefunden: " . $attachment;
    }
}
php/imap.txt · Zuletzt geändert: 2022/08/17 10:49 von webproducer