Sử dụng Laravel Imap để get Email

Trong trường hợp chúng ta cần sử dụng chức năng về email thông qua các Email Provider (Gmail, Yahoo, AOL, ...) Laravel Imap là 1 thư viện cung cấp cho chúng ta giải pháp với ưu điểm dễ dàng cài đặt và sử dụng.

Laravel Imap là cách đơn giản để tích hợp thư viện php vào trong ứng dụng sử dụng framework Laravel https://github.com/Webklex/laravel-imap

Cài đặt

  1. Nếu chưa cài đặt thư viện php-imap thì bạn có thể cài đặt bằng câu lệnh sau (dấu * là phiên bản php muốn cài đặt) :
sudo apt-get install php*-imap php*-mbstring php*-mcrypt && sudo apache2ctl graceful

Để chắc chắn thì bạn có thể sử dụng phpinfo() để kiểm tra xem thư viện đã được kích hoạt chưa

  1. Cài đặt Laravel imap package :
composer require webklex/laravel-imap

Trong trường hợp phiên bản Laravel <=5.4, bạn cần sửa lại file config/app.php như sau:

  • Thêm vào mảng providers
Webklex\IMAP\Providers\LaravelServiceProvider::class,
  • Thêm vào mảng aliases
'Client' => Webklex\IMAP\Facades\Client::class,
  1. Publish file config của package:
php artisan vendor:publish --provider="Webklex\IMAP\Providers\LaravelServiceProvider"

Cách sử dụng

Một số giao thức được hỗ trợ:

  • Imap (default)
  • pop3
  • nntp

Một số phương thức mã hóa được hỗ trợ:

  • false: không mã hóa
  • ssl
  • tls
  • starttls
  • notls

Ví dụ đơn giản chức năng kiểm tra đã kết nối thành công chưa với tài khoản AOL mail Ta có thể tạo một command trong laravel để kiểm tra, ở đây tôi tạo command email:get

use Webklex\IMAP\Client;

class GetMailService
{
    /* @var Client $client */
    protected $client;

    public function __construct(Client $client)
    {
        $this->client = $client;
    }

    /**
     * @return bool
     */
    public function testConnection() 
    {
        $client = $this->client->setConfig([
            'host' => 'imap.aol.com',
            'port' => 993,
            'encryption' => 'ssl',
            'validate_cert' => true,
            'username' => '[email protected]',
            'password' => '[email protected]',
            'protocol' => 'imap',
        ]);

        try {
            $client->connect();
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }

Lưu ý:

Đối với một số email providers (ví dụ như Gmail, Yahoo, AOL) bạn phải kích hoạt chức năng "Allow apps that use less secure sign in" mới có thể connect thành công. Zoho mail sẽ không cần làm như trên.

Ví dụ lấy ra các tin nhắn từ 1 hộp INBOX của một tài khoản

        try {
            $client->connect();
            $oFolder = $client->getFolder("INBOX"); // Lấy email từ folder INBOX

                $aMessage = $oFolder->messages()->all()->get();

// Với mỗi tin nhắn lấy ra 1 số thông số : tiêu đề, UID, nội dung text
                foreach($aMessage as $oMessage) {
                    echo 'Subject: ' . $oMessage->getSubject() . "\n";
                    echo 'UID: '.$oMessage->getUid() . "\n";
                    echo 'Text Body: ' . $oMessage->getTextBody() . "\n";
                }
        } catch (\Exception $e) {
            return false;
        }

Kết quả: Hình ảnh tại CLI

Hình ảnh hộp thư INBOX

Các phương thức mà Laravel - imap hỗ trợ bạn có thể tham khảo tại: https://github.com/Webklex/laravel-imap

Một số config với từng Email Providers:

AOL (including Verizon.net)
Server: imap.aol.com

Port: 993

Encryption: SSL/TLS
Gmail
Server: imap.gmail.com

Port: 993

Encryption: SSL/TLS
Yahoo!
Server: imap.mail.yahoo.com 

Port: 993

Encryption: SSL

Nguồn tham khảo: https://support.office.com/en-us/article/pop-and-imap-email-settings-for-outlook-8361e398-8af4-4e97-b147-6c6c4ac95353: