首页 > 解决方案 > 从 2 个不同的邮件类和 laravel 发送电子邮件会引发错误

问题描述

我正在发送两封不同的电子邮件。一个来自 VerifyMail,另一个来自 ForgetEmail,但 laravel 抛出 VerifyMail 不退出的错误。当我没有添加 ForgetMail 类时,它工作得很好。这是我使用 VerifyMail 的代码

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\User;
use App\VerifyUser;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Carbon;
use App\Mail\VerifyMail;

class UserRegisterController extends Controller
{
    public function __construct()
    {
        $this->middleware('guest:user');
    }

    public function showRegisterForm() {
        return view('user.registerForm');
    }

    public function register(Request $request) {
        $userValidated = $this->validate($request, [
            'name' => 'required|string',
            'email' => 'required|string|unique:users',
            'password' => 'required|string|min:6|confirmed'
        ]);

        $register = [
            'name' => $userValidated['name'],
            'email' => $userValidated['email'],
            'password' => Hash::make($userValidated['password']),
        ];

        $user =User::create($register);
        VerifyUser::create([
            'token' => str::random(60),
            'user_id' => $user->id,
        ]);
        Mail::to($user->email)->send(new VerifyMail($user));

        return redirect('user/login')->with('email', 'An email was sent to you for verification');
    }

    public function verifyEmail($token, $date) {
        $dates = date(strtotime($date));
        if(time() - $dates > 60 * 60) {
            return redirect('/user/login')->with('failed' , 'Oops! Something went wrong');
        }
        $verifiedUser = VerifyUser::where('token', $token)->first();
        if(isset($verifiedUser)) {
            $user = $verifiedUser->user;
            if($user->email_verified_at == '') {
                $user->email_verified_at = carbon::now();
                $user->save();

                return redirect('/user/login')->with('success', 'Your email was successfully verified');
            } else {
                return redirect('/user/login')->with('failed' , 'Oops! Something went wrong');
            }
        }
    }
}

这是我使用 ForgetEmail 的代码

    <?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
// use Symfony\Component\HttpFoundation\Session\Session;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\Session;
use App\ForgetPassword;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Mail;
use App\Mail\ForgetEmail;
use App\User;
use Illuminate\Support\Facades\Hash;

class UserLoginController extends Controller
{
    protected $guard;
    use AuthenticatesUsers;

    public function __construct()
    {
        $this->middleware('guest:user')->except('logout');
        $this->guard = Auth::guard('user');
    }

    public function showLoginForm()
    {
        return view('user.login');
    }

    public function forgetPasswordForm() {
        return view('user.forget');
    }

    public function passwordResetForm($id) {
        $user = User::where('id', $id)->first();
        return view('user.resetForm', ['id' => $id]);
    }

    public function userLogin(Request $request) {
        $validated = $this->validate($request, [
            'email' => 'required|email',
            'password' => 'required|min:6',
        ]);

        if(Auth::guard('user')->attempt(['email' => $validated['email'], 'password' => $validated['password']], $request->remember)) {
            $user = Auth::guard('user')->user();
            if($user->email_verified_at != null) {
                return redirect()->route('user.dashboard');
            } else {
                $this->logout($msg = 1);
            }
        }
        return redirect()->back();
    }

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

        $forgetPass = User::where('email', $email['email'])->first();
        $forgetArray = array(
            'user_id' => $forgetPass->id,
            'token' => str::random(60),
        );
        $forgetPassword = ForgetPassword::create($forgetArray);
        Mail::to($email['email'])->send(new ForgetEmail($forgetPassword->user));

        return redirect('user/forgetPassword')->with('email', 'We have sent you an email to reset your password');
    }

    public function passwordReset($token, $date) {
        $checkTime = strtotime($date);
        if(time() - $checkTime > 20 * 60) {
            return redirect('user/login/')->with('passes', 'Looks like the link has expired');
        } 

        $passReset = ForgetPassword::where('token', $token)->first();
        if(isset($passReset)) {
            $user = $passReset->user;
            if($user->password) {
                return redirect('/user/passwordReset'. '/'. $user->id); 
            }
        }
    }

    public function passwordUpdate(Request $request, $id) {
        $validatePass = $this->validate($request, [
            'password' => 'required|string|min:6|confirmed',
        ]);

        $pass = User::where('id', $id)->first();
        $pass->password = Hash::make($validatePass['password']);
        $pass->save();

        return redirect('/user/login')->with('reset', 'Your password has been reset');
    }

    public function logout($msg = 0) {
        $cookieName = $this->guard->getRecallerName();
        $cookie = Cookie::forget($cookieName);
        Auth::logout();
        Session::flush();
        if($msg == 0) {
            return redirect()->route('user.login')->withCookie($cookie);
        } else {
            return redirect()->route('user.login')->withCookie($cookie)->with('verify', 'Your email is not verified');
        }
    }
}

在我没有在 Mail 中添加 ForgetEmail 类之前,我的所有代码都运行良好。我不知道这里有什么问题。如果你能为我找到它会很高兴。

标签: laravelemailsmtplaravel-mail

解决方案


推荐阅读