Une bibliothèque PHP IMAP pour lire et traiter les e-mails via le protocole IMAP, construite avec une architecture robuste orientée objet.
Cette bibliothèque nécessite PHP >= 8.3 avec les extensions IMAP, iconv et Multibyte String installées.
La méthode recommandée pour installer la bibliothèque IMAP consiste à utiliser Composer :
$ composer nécessite ddeboer/imap
Cette commande nécessite que Composer soit installé globalement, comme expliqué dans le chapitre d'installation de la documentation de Composer.
utilisez DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection est une instance de DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password');
Vous pouvez spécifier le port, les indicateurs et les paramètres du serveur :
$server = new Server($hostname, // requis$port, // par défaut '993'$flags, // par défaut '/imap/ssl/validate-cert'$parameters);
Récupérez les boîtes aux lettres (également appelées dossiers de messagerie) du serveur de messagerie et parcourez-les :
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// Ignorer les boîtes aux lettres réservées aux conteneurs// @see https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($mailbox->getAttributes() & LATT_NOSELECT) {continue ; }// $mailbox est une instance de DdeboerImapMailboxprintf('La boîte aux lettres "%s" contient %s messages', $mailbox->getName(), $mailbox->count()); }
Ou récupérer une boîte mail spécifique :
$mailbox = $connection->getMailbox('INBOX');
Supprimer une boîte aux lettres :
$connection->deleteMailbox($mailbox);
Vous pouvez définir ou effacer en masse n'importe quel indicateur de messages de boîte aux lettres (par UID) :
$mailbox->setFlag('Seen Flagged', ['1:5', '7', '9']);$mailbox->setFlag('Seen', '1,3,5,6: 8');$mailbox->clearFlag('Flagged', '1,3');
AVERTISSEMENT Vous devez récupérer de nouvelles instances de message en cas d'indicateurs de modification groupée pour actualiser les indicateurs de messages uniques.
Récupérer des messages (e-mails) d'une boîte aux lettres et les parcourir :
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message est une instance de DdeboerImapMessage}
Pour insérer un nouveau message (qui vient d'être envoyé) dans la boîte aux lettres Envoyés et le marquer comme vu :
$mailbox = $connection->getMailbox('Envoyé');$mailbox->addMessage($messageMIME, 'Seen');
Notez que le message doit être une chaîne au format MIME (comme décrit dans la RFC2045).
utiliser DdeboerImapSearchExpression;utiliser DdeboerImapSearchEmailTo;utiliser DdeboerImapSearchTextBody;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$messages = $mailbox->getMessages($search);
AVERTISSEMENT Nous ne pouvons actuellement pas faire échapper les espaces et les guillemets doubles ensemble. Seuls les espaces sont actuellement échappés correctement. Vous pouvez utiliser DdeboerImapSearchRawExpression
pour écrire vous-même la condition de recherche complète.
Les messages peuvent également être récupérés triés selon la fonction imap_sort :
$today = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // Trier les critèrestrue // Ordre décroissant);
Notez que la bibliothèque PHP imap s'appuie sur la bibliothèque c-client
disponible sur https://www.washington.edu/imap/ qui ne prend pas entièrement en charge certains critères de recherche IMAP4 comme OR
. Si vous souhaitez ces critères non pris en charge, vous devez corriger manuellement la dernière version ( imap-2007f
du 23 juillet 2011 au moment de cette validation) et recompiler PHP sur votre bibliothèque c-client
corrigée.
D'ailleurs, la plupart des critères de recherche courants sont disponibles et fonctionnent, parcourez-les dans ./src/Search
.
Références :
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz : ./src/c-client/mail.c
et ./docs/internal.txt
Obtenez le numéro du message et l'identifiant unique du message sous la forme <...> :
$message->getNumber();$message->getId();
Obtenez d'autres propriétés de message :
$message->getSubject();$message->getFrom(); // MessageEmailAddress$message->getTo(); // tableau de MessageEmailAddress$message->getDate(); // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
Obtenez les en-têtes de message en tant qu'objet DdeboerImapMessageHeaders :
$message->getHeaders();
Obtenez le corps du message au format HTML ou texte brut (première partie uniquement) :
$message->getBodyHtml(); // Contenu de la partie texte/html, si présent$message->getBodyText(); // Contenu du texte/partie brute, si présent
Obtenez le corps complet (toutes les parties) :
$body = $message->getCompleteBodyHtml(); // Contenu de la partie texte/html, si présentif ($body === null) { // Si le corps est nul, il n'y a pas de partie HTML, essayons donc d'obtenir le texte body$body = $message->getCompleteBodyText() ; // Contenu du texte/partie brute, si présent}
La lecture du corps du message permet de conserver le message invisible. Si vous souhaitez marquer le message comme vu :
$message->markAsSeen();
Ou vous pouvez définir ou supprimer n'importe quel indicateur :
$message->setFlag('Seen Flagged');$message->clearFlag('Flagged');
Déplacer un message vers une autre boîte aux lettres :
$mailbox = $connection->getMailbox('une autre-boîte aux lettres');$message->move($mailbox);
Suppression de messages :
$mailbox->getMessage(1)->delete();$mailbox->getMessage(2)->delete();$connection->expunge();
Obtenez les pièces jointes des messages (à la fois en ligne et en pièce jointe) et parcourez-les :
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment est une instance de DdeboerImapMessageAttachment}
Téléchargez une pièce jointe à un message dans un fichier local :
// getDecodedContent() décode automatiquement le contenu de la pièce jointe :file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
Vérifiez si la pièce jointe est un message intégré et récupérez-le :
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage est une instance de DdeboerImapMessageEmbeddedMessage } }
Un EmbeddedMessage a la même API qu'un message normal, à l'exception des indicateurs et des opérations telles que copier, déplacer ou supprimer.
L'extension IMAP fournit la fonction imap_timeout pour ajuster le délai d'expiration en secondes pour diverses opérations.
Cependant, l'implémentation de l'extension ne lie pas la fonctionnalité à un contexte ou une connexion spécifique, mais elle est globale. Ainsi, afin de ne pas affecter les fonctionnalités en dehors de cette bibliothèque, nous avons dû choisir d'envelopper chaque appel imap_*
autour d'un délai d'attente facultatif fourni par l'utilisateur ou de laisser cette tâche à l'utilisateur.
En raison du monde hétérogène des serveurs IMAP et du coût élevé de la complexité pour un si petit gain des premiers, nous avons choisi les seconds.
La moquerie est assurée par les interfaces présentes pour chaque API. Explorez MockabilityTest pour un exemple de flux de travail simulé.
Docker est nécessaire pour exécuter la build sur votre ordinateur.
La première commande que vous devez exécuter est make start-imap-server
, qui démarre un serveur IMAP localement.
Ensuite, la construction locale peut être déclenchée avec un simple make
.
Lorsque vous avez terminé le développement, arrêtez le serveur IMAP local avec make stop-imap-server
.