Una biblioteca PHP IMAP para leer y procesar correos electrónicos a través del protocolo IMAP, construida con una robusta arquitectura orientada a objetos.
Esta biblioteca requiere PHP >= 8.3 con extensiones IMAP, iconv y Multibyte String instaladas.
La forma recomendada de instalar la biblioteca IMAP es a través de Composer:
$ compositor requiere ddeboer/imap
Este comando requiere que Composer esté instalado globalmente, como se explica en el capítulo de instalación de la documentación de Composer.
use DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection es una instancia de DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password');
Puede especificar puerto, banderas y parámetros para el servidor:
$servidor = new Server($nombre de host, // requerido$puerto, // por defecto es '993'$flags, // por defecto es '/imap/ssl/validate-cert'$parameters);
Recupere buzones de correo (también conocidos como carpetas de correo) del servidor de correo e itere sobre ellos:
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// Omitir buzones de correo solo de contenedor// @ver https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($buzón->getAttributes() & LATT_NOSELECT) {continuar; }// $mailbox es una instancia de DdeboerImapMailboxprintf('El buzón "%s" tiene %s mensajes', $mailbox->getName(), $mailbox->count()); }
O recuperar un buzón específico:
$buzón = $conexión->getMailbox('INBOX');
Eliminar un buzón:
$conexión->eliminarMailbox($buzón);
Puede configurar o borrar de forma masiva cualquier indicador de mensajes de buzón (por UID):
$buzón->setFlag('Visto Flagged', ['1:5', '7', '9']);$mailbox->setFlag('Visto', '1,3,5,6: 8');$buzón->clearFlag('Flagged', '1,3');
ADVERTENCIA Debe recuperar nuevas instancias de mensajes en caso de indicadores de modificación masiva para actualizar los indicadores de mensajes individuales.
Recuperar mensajes (correos electrónicos) de un buzón e iterarlos:
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message es una instancia de DdeboerImapMessage}
Para insertar un mensaje nuevo (que acaba de enviarse) en el buzón Enviados y marcarlo como se ve:
$buzón = $conexión->getMailbox('Enviado');$buzón->addMessage($messageMIME, 'Seen');
Tenga en cuenta que el mensaje debe ser una cadena en formato MIME (como se describe en RFC2045).
use DdeboerImapSearchExpression;use DdeboerImapSearchEmailTo;use DdeboerImapSearchTextBody;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$mensajes = $buzón->getMessages($búsqueda);
ADVERTENCIA Actualmente no podemos utilizar espacios y comillas dobles juntos. Actualmente, solo los espacios tienen escape correcto. Puede utilizar DdeboerImapSearchRawExpression
para escribir la condición de búsqueda completa usted mismo.
Los mensajes también se pueden recuperar ordenados según la función imap_sort:
$hoy = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // Criterio de clasificación verdadero // Orden descendente);
Tenga en cuenta que la biblioteca PHP imap se basa en la biblioteca c-client
disponible en https://www.washington.edu/imap/ que no es totalmente compatible con algunos criterios de búsqueda IMAP4 como OR
. Si desea esos criterios no compatibles, debe parchear manualmente la última versión ( imap-2007f
del 23 de julio de 2011 en el momento de esta confirmación) y volver a compilar PHP en su biblioteca c-client
parcheada.
Por cierto, la mayoría de los criterios de búsqueda comunes están disponibles y funcionan, búsquelos en ./src/Search
.
Referencias:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
y ./docs/internal.txt
Obtenga el número de mensaje y la identificación única del mensaje en el formulario <...>:
$mensaje->getNumber();$mensaje->getId();
Obtenga otras propiedades del mensaje:
$mensaje->getSubject();$mensaje->getFrom(); // Dirección de correo electrónico del mensaje$mensaje->getTo(); // matriz de MessageEmailAddress$message->getDate(); // DateTimeImmutable$mensaje->isAnswered();$mensaje->isDeleted();$mensaje->isDraft();$mensaje->isSeen();
Obtenga encabezados de mensajes como un objeto DdeboerImapMessageHeaders:
$mensaje->getHeaders();
Obtener el cuerpo del mensaje como HTML o texto sin formato (solo la primera parte):
$mensaje->getBodyHtml(); // Contenido de la parte texto/html, si está presente$message->getBodyText(); // Contenido del texto/parte simple, si está presente
Obtener el cuerpo completo (todas las partes):
$cuerpo = $mensaje->getCompleteBodyHtml(); // Contenido de la parte texto/html, si está presente ($body === null) { // Si el cuerpo es nulo, no hay partes HTML, así que intentemos obtener el texto body$body = $message->getCompleteBodyText() ; // Contenido del texto/parte simple, si está presente}
Leer el cuerpo del mensaje mantiene el mensaje como invisible. Si desea marcar el mensaje como visto:
$mensaje->markAsSeen();
O puede configurar o borrar cualquier indicador:
$mensaje->setFlag('Seen Flagged');$mensaje->clearFlag('Flagged');
Mover un mensaje a otro buzón:
$buzón = $conexión->getMailbox('otro-buzón');$mensaje->move($buzón);
Eliminar mensajes:
$buzón->getMessage(1)->delete();$buzón->getMessage(2)->delete();$conexión->borrar();
Obtenga archivos adjuntos de mensajes (tanto en línea como adjuntos) e itere sobre ellos:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment es una instancia de DdeboerImapMessageAttachment}
Descargue un archivo adjunto de mensaje a un archivo local:
// getDecodedContent() decodifica el contenido del archivo adjunto automáticamente:file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
Compruebe si el archivo adjunto es un mensaje incrustado y consígalo:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage es una instancia de DdeboerImapMessageEmbeddedMessage } }
Un EmbeddedMessage tiene la misma API que un mensaje normal, aparte de indicadores y operaciones como copiar, mover o eliminar.
La extensión IMAP proporciona la función imap_timeout para ajustar los segundos de tiempo de espera para diversas operaciones.
Sin embargo, la implementación de la extensión no vincula la funcionalidad a un contexto o conexión específica, sino que son globales. Entonces, para no afectar las funcionalidades fuera de esta biblioteca, tuvimos que elegir si ajustar cada llamada imap_*
a un tiempo de espera opcional proporcionado por el usuario o dejar esta tarea al usuario.
Debido al mundo heterogéneo de los servidores IMAP y al costo de carga de alta complejidad por una ganancia tan pequeña del primero, elegimos el segundo.
La simulabilidad la otorgan las interfaces presentes para cada API. Profundice en MockabilityTest para ver un ejemplo de un flujo de trabajo simulado.
Se necesita Docker para ejecutar la compilación en su computadora.
El primer comando que debe ejecutar es make start-imap-server
, que inicia un servidor IMAP localmente.
Luego, la compilación local se puede activar con un make
simple.
Cuando finalice el desarrollo, detenga el servidor IMAP local con make stop-imap-server
.