web-dev-qa-db-ja.com

Laravel 5.7からのメール確認メールをカスタマイズする方法

Laravel 5.7にアップグレードしたばかりで、組み込みの電子メール検証を使用しています。しかし、私が理解できなかったことが2つあります。主な問題は、ユーザーに送信されるメールをカスタマイズして、メールを確認する方法です。また、ユーザーが電子メールを変更した場合、その電子メールの送信を開始する方法もわかりませんが、別のスレッド用に保存できます。

12
Wayne Fulcher

Laravel 5.7でメール検証を追加する場合、推奨される方法はIlluminate\Contracts\Auth\MustVerifyEmailを実装し、Illuminate\Auth\MustVerifyEmailモデルでApp\User特性を使用することです。

カスタム動作を行うには、メソッドsendEmailVerificationNotificationをオーバーライドして、メソッドnotifyを呼び出して作成されたユーザーに通知し、Notifications\MustVerifyEmailクラスの新しいインスタンスをパラメーターとして渡します。

ユーザーモデルのsendEmailVerificationNotificationメソッド内の$this->notify()にパラメーターとして渡されるカスタム通知を作成できます。

public function sendEmailVerificationNotification()
{
    $this->notify(new App\Notifications\CustomVerifyEmail);
}

...次にCustomVerifyEmail通知で、検証の処理方法を定義できます。カスタムverification.routeでメールを送信することで、作成したユーザーに通知できます。これは、必要なパラメーターを取得します。

メール確認通知プロセス

新しいユーザーがサインアップすると、Illuminate\Auth\Events\RegisteredイベントがApp\Http\Controllers\Auth\RegisterControllerで発行され、そのRegisteredイベントには、Illuminate\Auth\Listeners\SendEmailVerificationNotificationに登録されたApp\Providers\EventServiceProviderというリスナーがあります。

protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ]
];

SendEmailVerificationNotificationリスナーは、Laravelデフォルト認証App\Http\Controllers\Auth\RegisterControllernew Registered($user = $this->create($request->all()))にパラメーターとして渡される$ userが、特性の名前であるIlluminate\Contracts\Auth\MustVerifyEmailのインスタンスであるかどうかをチェックしますLaravelが示唆することは、デフォルトの電子メール検証を提供し、App\Userがまだ検証されていないことを確認するときに、$userモデルで使用されます。すべてが成功すると、そのユーザーでsendEmailVerificationNotificationメソッドが呼び出されます。

if ($event->user instanceof MustVerifyEmail && !$event->user->hasVerifiedEmail())   {
    $event->user->sendEmailVerificationNotification();
}
17
Yves Kipondo

これを行う簡単な方法は、次のドキュメントを使用して新しい通知を作成することだと思います。 https://laravel.com/docs/5.7/notifications#creating-notifications

次に、関数をオーバーライドします。

public function sendEmailVerificationNotification()
{
    $this->notify(new App\Notifications\CustomEmailNotification);
}

ユーザーモデル。

またはできる

php artisan vendor:publish --tag=laravel-notifications

これにより、テンプレートがresources/views/vendor/notificationsディレクトリにコピーされ、そこで変更できます。

9
Andrew Earls

すばやく簡単な方法:

php artisan vendor:publish --tag=laravel-notifications

次の場所に新しいファイルを作成しています。

\resources\views\vendor\notifications

これは、Laravelのメールプレートです。変更およびカスタマイズできます。

4
Tolga

Andrew Earlsの回答をわずかに踏まえて、このコマンドを使用して、アプリケーションで使用されるすべてのマークダウンメールコンポーネントを公開することもできます。

php artisan vendor:publish --tag=laravel-mail

これが完了すると、resources/views/vendor/mailで変更する一連のhtmlおよびmarkdownファイルが作成されます。これにより、メールの全体的なレイアウトを変更したり、CSSの「テーマ」を設定したりできます。 メールドキュメント-コンポーネントのカスタマイズ をよく読むことを強くお勧めします。

CSSテーマ

一般的なメールテーマのクイックスタート(Laravel 5.7)として、次のことができます。

  1. php artisan vendor:publish --tag=laravel-mailを使用してテーマを公開します。
  2. resources/views/vendor/mail/html/themes/default.cssを独自のファイルにコピーします。例:resources/views/vendor/mail/html/themes/wayne.css
  3. config/mail.phpを編集し、表示される'theme' => 'default''theme' => 'wayne'に変更します
  4. wayne.cssを編集して、メールのスタイルを変更します。

それが誰かを助けることを願っています。

1

残念ながら、送信されるこのメールは「ビュー」からのものではなく、実際にインラインで構築されるNotificationです。これは、送信する必要があるときに現在構築されている場所です:Illuminate\Auth\Notifications\VerifyEmail@toMail。この特定のクラスには静的なコールバックがあり、このコールバックを設定することで、この電子メールを作成する代わりに設定できます。

bootメソッドのサービスプロバイダーでは、このクラスにコールバックを割り当てる必要があります。

これが「似たような」何かが機能するかもしれません:

public function boot()
{
    \Illuminate\Auth\Notifications\VerifyEmail::toMailUsing(function ($notifiable) {

        // this is what is currently being done
        // adjust for your needs

        return (new \Illuminate\Notifications\Messages\MailMessage)
            ->subject(\Lang::getFromJson('Verify Email Address'))
            ->line(\Lang::getFromJson('Please click the button below to verify your email address.'))
            ->action(
                \Lang::getFromJson('Verify Email Address'),
                $this->verificationUrl($notifiable)
            )
            ->line(\Lang::getFromJson('If you did not create an account, no further action is required.'));

    });
}

これは通知であるため、カスタマイズのオプションがさらに必要です。

独自のNotificationクラスを使用する場合は、sendEmailVerificationNotificationUser)モデルのAuthenticatableメソッドをオーバーライドできます(これはMustVerifyEmail特性から) 。

2番目の質問:

必要なVerificationControllerApp\Http\Controllers\Auth\VerificationController)には、resend(特性VerifiesEmailsから)という名前のメソッドがあり、この目的に適しています。

Auth::routes(['verify' => true]);を介してこれらの検証ルートのルートを設定する必要があります

注意:

検証システムは、5.7のusersテーブルemail_verified_atのフィールドを使用してこれをマークします。このフィールドがあることを確認する必要があります。ユーザーが電子メールアドレスを変更すると、このnullを作成し、resendルートにリダイレクトして、新しい検証を送信できると思います。これにより、再検証するまで、「未検証」状態になります。

更新:

私たちは正しい道を進んでいたようです。私はこのSOの答えを見つけましたが、これは似たようなことを上回ります

laravel 5.7の確認メールのデフォルトの「件名」フィールドを変更する

1
lagbox

これらのファイルに移動します

  • vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php

  • vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php

そして、それをカスタマイズします。 vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.phpにコンストラクターを導入し、vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.phpを介して値を渡すこともできます。

例: Created my own constructorUtilized the user array values passed to the constructorPassing the constructor value from the

0

確認メールを送信するには、次のコードを使用するだけです。

 // send new verification email to user
 $user->sendEmailVerificationNotification();
0
Taras Chernata