こんにちは、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 の画面に表示させるところは違う記事で書きます。