mnapoli/imapi

IMAP API

0.2.7 2018-01-30 17:44 UTC

This package is auto-updated.

Last update: 2024-09-19 20:55:36 UTC


README

这个库是实验性的,并不打算重用。

imapi 是 PHP 的一个高级 IMAP API。

它旨在与其他实现不同

  • 非常高级:你不需要知道 IMAP 的工作原理(因为 IMAP 非常糟糕)
  • 处理相关问题,如 解析 MIME 电子邮件内容清理电子邮件中的 HTML
  • 基于 Horde 的 IMAP 库,而不是 PHP 的 IMAP 扩展(下面解释)
  • 功能全面,同时为未覆盖的功能保留调用 Horde 库的低级别调用的入口
  • 维护(遗憾的是,IMAP 不是一个非常活跃的话题,许多优秀项目未完成或已死亡)

它不是基于 PHP 的 IMAP 扩展,而是基于令人惊叹的 Horde 库。原因在Horde 库页面上有很好的解释

与 PHP 的 imap (c-client) 扩展相比,Horde/Imap_Client 在速度、功能丰富性和可扩展性方面都显著更好。

不要被迷惑:几乎每一个所谓的“PHP IMAP 库”都不过是 imap 扩展的一个薄包装,所以这些库都不能解决该扩展的基本限制。

入门指南

composer require mnapoli/imapi

简单方法

$client = Imapi\Client::connect('imap.host.com', 'user', 'password');

如果您想要完全控制连接,您可以使用 Horde 的构造函数

$hordeClient = new Horde_Imap_Client_Socket([
    'username' => $username,
    'password' => $password,
    'hostspec' => $host,
    'port'     => '143',
    'secure'   => 'tls',
]);

$client = new Imapi\Client($hordeClient);

阅读

阅读收件箱

获取收件箱中的所有消息

$emails = $client->getEmails();

foreach ($emails as $email) {
    echo $email->getSubject();
}

是的,就这么简单。电子邮件是对象(Imapi\Email),它们公开了电子邮件的所有信息。

如果您需要将存储在本地与 IMAP 服务器同步的电子邮件,您可能不想获取电子邮件,即它们的内容。您只需要获取它们的 ID,这要快得多

$ids = $client->getEmailIds();

foreach ($ids as $id) {
    if (/* this email needs to be synced */) {
        $email = $client->getEmailFromId($id);
        // ...
    }
}

高级查询

getEmails()getEmailIds() 都可以接受一个可选的 Query 对象。

// Read from the `INBOX.Sent` folder
$query = QueryBuilder::create('INBOX.Sent')
    ->youngerThan(3600) // 1 hour
    ->flagSeen(true) // return messages with \\seen flag set, or false for messages with seen flag off. 
                     // more options are flagAnswered(boolean), flagDeleted(boolean),flagDraft(boolean),flagFlaged(boolean),flagRecent(boolean)
    ->getQuery();

$emails = $client->getEmails($query);

阅读文件夹

$folders = $client->getFolders();

操作

移动电子邮件

$emailIds = ['123', '456'];

// Moving from the INBOX to the Archive folder
$client->moveEmails($emailIds, 'INBOX', 'Archive');

删除电子邮件

“删除”只是将它们移动到垃圾箱文件夹。不幸的是,垃圾箱文件夹对每个提供商都是定制的,所以您需要明确提供它

$emailIds = ['123', '456'];

$client->deleteEmails($emailIds, 'Deleted Messages');