Uma biblioteca PHP IMAP para ler e processar e-mails através do protocolo IMAP, construída com arquitetura robusta orientada a objetos.
Esta biblioteca requer PHP >= 8.3 com extensões IMAP, iconv e Multibyte String instaladas.
A forma recomendada de instalar a biblioteca IMAP é através do Composer:
$ compositor requer ddeboer/imap
Este comando requer que você tenha o Composer instalado globalmente, conforme explicado no capítulo de instalação da documentação do Composer.
use DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection é uma instância de DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password');
Você pode especificar porta, flags e parâmetros para o servidor:
$server = new Server($hostname, // porta necessária$, // o padrão é '993'$flags, // o padrão é '/imap/ssl/validate-cert'$parameters);
Recupere caixas de correio (também conhecidas como pastas de correio) do servidor de correio e itere sobre elas:
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// Ignorar caixas de correio somente para contêineres// @see https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($mailbox->getAttributes() & LATT_NOSELECT) {continuar; }// $mailbox é uma instância de DdeboerImapMailboxprintf('Caixa de correio "%s" tem %s mensagens', $mailbox->getName(), $mailbox->count()); }
Ou recupere uma caixa de correio específica:
$caixa de correio = $conexão->getMailbox('INBOX');
Excluir uma caixa de correio:
$conexão->deleteMailbox($caixa de correio);
Você pode definir ou limpar em massa qualquer sinalizador de mensagens de caixa de correio (por UIDs):
$mailbox->setFlag('Visto Sinalizado', ['1:5', '7', '9']);$mailbox->setFlag('Visto', '1,3,5,6: 8');$caixa de correio->clearFlag('Sinalizado', '1,3');
AVISO Você deve recuperar novas instâncias de mensagens em caso de sinalizadores de modificação em massa para atualizar os sinalizadores de mensagens individuais.
Recuperar mensagens (e-mails) de uma caixa de correio e iterá-las:
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message é uma instância de DdeboerImapMessage}
Para inserir uma nova mensagem (que acabou de ser enviada) na caixa de correio Enviados e sinalizá-la como vista:
$mailbox = $connection->getMailbox('Enviado');$mailbox->addMessage($messageMIME, 'Visto');
Observe que a mensagem deve ser uma string no formato MIME (conforme descrito na RFC2045).
use DdeboerImapSearchExpression;use DdeboerImapSearchEmailTo;use DdeboerImapSearchTextBody;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$mensagens = $caixa de correio->getMessages($pesquisa);
AVISO No momento, não podemos ter espaços e aspas duplas escapadas juntas. Atualmente, apenas os espaços são escapados corretamente. Você pode usar DdeboerImapSearchRawExpression
para escrever você mesmo a condição de pesquisa completa.
As mensagens também podem ser recuperadas classificadas de acordo com a função imap_sort:
$today = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // Critério de classificação true // Ordem decrescente);
Observe que a biblioteca PHP imap depende da biblioteca c-client
disponível em https://www.washington.edu/imap/ que não suporta totalmente alguns critérios de pesquisa IMAP4 como OR
. Se você deseja esses critérios não suportados, você precisa corrigir manualmente a versão mais recente ( imap-2007f
de 23 de julho de 2011 no momento deste commit) e recompilar o PHP em sua biblioteca c-client
corrigida.
A propósito, a maioria dos critérios de pesquisa comuns estão disponíveis e funcionando, navegue por eles em ./src/Search
.
Referências:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
e ./docs/internal.txt
Obtenha o número da mensagem e o ID exclusivo da mensagem no formato <...>:
$mensagem->getNumber();$mensagem->getId();
Obtenha outras propriedades da mensagem:
$mensagem->getSubject();$mensagem->getFrom(); // MessageEmailAddress$message->getTo(); // array de MessageEmailAddress$message->getDate(); // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
Obtenha cabeçalhos de mensagens como um objeto DdeboerImapMessageHeaders:
$mensagem->getHeaders();
Obtenha o corpo da mensagem como HTML ou texto simples (apenas a primeira parte):
$mensagem->getBodyHtml(); // Conteúdo da parte texto/html, if present$message->getBodyText(); // Conteúdo do texto/parte simples, se presente
Obtenha o corpo completo (todas as partes):
$corpo = $mensagem->getCompleteBodyHtml(); // Conteúdo da parte texto/html, if presentif ($body === null) { // Se body for nulo, não há partes HTML, então vamos tentar obter o texto body$body = $message->getCompleteBodyText() ; // Conteúdo do texto/parte simples, se presente}
Ler o corpo da mensagem mantém a mensagem invisível. Se você quiser marcar a mensagem como vista:
$mensagem->markAsSeen();
Ou você pode definir ou limpar qualquer sinalizador:
$message->setFlag('Visto Sinalizado');$message->clearFlag('Sinalizado');
Mover uma mensagem para outra caixa de correio:
$caixa de correio = $conexão->getMailbox('outra-caixa de correio');$mensagem->move($caixa de correio);
Excluindo mensagens:
$mailbox->getMessage(1)->delete();$mailbox->getMessage(2)->delete();$connection->expunge();
Obtenha anexos de mensagens (inline e anexados) e repita-os:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment é uma instância de DdeboerImapMessageAttachment}
Baixe um anexo de mensagem para um arquivo local:
// getDecodedContent() decodifica o conteúdo do anexo automaticamente:file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
Verifique se o anexo é uma mensagem incorporada e obtenha-o:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage é uma instância de DdeboerImapMessageEmbeddedMessage } }
Uma EmbeddedMessage possui a mesma API de uma mensagem normal, além de sinalizadores e operações como copiar, mover ou excluir.
A extensão IMAP fornece a função imap_timeout para ajustar os segundos de tempo limite para várias operações.
No entanto, a implementação da extensão não vincula a funcionalidade a um contexto ou conexão específica, mas sim global. Portanto, para não afetar as funcionalidades fora desta biblioteca, tivemos que escolher se agrupar cada chamada imap_*
em torno de um tempo limite opcional fornecido pelo usuário ou deixar essa tarefa para o usuário.
Devido ao mundo heterogêneo dos servidores IMAP e ao alto custo de carga de complexidade para um ganho tão pequeno dos primeiros, escolhemos o último.
A mockabilidade é concedida pelas interfaces presentes para cada API. Explore MockabilityTest para obter um exemplo de fluxo de trabalho simulado.
Docker é necessário para executar a compilação em seu computador.
O primeiro comando que você precisa executar é make start-imap-server
, que inicia um servidor IMAP localmente.
Então a construção local pode ser acionada com um simples make
.
Ao terminar o desenvolvimento, pare o servidor IMAP local com make stop-imap-server
.