学習

【Laravel】Laravelでメールサーバからメールを取得する

こんにちは、mihoka(@mihoka_work)です。

今回は Laravel を使って、gmail などのメールを取得する方法の学習メモです。

環境: Laravel 7.25.0

やりたいこと

Laravel の環境で gmailを取得して画面に表示させたい。
(メールを取得してタスク一覧などに入れる機能を作りたいのです。)

手順

  • laravel-imapを使う

Laravel-imap というライブラリが GitHub に公開されておりそれを使用しました。
もともとは php-imap というライブラリがありそれを Laravel用にカスタマイズしたもののようです。

手順はこちら

実際に実行した手順は最後に記載しています。

また、gmail を使用する場合は gmail 側で以下の手順が必要になります。

参考

今回調べたところ

phpinfo()で現在の構成を確認する

以下を記載する。

<?php phpinfo() ?>

出力結果に imap という項目が表示されればよい。

Laravel でバッチを作成する

make:command を実行。

$ php artisan make:command testCommand

app/Console/Command配下にファイルが作成される。
下記部分を実行するときの名前に書き換える。

[前] protected $signature = 'command:name';
[後] protected $signature = 'test1234';

composer の実行でエラー

下記コマンド実行時にエラーとなりました。

$ composer require webklex/laravel-imap
Installation failed, reverting ./composer.json to its original content.

原因

yum install でリポジトリを指定しないことが原因

Error: Package: php-mcrypt-5.4.16-9.el7.x86_64 (epel)
Requires: php(zend-abi) = 20100525-64
Installed: php-common-7.3.20-1.el7.remi.x86_64 (@remi-php73)
php(zend-abi) = 20180731-64
Available: php-common-5.4.16-48.el7.x86_64 (base)
php(zend-abi) = 20100525-64
<:>

リポジトリはパッケージの取得元のこと、と理解。

今回は PHP 7.3 の環境だったので、下記を指定しました。

$ sudo yum --enablerepo=epel,remi,remi-php73 install php*-imap php*-mbstring php*-mcrypt

storage 配下の権限でエラーになる

実行しようとするとエラーとなってしまいました。

PHP Fatal error: Uncaught UnexpectedValueException: The stream or file "/var/www/base_path/storage/logs/laravel-yyyy-mm-dd.log" could not be opened: failed to open stream: Permission denied

原因

nginx ユーザがログに書き込む権限がないよ、というエラー。

storage/logs/laravel.logだけでなく、 storage/framework/sessionsもエラーになったので権限を変更する。

$ ls -l storage/logs/laravel.log
-rw-r--r--. 1 centos nginx 779637 Sep 17 14:16 storage/logs/laravel.log

$ sudo chown nginx:nginx storage/logs/laravel.log

$ sudo chown -R nginx:nginx storage/framework/

$ ls -l storage/framework/sessions/
total 4
-rw-r--r--. 1 nginx nginx 247 Sep 17 13:53 L2P0gpGezTZ5VWmfBkXvCkZEao4TbjzP0E0dcUxE

(参考)下記は gmail からメール一覧を取得してバッチで表示するまでの手順です。

Laravel-imap のインストール

$ sudo yum --enablerepo=epel,remi,remi-php73 install php*-imap php*-mbstring php*-mcrypt
$ sudo systemctl restart nginx
$ sudo systemctl restart php-fpm

$ composer require webklex/laravel-imap

$ php artisan vendor:publish --provider="Webklex\IMAP\Providers\LaravelServiceProvider"Copied File [/ven

.env にimapの設定を記載

$ vi .env
----
IMAP_HOST=imap.gmail.com
IMAP_PORT=993
IMAP_ENCRYPTION=ssl
IMAP_VALIDATE_CERT=false
IMAP_USERNAME=testtest****@gmail.com ★取得したいメールアドレス
IMAP_PASSWORD=password1234 ★パスワードを記載
IMAP_PROTOCOL=imap
----

バッチの作成

$ php artisan make:command MailTestCommand
$ vi app/Console/Commands/MailTestCommand.php
----
<:>
protected $signature = 'test_mail';
<:>
----

※$signature にコマンド名(実行するときの名前)を書きます

こちらの記事を参考に MailTestCommand.php を記載しました。

バッチの実行

$php artisan test_mail
test gmail start
添付ファイル件数:0
件名:test
本文:test

添付ファイル件数:0
件名:gmail
本文:送ったよ!

test gmail end
$

ここまでできればメールサーバと接続できています。

これを Laravel の画面に表示させるところは違う記事で書きます。