smartilabs/laravel-imap

Laravel IMAP 客户端

2.2.0 2020-10-16 14:29 UTC

README

Latest Version on Packagist Software License Build Status Code quality Total Downloads Hits

描述

Laravel IMAP 是一种将原生 php-imap 模块和扩展的自定义 imap 协议集成到您的 Laravel 应用中的简单方法。这使得您的应用不仅能够响样新邮件,还可以读取和解析现有邮件以及更多功能。

如果您想在 Laravel 之外使用这个库,请访问 webklex/php-imap 以获取独立版本。

目录

文档

安装

1.) 通过运行以下命令安装 Laravel IMAP 包

composer require webklex/laravel-imap

1.1.) 如果您遇到错误或有其他问题,请按照步骤 1. - 1.1 在 此处 进行操作。

1.2.) 如果您在使用 v2.0.0 时遇到问题,请创建一个新问题,并尝试最新的 v1.6.2 版本

composer require webklex/laravel-imap:1.6.2

2.) 如果您正在使用 Laravel >= 5.5,包发现将自动配置服务提供者和 Client 别名。否则,对于 Laravel <= 5.4,编辑您的 config/app.php 文件并

  • providers 数组中添加以下内容
Webklex\IMAP\Providers\LaravelServiceProvider::class,
  • aliases 数组中添加以下内容
'Client' => Webklex\IMAP\Facades\Client::class,

3.) 运行以下命令发布包配置文件 config/imap.php

php artisan vendor:publish --provider="Webklex\IMAP\Providers\LaravelServiceProvider"

配置

如果您打算使用单个账户,您可能需要在您的 .env 文件中添加以下内容。

IMAP_HOST=somehost.com
IMAP_PORT=993
IMAP_ENCRYPTION=ssl
IMAP_VALIDATE_CERT=true
IMAP_USERNAME=root@example.com
IMAP_PASSWORD=secret
IMAP_DEFAULT_ACCOUNT=default
IMAP_PROTOCOL=imap

请参阅 webklex/php-imap#Configurationconfig/imap.php 以获取所有可用配置选项的详细列表。

用法

基本用法示例

这是一个基本示例,它将输出所有 imap 文件夹中的所有邮件,并将每条消息移动到 INBOX.read。请注意,这不应该在实际生活中进行测试,只是用来展示如何工作。

/** @var \Webklex\PHPIMAP\Client $client */
$client = \Webklex\IMAP\Facades\Client::make([
    'host'          => 'somehost.com',
    'port'          => 993,
    'encryption'    => 'ssl',
    'validate_cert' => true,
    'username'      => 'username',
    'password'      => 'password',
    'protocol'      => 'imap'
]);
/* Alternative by using the Facade
$client = Webklex\IMAP\Facades\Client::account('default');
*/

//Connect to the IMAP Server
$client->connect();

//Get all Mailboxes
/** @var \Webklex\PHPIMAP\Support\FolderCollection $folders */
$folders = $client->getFolders();

//Loop through every Mailbox
/** @var \Webklex\PHPIMAP\Folder $folder */
foreach($folders as $folder){

    //Get all Messages of the current Mailbox $folder
    /** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
    $messages = $folder->messages()->all()->get();
    
    /** @var \Webklex\PHPIMAP\Message $message */
    foreach($messages as $message){
        echo $message->getSubject().'<br />';
        echo 'Attachments: '.$message->getAttachments()->count().'<br />';
        echo $message->getHTMLBody();
        
        //Move the current Message to 'INBOX.read'
        if($message->moveToFolder('INBOX.read') == true){
            echo 'Message has ben moved';
        }else{
            echo 'Message could not be moved';
        }
    }
}

有关更多详细信息和其他示例,请参阅 webklex/php-imap#Table of Contents

门面

如果您使用的是 Facade \Webklex\IMAP\Facades\Client::class,请首先在 config/imap.php 中选择一个定义的账户,然后执行 Client::connect() 以建立已验证的连接

use Webklex\IMAP\Facades\Client;

/** @var \Webklex\PHPIMAP\Client $client */
$client = Client::account('default');
$client->connect();

视图示例

您可以在 /examples 下找到一些 blade 和 mask 示例。

Idle

每次收到新消息时,服务器都会通知客户端并返回新消息。

回调和 Webklex\IMAP\Events\MessageNewEvent($message) 事件在每封新邮件到来时都会被触发。

$timeout = 1200;
/** @var \Webklex\PHPIMAP\Folder $folder */
$folder->idle(function($message){
    /** @var \Webklex\PHPIMAP\Message $message */
    dump("new message", $message->subject);
}, $timeout);

oAuth

请参阅该维基文章了解gmail / google mail的设置。

基本oAuth示例

/** @var \Webklex\PHPIMAP\Client $client */
$client = \Webklex\IMAP\Facades\Client::make([
    'host'          => 'somehost.com',
    'port'          => 993,
    'encryption'    => 'ssl',
    'validate_cert' => true,
    'username'      => 'example@gmail.com',
    'password'      => 'ACCESS-TOKEN',
    'authentication' => "oauth",
    'protocol'      => 'imap'
]);

//Connect to the IMAP Server
$client->connect();

事件

以下事件可用

  • Webklex\IMAP\Events\MessageNewEvent($message) —— 可以由 Folder::idle 触发
  • Webklex\IMAP\Events\MessageDeletedEvent($message) —— 由 Message::delete 触发
  • Webklex\IMAP\Events\MessageRestoredEvent($message) —— 由 Message::restore 触发
  • Webklex\IMAP\Events\MessageMovedEvent($old_message, $new_message) —— 由 Message::move 触发
  • Webklex\IMAP\Events\MessageCopiedEvent($old_message, $new_message) —— 由 Message::copy 触发
  • Webklex\IMAP\Events\FlagNewEvent($flag) —— 由 Message::setFlag 触发
  • Webklex\IMAP\Events\FlagDeletedEvent($flag) —— 由 Message::unsetFlag 触发
  • Webklex\IMAP\Events\FolderNewEvent($folder) —— 可以由 Client::createFolder 触发
  • Webklex\IMAP\Events\FolderDeletedEvent($folder) —— 由 Folder::delete 触发
  • Webklex\IMAP\Events\FolderMovedEvent($old_folder, $new_folder) —— 由 Folder::move 触发

其他集成信息

命令

假设您想在服务器后台运行imap idle进程来自动处理新消息。以下示例将展示两种主要方式来实现这一目标

事件驱动

首先,将以下内容添加到您的 app/Console/Kernel.php 文件中

/**
 * The Artisan commands provided by your application.
 *
 * @var array
 */
protected $commands = [
    \Webklex\IMAP\Commands\ImapIdleCommand::class,
];

现在根据 laravel文档 描述注册一个事件监听器。如果您不使用默认账户,或者您想添加一些自己的魔法,您需要创建一个自定义命令(请参阅下一节)。

最后,通过以下命令测试该命令

php artisan imap:idle 

自定义命令

创建一个新文件,例如 app/Console/Commands/CustomImapIdleCommand.php,并添加以下内容

<?php
namespace App\Console\Commands;

use Webklex\IMAP\Commands\ImapIdleCommand;
use Webklex\PHPIMAP\Message;

class CustomImapIdleCommand extends ImapIdleCommand {

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'custom_command';

    /**
     * Holds the account information
     *
     * @var string|array $account
     */
    protected $account = "default";

    /**
     * Callback used for the idle command and triggered for every new received message
     * @param Message $message
     */
    public function onNewMessage(Message $message){
        $this->info("New message received: ".$message->subject);
    }

}

..并将以下内容添加到您的 app/Console/Kernel.php 文件中

/**
 * The Artisan commands provided by your application.
 *
 * @var array
 */
protected $commands = [
    \App\Console\Commands\CustomImapIdleCommand::class,
];

最后,通过以下命令测试该命令

php artisan custom_command

服务设置

可以通过创建以下服务文件来设置基本systemd服务

nano /etc/systemd/system/imap-idle.service

..并添加

[Unit]
Description=ImapIdle
After=multi-user.target 
After=syslog.target 
After=network-online.target

[Service]
Type=simple

User=www-data
Group=www-data

WorkingDirectory=/var/www/my_project
ExecStart=/var/www/my_project/artisan fetch:idle

Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

您现在可以通过运行以下命令来测试该服务

systemctl start imap-idle.service
systemctl status imap-idle.service
systemctl stop imap-idle.service
systemctl restart imap-idle.service

支持

如果您遇到任何问题或发现任何错误,请不要犹豫,创建一个新的 问题。然而,请意识到可能需要一些时间才能得到回答。

关于主题、粗鲁或侮辱性的问题将不予通知删除。

如果您需要 立即商业 支持,请随时通过 github@webklex.com 发送邮件。

一个小提醒

如果您在问题中编写源代码,请考虑正确格式化。这使得阅读变得更加容易,人们也更愿意评论并帮助 :)

```php

echo 'your php code...';

```

将转换为

echo 'your php code...';

功能 & pull requests

每个人都可以为此项目做出贡献。每个pull request都会被考虑,但也可能会被拒绝。为了防止不必要的劳动,如果您打算进行较大的更改,请先创建一个 功能问题。当然,如果您只是希望一个功能,您也可以创建一个新的 功能问题 ;)

已知问题

变更日志

请参阅 CHANGELOG 了解最近发生了什么更改。

安全

如果您发现任何与安全相关的问题,请通过电子邮件 github@webklex.com 而不是使用问题跟踪器。

致谢

支持者

特别感谢JetBrains通过他们的开源许可计划支持此项目。

Jetbrains

许可证

MIT许可(MIT)。请参阅许可文件获取更多信息。