2019/08/22これでLaravelメール送信が完全にわかるこれからLaravelを使用してメールを送信したいという入門者を対象にできるだけ詳細にLaravelでのメール送信設定の解説を行っています。5.3以降に追加されたMailableクラスを使った方法しか最近のバージョンのマニュアルは記載がないので、最初はLaravel5.2のマニュアルを参考にシンプルな形でメールの送信確認を行います。Mailableクラスが難しいわけではなく入門者にとっては複数のクラスを使用しないほうが理解するのが簡単なため、こちらの方法を先に紹介しています。コントローラーの作成メール送信の動作確認を行うためにweb.phpに/mailを追加します。/mailにアクセスがあった場合の処理はMailSendController.phpコントローラーに記述します。artisanコマンドで作成します。MailSendController作成したMailSendController.phpに下記を記述します。mailのメールを送信する設定を行なっています。}}MailファサードについてMailファサードのsendメソッドは下記のように3つの引数を取ることができます。callback);view_nameは、メールの本文の内容を記述するビューの名前です。htmlタグが使えます。dataはビューに渡す変数です。callbackはメッセージインスタンスを受け取るクロージャ()です。subjectなどのメソッドを持っています。詳しくはメッセージインスタンスのマニュアルを確認してください。toにはメールの送信先、subjectにはメールの件名を設定しています。resourceの下にviews/emailsディレクトリ、その下にtest.blade.phpファイルを作成してメールの本文の内容を記述します。<p>テストメールの送信です。</p>送信内容をログへ書き出しメールの送信設定(サーバやメールアカウント)を行わなければいけませんが、サーバからのメール送信になると不安になる人もいると思うので、まずはLaravelのログにメール内容を表示させる設定を行います。Laravelの環境設定ファイルである.envファイルを開いてMAIL_DRIVERをデフォルトのsmtpからlogに変更してください。serveで開発用サーバを起動します。config:cacheコマンドを実施してください。サーバが起動したら、/mailにアクセスしてください。そのあと画面に何も表示されなければ/storage/logsの下にあるlaravel-日付.logファイルを開いてください。laravel-日付.logファイルに下記のように送信されたメールの内容が表示されているか確認してください。FromのExample<hello@example.com>以外は設定した内容になっていることが確認できます。その他に送信するメールのContent-Typeからhtmlメールであることと文字コードはutf-8であることがわかります。quoted-printable<p>テストメールの送信です。</p>実際のメールサーバを利用した送信ログへのメール内容の書き出しが正常に行われることが確認できたので、実際にメールを送信します。送信するメールサーバ、ユーザアカウント、パスワードの情報が必要になります。それらの情報は環境によって異なるため、管理者に確認を行う必要があります。それらの情報を.envファイルのメール関連のパラメータを使って設定します。config:cacheを実行してください。MAIL_DRIVER=smtpMAIL_HOST=XXXXX.jpMAIL_PORT=587MAIL_USERNAME=XXXXX@XXXXX.co.jpMAIL_PASSWORD=XXXXXMAIL_ENCRYPTION=null.envファイル設定後、MailSendControllerに設定したtoのメールアドレスも実在するメールアドレスに変更を行なってください。ここで利用するサーバの情報はMAIL_ENCRYPTIONも含めOUTLOOKなど普段使用しているメールクライアントソフトで設定しているものと同じです。Laravelのための特別な設定ではありません。ブラウザから/mailにアクセスするとメールが送信されます。メールが受信されているか確認を行なってください。メールの送信元のFromがhello@example.comになっているので、MailSendCotrollerにfromメソッドを追加する必要があります。再度メールを送信するとFromも設定値が反映されていることを確認することができます。mail');Fromのデフォルト値はconfig/mail.phpに記述されています。.envにMAIL_FROM_ADDRESSとMAIL_FROM_NAMEを追加し指定することでFromのメールアドレスを固定することができます。'Example'),],Gmailを利用したメール送信Gmailのsmtpを利用してLaravelからメールを送信することができます。Gmailを利用するために安全性の低いアプリのアクセス許可をオンにする設定するか2段階認証を利用する方法があります。どちらも説明しますが、設定が簡易は安全性の低いアプリのアクセス許可をオンにするのはGoogleでは推奨されていません。安全性の低いアプリのアクセス許可による送信.envファイルをGmailのアカウント情報に変更する必要があります。MAIL_USERNAMEとMAIL_PASSWORDは各自のGmailアカウントの情報となります。MAIL_DRIVER=smtpMAIL_HOST=smtp.gmail.comMAIL_PORT=465MAIL_USERNAME=XXXXX@gmail.comMAIL_PASSWORD=XXXXXXXXMAIL_ENCRYPTION=ssl上記の設定でメールの送信を行うとエラーが発生し、Googleアカウントのメールボックスには重大なセキュリティ通知という件名で下記のようなメールが届きます。Laravel側にもエラーが発生しており、メール送信は失敗しています。ログインのブロックつまり、smtp経由で設定した情報でログインを試みようとしていますが、ログインする前にGmailによりログインがはじかれています。Gmailログインブロックアクティビティを確認をクリックして、はい、心当たりがありますをクリックしておきます。Laravelで接続設定をしただけでは不審なアプリと判断され、ログインが許可されません。許可を与えるためにセキュリティの設定を変更する必要があります。ログインブロックに対応Gmailのセキュリティ設定Gmailのアカウントの設定からセキュリティを選択し、安全性の低いアプリのアクセスの設定画面を開きます。デフォルトではオフになっているので、オンにする必要があります。アクセスを有効にする(非推奨)をクリックしてください。安全性の低いアプリの設定をONONにするとGmailに先ほどと同じように重大なセキュリティ通知メールが届きます。内容は、安全性の低いアプリのアクセスが有効になりましたという設定変更の通知です。アクティビティを確認して、はい、心当たりがありますを選択してください。これで安全性の低いアプリのアクセスがONになったので、メールを送信することができます。テストの動作確認で安全性の低いアプリのアクセスをONにした場合は動作確認完了後、OFFに戻してください。次の2段階認証設定を利用する場合もこの設定は必要ないので、OFFに戻しておいてください。2段階認証設定によるメールの送信Gmailにログインする際の2段階認証の設定を行っていない人は下記のように2段階認証プロセスがオフになっています。2段階認証の設定確認オフの場合は設定をオンにする必要があります。詳しい説明はここでは行いませんが、設定をオンにしてください。オンにしていない人はLaravelからメール送信をするしないに関わらずセキュリティのことを考えるとオンにしておきましょう。設定には電話番号が必要になります。設定が完了すると2段階認証プロセスがオンになり、アプリパスワードという項目が表示されます。2段階認証がオンになった画面アプリパスワードを選択してください。アプリケーションパスワード設定アプリの選択をメールにし、デバイスの選択に任意の名前をつけて生成ボタンをクリックすると16桁のパスワードが表示されます。使い方をしっかり読んでください。16桁のアプリケーションパスワードLaravelの.envファイルを開いて、先程設定していたUSER_PASSWODの設定をこの16桁のパスワードに変更します。config:cacheを実行されば、Gmailからメールを送信することができます。経由していメールを送信する場合、fromで設定していたメールアドレスはGmailのメールアカウントのXXXXX@gmail.comで送信されます。Gmailの設定で他のメールアドレスを追加することで変更できそうですが、未実施のため変更方法はできないかもしれません。Mailableクラスを使用したメール送信Mailableクラスの作成Mailableクラスを利用してメールの送信を行います。make:mailコマンドで作成します。successfullyMaiableファイルはapp¥Mailディレクトリの下に作成され、中身は下記の通りです。}}これまでと全く同じ内容のテストメールを送るため、SendTestMail.phpのbuildメソッドを下記のように書き換えます。mail');}MailSendController.phpでは以下のように書き換えが必要になります。}}この設定でブラウザで/mailにアクセスするとメールが送信されます。テキストメールこれまではメールを送信する時にviewメソッドでビューファイルを指定し、htmlとして送信を行っていましたがテキストメールでも送信を行うことができます。viewメソッドをtextメソッドに変更して、ビューのファイルの内容をテキスト形式に変更します。mail');}views/emailsの下にtest_text.blade.phpファイルを作成し下記を記述します。mailこれは初めてのメールです。メールクライアントで見ると改行も行われて記述どおりの内容が送信されていることが確認できます。メールクライアントで確認ヘッダーのcontent-typeを確認するとtext/plainであることも確認できます。HTMLメールだとcontent-typeはtext/htmlになります。textとhtmlのマルチパートでも送ることができます。mail');}受信したメールクライアントでヘッダーのContent-Typeを確認し、multipart/alternativeになっていればhtmlとtext形式どちらでも送信されていることが確認できます。一度に複数人の人にメールを送信する場合は下記のように配列を使用します。SendTestMail());メールにエイリアスをつけたい場合は次のように行うことができます。],];$toにはcollectionを使用することができます。usersテーブルから取得したユーザ情報をそのまま$toに渡すことができます。SendTestMail());usersテーブルには、ユーザの登録が必要です。ここではUser::all()を使用していますが、実際はwhere句を利用して送信するユーザを選択してください。usersテーブルのemail、nameの列が使用されます。bccやccについては、Mailableクラスの中で設定を行いますが、設定方法はtoの場合と同じです。->bcc('XXX@XXXXXX');}ビューに変数を渡すデータベースに保存されたテーブルから取得したデータをメールの内容に渡すためには変数を利用する必要があります。usersテーブルに登録されたユーザ情報を利用して動作確認を行います。変数は、MailableクラスのSendTestMailをインスタンス化する時に渡すことができます。SendTestMail($user));SendTestMailのbuildメソッドでwithを利用して変数を渡します。}}を利用して値を展開することができます。}}からのログインが確認されました。ご本人によるアクセスか確認してください。}}の中に$user->nameと$user->emailの値に置き換えられて送信されます。ローカルファイルを添付するローカルファイルに保存されているファイルを添付する方法を確認します。ローカルのファイルを添付するためには、事前にファイルをローカルに保存しておく必要があります。Laravelでのファイルのアップロード方法を知りたい場合は、下記を参照してください。あわせて読みたいLaravelでファイルをアップロードする方法を詳細解説アップロードしたファイルの保存先はstorage/appの下なのでその直下のpdfディレクトリに添付するファイルが保存されている状態で話を進めます。メールにファイルを添付するためには、attachメソッドを追加します。attachメソッドに添付するファイルのパスを設定することでメールへのファイル添付を行うことができます。SendTestMailのbuildメソッドでattachを利用してファイルを添付します。->attach(storage_path('app/pdf/test_1.pdf'));}上記ではLaravelのhelper関数のstorage_pathを利用してファイルのパスを設定しています。storage_pathの戻り値は各環境で異なりますが、storageまでのフルパスを取得することができます。pdfファイルはstorage/app/pdfの下に保存されているので、storage(‘app/pdf/test_1.pdf’)を設定しています。storage_pathがどこの場所のパスなのかわからない場合は、dd(storage_path(”))を実行して確かめてください。メールを送信するとファイルが添付されて送られます。.envファイルのMAIL_DRIVERをlogに設定してログを見るとPDFの場合は下記のようにファイルの内容がテキストで表示されます。ファイルの内容によってはかなりの行になります。>>複数のファイルを添付する複数のファイルをメールに添付したい場合は複数のattachをつけることで対応することができます。->attach(storage_path('app/pdf/test_2.pdf'));}さらにファイルを添付したいという場合にはattachを増やしていくのは現実的ではありません。foreachを組み合わせて添付を行います。下の例では$filesの配列をパスを入れているのでattachよりよくなっているわけではございません。foreachを展開する点に値注目してください。これは配列だけではなくテーブルから取得したcollectionでも活用できます。複数のファイルを添付する。