====== 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:
{{::php:phpinfo_imap.png|}}
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.
===== Beispiel =====
$imap = new imap();
$emails = $imap->getEmails( true );
$bodies = [];
foreach( $emails as $email )
{
$bodies[] = $imap->getEmailBody( $email->uid );
}
$imap->close();
print_r( $bodies );
Mit [[php:preg|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;
}
}