ddeboer/imap
最新稳定版本:1.23.0
Composer 安装命令:
composer require ddeboer/imap
包简介
Object-oriented IMAP for PHP
README 文档
README
A PHP IMAP library to read and process e-mails over IMAP protocol, built with robust Object-Oriented architecture.
This library requires PHP >= 8.4 with IMAP, iconv and Multibyte String extensions installed.
Installation
The recommended way to install the IMAP library is through Composer:
$ composer require ddeboer/imap
This command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation.
Usage
Connect and Authenticate
use Ddeboer\Imap\Server; $server = new Server('imap.gmail.com'); // $connection is instance of \Ddeboer\Imap\Connection $connection = $server->authenticate('my_username', 'my_password');
You can specify port, flags and parameters to the server:
$server = new Server( $hostname, // required $port, // defaults to '993' $flags, // defaults to '/imap/ssl/validate-cert' $parameters );
Mailboxes
Retrieve mailboxes (also known as mail folders) from the mail server and iterate over them:
$mailboxes = $connection->getMailboxes(); foreach ($mailboxes as $mailbox) { // Skip container-only mailboxes // @see https://secure.php.net/manual/en/function.imap-getmailboxes.php if ($mailbox->getAttributes() & \LATT_NOSELECT) { continue; } // $mailbox is instance of \Ddeboer\Imap\Mailbox printf('Mailbox "%s" has %s messages', $mailbox->getName(), $mailbox->count()); }
Or retrieve a specific mailbox:
$mailbox = $connection->getMailbox('INBOX');
Delete a mailbox:
$connection->deleteMailbox($mailbox);
You can bulk set, or clear, any flag of mailbox messages (by UIDs):
$mailbox->setFlag('\\Seen \\Flagged', ['1:5', '7', '9']); $mailbox->setFlag('\\Seen', '1,3,5,6:8'); $mailbox->clearFlag('\\Flagged', '1,3');
WARNING You must retrieve new Message instances in case of bulk modify flags to refresh the single Messages flags.
Messages
Retrieve messages (e-mails) from a mailbox and iterate over them:
$messages = $mailbox->getMessages(); foreach ($messages as $message) { // $message is instance of \Ddeboer\Imap\Message }
To insert a new message (that just has been sent) into the Sent mailbox and flag it as seen:
$mailbox = $connection->getMailbox('Sent'); $mailbox->addMessage($messageMIME, '\\Seen');
Note that the message should be a string at MIME format (as described in the RFC2045).
Searching for Messages
use Ddeboer\Imap\SearchExpression; use Ddeboer\Imap\Search\Email\To; use Ddeboer\Imap\Search\Text\Body; $search = new SearchExpression(); $search->addCondition(new To('me@here.com')); $search->addCondition(new Body('contents')); $messages = $mailbox->getMessages($search);
WARNING We are currently unable to have both spaces and double-quotes
escaped together. Only spaces are currently escaped correctly.
You can use Ddeboer\Imap\Search\RawExpression to write the complete search
condition by yourself.
Messages can also be retrieved sorted as per imap_sort function:
$today = new DateTimeImmutable(); $thirtyDaysAgo = $today->sub(new DateInterval('P30D')); $messages = $mailbox->getMessages( new Ddeboer\Imap\Search\Date\Since($thirtyDaysAgo), \SORTDATE, // Sort criteria true // Descending order );
Unknown search criterion: OR
Note that PHP imap library relies on the c-client library available at https://www.washington.edu/imap/
which doesn't fully support some IMAP4 search criteria like OR. If you want those unsupported criteria,
you need to manually patch the latest version (imap-2007f of 23-Jul-2011 at the time of this commit)
and recompile PHP onto your patched c-client library.
By the way most of the common search criteria are available and functioning, browse them in ./src/Search.
References:
- https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
- imap-2007f.tar.gz:
./src/c-client/mail.cand./docs/internal.txt
Message Properties and Operations
Get message number and unique message id in the form <...>:
$message->getNumber(); $message->getId();
Get other message properties:
$message->getSubject(); $message->getFrom(); // Message\EmailAddress $message->getTo(); // array of Message\EmailAddress $message->getDate(); // DateTimeImmutable $message->isAnswered(); $message->isDeleted(); $message->isDraft(); $message->isSeen();
Get message headers as a \Ddeboer\Imap\Message\Headers object:
$message->getHeaders();
Get message body as HTML or plain text (only first part):
$message->getBodyHtml(); // Content of text/html part, if present $message->getBodyText(); // Content of text/plain part, if present
Get complete body (all parts):
$body = $message->getCompleteBodyHtml(); // Content of text/html part, if present if ($body === null) { // If body is null, there are no HTML parts, so let's try getting the text body $body = $message->getCompleteBodyText(); // Content of text/plain part, if present }
Reading the message body keeps the message as unseen. If you want to mark the message as seen:
$message->markAsSeen();
Or you can set, or clear, any flag:
$message->setFlag('\\Seen \\Flagged'); $message->clearFlag('\\Flagged');
Move a message to another mailbox:
$mailbox = $connection->getMailbox('another-mailbox'); $message->move($mailbox);
Deleting messages:
$mailbox->getMessage(1)->delete(); $mailbox->getMessage(2)->delete(); $connection->expunge();
Message Attachments
Get message attachments (both inline and attached) and iterate over them:
$attachments = $message->getAttachments(); foreach ($attachments as $attachment) { // $attachment is instance of \Ddeboer\Imap\Message\Attachment }
Download a message attachment to a local file:
// getDecodedContent() decodes the attachment’s contents automatically: file_put_contents( '/my/local/dir/' . $attachment->getFilename(), $attachment->getDecodedContent() );
Embedded Messages
Check if attachment is embedded message and get it:
$attachments = $message->getAttachments(); foreach ($attachments as $attachment) { if ($attachment->isEmbeddedMessage()) { $embeddedMessage = $attachment->getEmbeddedMessage(); // $embeddedMessage is instance of \Ddeboer\Imap\Message\EmbeddedMessage } }
An EmbeddedMessage has the same API as a normal Message, apart from flags and operations like copy, move or delete.
Timeouts
The IMAP extension provides the imap_timeout function to adjust the timeout seconds for various operations.
However the extension's implementation doesn't link the functionality to a
specific context or connection, instead they are global. So in order to not
affect functionalities outside this library, we had to choose whether wrap
every imap_* call around an optional user-provided timeout or leave this
task to the user.
Because of the heterogeneous world of IMAP servers and the high complexity burden cost for such a little gain of the former, we chose the latter.
Mock the library
Mockability is granted by interfaces present for each API. Dig into MockabilityTest for an example of a mocked workflow.
Contributing: run the build locally
Docker is needed to run the build on your computer.
First command you need to run is make start-imap-server, which starts an IMAP server locally.
Then the local build can be triggered with a bare make.
When you finish the development, stop the local IMAP server with make stop-imap-server.
ddeboer/imap 适用场景与选型建议
ddeboer/imap 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 3.76M 次下载、GitHub Stars 达 912, 最近一次更新时间为 2012 年 07 月 29 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「mail」 「email」 「imap」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 ddeboer/imap 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 ddeboer/imap 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 ddeboer/imap 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
PHP class to access an IMAP mailbox. Specifically uses the Laminas library and not the IMAP extension.
yii2 extension to read and process mails from IMAP and PHP
IMAP client for PHP without php-imap extension dependency
Courier offers a convenient and painless solution for creating emails tailored for your Kirby website.
Mail libraries used by Zimbra Api
Laravel IMAP client
统计信息
- 总下载量: 3.76M
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 929
- 点击次数: 23
- 依赖项目数: 17
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2012-07-29