首页 > 解决方案 > 如何创建重置密码令牌并使用邮件而不是通知发送电子邮件?

问题描述

我有一个电子邮件控制器,我正在其中准备要发送的所有电子邮件。

当我发送电子邮件时,我通常使用如下方法:

class EmailController extends Controller
{
    public function messageReceived(Request $request)
    {
        $request->validate([
            'email' => 'email:rfc,dns',
            'body' => 'required',
        ]);
        Mail::to('john.doe@foo.com')->send(
            new MessageReceived(
                $request->email,
                $request->body
            )
        );
    }
}

对于我当前使用的重置密码电子邮件,我已将以下方法添加到此类:

public function resetPassword(Request $request)
{
    $request->validate(['email' => 'required|email|exists:myconnection.users,email']);

    $status = Password::broker('users:myconnection')->sendResetLink(
        $request->only('email')
    );

    return $status === Password::RESET_LINK_SENT
        ? response()->json(['status' => __($status)])
        : response()->json(['email' => __($status)]);
}

如何创建令牌并使用Mail::to()->send()而不是发送通知sendResetLink()

标签: laravellaravel-8

解决方案


Password你可以通过 Laravel 的门面手动生成密码重置令牌。

// populate user
$user = User::whereEmail($request->email)->first();

// generate token
$token = \Illuminate\Support\Facades\Password::getRepository()->create($user);

然后,您可以将令牌传递给自定义邮件程序。

$data = [
    'token' => $token,
    // ...
];

Mail::to($user)->send(new PasswordResetMailer($data));

回应您的评论:

您可以在生成令牌期间设置自定义代理。

$token = Password::broker('your_custom_broker')->getRepository()->create($user);

推荐阅读