Eine PHP-IMAP-Bibliothek zum Lesen und Verarbeiten von E-Mails über das IMAP-Protokoll, erstellt mit robuster objektorientierter Architektur.
Diese Bibliothek erfordert PHP >= 8.3 mit installierten IMAP-, Iconv- und Multibyte-String-Erweiterungen.
Die empfohlene Methode zur Installation der IMAP-Bibliothek ist Composer:
$ Composer erfordert ddeboer/imap
Für diesen Befehl muss Composer global installiert sein, wie im Installationskapitel der Composer-Dokumentation erläutert.
use DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection ist eine Instanz von DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password');
Sie können Port, Flags und Parameter für den Server angeben:
$server = neuer Server($hostname, // erforderlicher $port, // standardmäßig '993'$flags, // standardmäßig '/imap/ssl/validate-cert'$parameters);
Rufen Sie Postfächer (auch als E-Mail-Ordner bezeichnet) vom Mailserver ab und durchlaufen Sie sie:
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// Nur Container-Postfächer überspringen// @see https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($mailbox->getAttributes() & LATT_NOSELECT) {continue; }// $mailbox ist eine Instanz von DdeboerImapMailboxprintf('Mailbox "%s" hat %s Nachrichten', $mailbox->getName(), $mailbox->count()); }
Oder rufen Sie ein bestimmtes Postfach ab:
$mailbox = $connection->getMailbox('INBOX');
Ein Postfach löschen:
$connection->deleteMailbox($mailbox);
Sie können jede Markierung für Postfachnachrichten (nach UIDs) in großen Mengen festlegen oder löschen:
$mailbox->setFlag('Seen Flagged', ['1:5', '7', '9']);$mailbox->setFlag('Seen', '1,3,5,6: 8');$mailbox->clearFlag('Flagged', '1,3');
WARNUNG Sie müssen bei Massenänderungsflags neue Nachrichteninstanzen abrufen, um die einzelnen Nachrichtenflags zu aktualisieren.
Rufen Sie Nachrichten (E-Mails) aus einem Postfach ab und durchlaufen Sie sie:
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message ist eine Instanz von DdeboerImapMessage}
So fügen Sie eine neue Nachricht (die gerade gesendet wurde) in das Postfach „Gesendet“ ein und kennzeichnen sie wie angezeigt:
$mailbox = $connection->getMailbox('Sent');$mailbox->addMessage($messageMIME, 'Seen');
Beachten Sie, dass die Nachricht eine Zeichenfolge im MIME-Format sein sollte (wie in RFC2045 beschrieben).
use DdeboerImapSearchExpression;use DdeboerImapSearchEmailTo;use DdeboerImapSearchTextBody;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$messages = $mailbox->getMessages($search);
WARNUNG Derzeit ist es nicht möglich, Leerzeichen und doppelte Anführungszeichen gleichzeitig zu maskieren. Derzeit werden nur Leerzeichen korrekt maskiert. Sie können DdeboerImapSearchRawExpression
verwenden, um die vollständige Suchbedingung selbst zu schreiben.
Nachrichten können auch nach der Funktion imap_sort sortiert abgerufen werden:
$today = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // Sortierkriterientrue // Absteigende Reihenfolge);
Beachten Sie, dass die PHP-IMAP-Bibliothek auf der unter https://www.washington.edu/imap/ verfügbaren c-client
-Bibliothek basiert, die einige IMAP4-Suchkriterien wie OR
nicht vollständig unterstützt. Wenn Sie diese nicht unterstützten Kriterien wünschen, müssen Sie die neueste Version ( imap-2007f
vom 23. Juli 2011 zum Zeitpunkt dieses Commits) manuell patchen und PHP in Ihrer gepatchten c-client
-Bibliothek neu kompilieren.
Übrigens sind die meisten gängigen Suchkriterien verfügbar und funktionieren. Durchsuchen Sie sie in ./src/Search
.
Referenzen:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
und ./docs/internal.txt
Rufen Sie die Nachrichtennummer und die eindeutige Nachrichten-ID im Format <...> ab:
$message->getNumber();$message->getId();
Weitere Nachrichteneigenschaften abrufen:
$message->getSubject();$message->getFrom(); // MessageEmailAddress$message->getTo(); // Array von MessageEmailAddress$message->getDate(); // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
Nachrichtenheader als DdeboerImapMessageHeaders-Objekt abrufen:
$message->getHeaders();
Nachrichtentext als HTML oder Nur-Text abrufen (nur erster Teil):
$message->getBodyHtml(); // Inhalt des Text-/HTML-Teils, falls vorhanden$message->getBodyText(); // Inhalt des Text-/Klarteils, falls vorhanden
Holen Sie sich den kompletten Körper (alle Teile):
$body = $message->getCompleteBodyHtml(); // Inhalt des Text-/HTML-Teils, wenn presentif ($body === null) { // Wenn body null ist, gibt es keine HTML-Teile, also versuchen wir, den Text zu erhalten body$body = $message->getCompleteBodyText() ; // Inhalt des Textes/Klarteils, falls vorhanden}
Durch das Lesen des Nachrichtentexts bleibt die Nachricht unsichtbar. Wenn Sie die Nachricht als gesehen markieren möchten:
$message->markAsSeen();
Oder Sie können ein beliebiges Flag setzen oder löschen:
$message->setFlag('Seen Flagged');$message->clearFlag('Flagged');
Verschieben Sie eine Nachricht in ein anderes Postfach:
$mailbox = $connection->getMailbox('another-mailbox');$message->move($mailbox);
Nachrichten löschen:
$mailbox->getMessage(1)->delete();$mailbox->getMessage(2)->delete();$connection->expunge();
Rufen Sie Nachrichtenanhänge ab (sowohl Inline- als auch angehängte) und durchlaufen Sie diese:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment ist eine Instanz von DdeboerImapMessageAttachment}
Laden Sie einen Nachrichtenanhang in eine lokale Datei herunter:
// getDecodedContent() dekodiert den Inhalt des Anhangs automatisch:file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
Überprüfen Sie, ob der Anhang eine eingebettete Nachricht ist, und rufen Sie ihn ab:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage ist eine Instanz von DdeboerImapMessageEmbeddedMessage } }
Eine EmbeddedMessage verfügt über dieselbe API wie eine normale Nachricht, abgesehen von Flags und Vorgängen wie Kopieren, Verschieben oder Löschen.
Die IMAP-Erweiterung bietet die Funktion imap_timeout, um die Timeout-Sekunden für verschiedene Vorgänge anzupassen.
Die Implementierung der Erweiterung verknüpft die Funktionalität jedoch nicht mit einem bestimmten Kontext oder einer bestimmten Verbindung, sondern ist global. Um Funktionen außerhalb dieser Bibliothek nicht zu beeinträchtigen, mussten wir uns entscheiden, ob wir jeden imap_*
Aufruf um ein optionales, vom Benutzer bereitgestelltes Timeout herum umschließen oder diese Aufgabe dem Benutzer überlassen möchten.
Aufgrund der heterogenen Welt der IMAP-Server und der hohen Komplexitätskosten für einen so geringen Gewinn des ersteren haben wir uns für letzteres entschieden.
Die Mockability wird durch die für jede API vorhandenen Schnittstellen gewährleistet. Schauen Sie sich MockabilityTest an, um ein Beispiel für einen simulierten Workflow zu sehen.
Docker wird benötigt, um den Build auf Ihrem Computer auszuführen.
Der erste Befehl, den Sie ausführen müssen, ist make start-imap-server
, der einen IMAP-Server lokal startet.
Dann kann der lokale Build mit einem bloßen make
ausgelöst werden.
Wenn Sie die Entwicklung abgeschlossen haben, stoppen Sie den lokalen IMAP-Server mit make stop-imap-server
.