Lumenでメールを送る

Lumenでは、メールの送信機能がデフォルトで入っていません。Composerでインストールするのですが、そこから実際の送信処理までにかなりハマったので、ハマったポイントと解決方法を残しておきます。

Composerでインストール

Lumenを使っているなら、Composerは入っているはずなので、ターミナルなどから、下記のコマンドを実行します。

composer require illuminate/mail

自分が参考にした記事では、

composer require illuminate\mail

と、バックスラッシュになっていますが、エラーになります。
普通のスラッシュでOKです。

設定を書き換える

インストールしたMailクラスを呼び出すために、いくつか設定ファイルを書き換えます。

bootstrap/app.php

.
.
.
$app->withFacades();
.
.
$app->register(App\Providers\AppServiceProvider::class);

のこの二つのコメントアウトを外します。(自分のケースでは、セッションを使うためにすでにコメントアウトを外してました)

app/Providers/AppServiceProvider.php

public function register()
    {
       // 追記する-->
        $this->app->singleton('mailer', function ($app) { 
            $app->configure('services'); 
            return $app->loadComponent('mail', 'Illuminate\Mail\MailServiceProvider', 'mailer'); 
        });
       // <--追記する
    }

設定ファイルを追加する

続いて、メールサーバーの設定を記述するファイルを用意します。

config/mail.php

Laravelとは違い、Lumenではデフォルトでconfigディレクトリがないので作成します。

<?php

return [
    'driver' => env('MAIL_DRIVER', 'smtp'),
    'host' => env('MAIL_HOST', 'smtp.hogehoge.com'),// <-- 書き換え
    'port' => env('MAIL_PORT', 587),
    'from' => [
        'address' => 'hello@hogehoge.com',// <-- 書き換え
        'name' => 'Example',// <-- 書き換え
    ],
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_USERNAME', 'メールのユーザー名'),// <-- 書き換え
    'password' => env('MAIL_PASSWORD', 'パスワード'),// <-- 書き換え
    'sendmail' => '/usr/sbin/sendmail -bs',
];

メール送信のコントローラ内での書き方

ここまでの設定自体はサクッと行くのですが、いざコントローラ側でMailクラスを呼び出してみると、

Class 'Mail' not found

と怒られて呼び出せません。

Mailクラスの読み出し方法

ネット上の例では、呼び出し方が色々提案されていましたが、自分の環境では下記の例のみ有効でした。

OKだったやつ

use Illuminate\Support\Facades\Mail;

ダメだったやつ

use Mail
use Mailer
use Illuminate\Mail\Mailer;
use Illuminate\Mail\Mailer as Mailer;
use Illuminate\Contracts\Mail\Mailer;

実際に送信してみる

やっとMailクラスを参照できたと思ったら、ここもはまりポイントでした。

ネット上では、
– MailじゃなくてMailerにしろ
– Mailじゃなくて、\Mailにしろ

という提案が見られましたが、

Mailer::send() should not be called statically [duplicate]

と怒られたり、結構はまりました。

結果的に、Githubに上がっていた設定を元にしたらできました。

OKだったやつ

ここのまんまです。

変数「$mail_honbun」は、メール本文です。



use Illuminate\Support\Facades\Mail;
.
.
.
class MailController extends Controller
{
.
.
.
.
.
    Mail::raw($mail_honbun, function($msg) { 
        $msg->to(['mailto@hogehoge.com']); 
        $msg->from(['mailfrom@fugafuga.com']);
        $msg->subject("メール件名");
    });
}

これで無事に送信ができました。

ダメだったやつ (その1)

Mailer::send('emails.notify', [], function ($message)
{
    $message->from('mailfrom@fugafuga.com', '差出人')
            ->to('mailto@hogehoge.com')
            ->subject('メール件名');
});             

ダメだったやつ (その2)

\Mailer::send('emails.notify', array('name' => '差出人'), function($message) {
    $message->to('mailto@hogehoge.com')
            ->subject('メール件名);
}); 

参考サイト

内容的には、こちらの記事「Lumen、いろいろハマるところ」の通りでいけます。

ただし、コントローラで送信する部分が自分の環境ではエラーが出ました。


Lumenはいろんな設定が散らばって書かれているので、どの部分に依存しているかによってエラーが違います。今回紹介した自分の方法で必ずしも成功しないかもしれませんが、何かの参考になれば幸いです。