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 { 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.
$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.
$imap = new imap(); $emails = $imap->getEmails( true ); foreach( $emails as $email ) { $attachment = $imap->getAttachments( $email->uid ); if( $attachment !== false ) { echo "Anhang gefunden: " . $attachment; } }