fglueck/php-imap

管理邮箱,过滤/获取/删除 PHP 中的电子邮件(支持 IMAP/POP3/NNTP)

4.1.2 2022-10-31 15:17 UTC

README

GitHub release Supported PHP Version Software License Packagist

CI PHP Unit Tests CI PHP Static Analysis CI PHP Code Coverage

Maintainability Test Coverage Type Coverage

PHP IMAP 邮箱库最初于 2012 年 12 月发布,是一个强大且开源的库,可以通过 PHP IMAP 扩展连接到邮箱,支持 POP3、IMAP 和 NNTP。这个库允许您从您的电子邮件服务器获取电子邮件。扩展功能或创建强大的 Web 应用程序来处理您的入站电子邮件。

特性

  • 通过 PHP IMAP 扩展 连接到邮箱(POP3/IMAP/NNTP)
  • 获取带有附件和内联图像的电子邮件
  • 通过自定义标准获取或排序的电子邮件
  • 标记电子邮件为已读/未读
  • 删除电子邮件
  • 管理邮箱文件夹

要求

  • PHP fileinfo 扩展必须存在;因此请确保您的 php.ini 文件中此行处于活动状态:extension=php_fileinfo.dll
  • PHP iconv 扩展必须存在;因此请确保您的 php.ini 文件中此行处于活动状态:extension=php_iconv.dll
  • PHP imap 扩展必须存在;因此请确保您的 php.ini 文件中此行处于活动状态:extension=php_imap.dll
  • PHP mbstring 扩展必须存在;因此请确保您的 php.ini 文件中此行处于活动状态:extension=php_mbstring.dll
  • PHP json 扩展必须存在;因此请确保您的 php.ini 文件中此行处于活动状态:extension=json.dll

通过 Composer 安装

安装最新的可用版本发布

$ composer require php-imap/php-imap

master 安装最新的可用和稳定源代码,这可能尚未发布/标记

$ composer require php-imap/php-imap:dev-master

运行测试

在您可以运行任何测试之前,您可能需要运行 composer install 来安装所有(开发)依赖项。

运行所有测试

您可以通过运行以下命令(在已安装的 php-imap 目录中)来运行所有可用的测试:composer run tests

仅运行 PHPUnit 测试

您可以通过运行以下命令(在已安装的 php-imap 目录中)来运行所有 PHPUnit 测试:php vendor/bin/phpunit --testdox

与框架的集成

入门示例

下面,您将找到如何使用此库的示例代码。有关更多信息和其他示例,您可以查看 wiki

默认情况下,此库使用随机文件名作为附件,因为来自其他电子邮件的相同文件名会覆盖其他附件。如果您想保留原始文件名,可以将附件文件名模式设置为 true,但这时您也需要确保这些文件不会被其他电子邮件覆盖,例如。

// Create PhpImap\Mailbox instance for all further actions
$mailbox = new PhpImap\Mailbox(
	'{imap.gmail.com:993/imap/ssl}INBOX', // IMAP server and mailbox folder
	'some@gmail.com', // Username for the before configured mailbox
	'*********', // Password for the before configured username
	__DIR__, // Directory, where attachments will be saved (optional)
	'UTF-8', // Server encoding (optional)
    true, // Trim leading/ending whitespaces of IMAP path (optional)
    false // Attachment filename mode (optional; false = random filename; true = original filename)
);

// set some connection arguments (if appropriate)
$mailbox->setConnectionArgs(
    CL_EXPUNGE // expunge deleted mails upon mailbox close
    | OP_SECURE // don't do non-secure authentication
);

try {
	// Get all emails (messages)
	// PHP.net imap_search criteria: https://php.ac.cn/manual/en/function.imap-search.php
	$mailsIds = $mailbox->searchMailbox('ALL');
} catch(PhpImap\Exceptions\ConnectionException $ex) {
	echo "IMAP connection failed: " . implode(",", $ex->getErrors('all'));
	die();
}

// If $mailsIds is empty, no emails could be found
if(!$mailsIds) {
	die('Mailbox is empty');
}

// Get the first message
// If '__DIR__' was defined in the first line, it will automatically
// save all attachments to the specified directory
$mail = $mailbox->getMail($mailsIds[0]);

// Show, if $mail has one or more attachments
echo "\nMail has attachments? ";
if($mail->hasAttachments()) {
	echo "Yes\n";
} else {
	echo "No\n";
}

// Print all information of $mail
print_r($mail);

// Print all attachements of $mail
echo "\n\nAttachments:\n";
print_r($mail->getAttachments());

方法 imap() 允许在实例上下文中调用任何 PHP IMAP 函数。示例

// Call imap_check() - see https://php.ac.cn/manual/function.imap-check.php
$info = $mailbox->imap('check');


// Show current time for the mailbox
$currentServerTime = isset($info->Date) && $info->Date ? date('Y-m-d H:i:s', strtotime($info->Date)) : 'Unknown';

echo $currentServerTime;

某些请求需要大量时间和资源

// If you don't need to grab attachments you can significantly increase performance of your application
$mailbox->setAttachmentsIgnore(true);

// get the list of folders/mailboxes
$folders = $mailbox->getMailboxes('*');

// loop through mailboxs
foreach($folders as $folder) {

	// switch to particular mailbox
	$mailbox->switchMailbox($folder['fullpath']);

	// search in particular mailbox
	$mails_ids[$folder['fullpath']] = $mailbox->searchMailbox('SINCE "1 Jan 2018" BEFORE "28 Jan 2018"');
}

print_r($mails_ids);

从 3.x 升级

在 3.1 之前,Mailbox 使用了一个“魔法”方法(Mailbox::imap()),而现在的类 Imap 执行其目的,通过自动编码/解码参数和返回值调用许多 imap_* 函数

之前

    public function checkMailbox()
    {
        return $this->imap('check');
    }

之后

    public function checkMailbox(): object
    {
        return Imap::check($this->getImapStream());
    }

推荐