Проверка регистрации по электронной почте с помощью laravel

#laravel

Вопрос:

Привет всем в этот день я разрабатываю свой веб-сайт, и любой новый пользователь должен зарегистрироваться на нем, и я использовал электронную почту для подтверждения от них. Я использую laravel на своем веб-сайте, я хочу использовать настоящую электронную почту для отправки кода подтверждения для новых пользователей, мне не нужна mail-trap услуга, мне нужна настоящая электронная почта. пожалуйста, скажите мне, что мне нужно для выполнения этой работы. Помните, что я хочу сделать это, когда мой сайт на бесплатном хостинге, а не на реальном хостинге.

Комментарии:

1. Существует действительно хороший веб-сайт, на который можно взглянуть в таких ситуациях: laravel.com/docs/8.x

Ответ №1:

Вы можете реализовать электронное письмо через событие или в том же контроллере. Мое решение было протестировано на Laravel 5.6. Прежде всего, внесите настройки электронной почты для gmail в .env файл.

 MAIL_DRIVER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=465
MAIL_USERNAME=real email
MAIL_PASSWORD=real password
MAIL_ENCRYPTION=ssl
 

Предположим, вы хотите, чтобы пользователи активировали свою учетную запись после регистрации. Поэтому создайте новую модель:

 php artisan make:modal VerifyUser –m
 

Добавьте этот код в созданный migration :

 public function up()
{
    Schema::create('verify_users', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->string('token')->index();
        $table->timestamps();
    });
}
 

Затем добавьте verified поле в таблицу пользователи:

 $table->boolean('verified')->default(false);
 

Затем:

 php artisan migrate
 

Добавьте этот метод в User Model :

 class User extends Authenticatable
{    
    public function verifyUser()
    {
        return $this->hasOne('AppVerifyUser');
    }
}
 

Добавьте этот метод в VerifyUser Model :

 class VerifyUser extends Model
{
    protected $guarded = [];

    public function user()
    {
        return $this->belongsTo('AppUser', 'user_id');
    }
}
 

Создайте класс для электронной почты, который наследуется от Maiable . Этот файл создается в папке электронной почты.

 php artisan make:mail VerifyMail
 

Примените следующие изменения к VerifyMail class :

 namespace AppMail;
...
class VerifyMail extends Mailable
{
    use Queueable, SerializesModels;
    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->view('emails.verifyUser');
    }
}
 

Создайте папку с именем электронные письма и создайте в ней файл блейда с именем verifyUser. И поместите в него следующий код:

 <body>
    <h2>Welcome to the site {{$user['name']}}</h2>
    <br/>
    Your registered email-id is {{$user['email']}} , Please click on the below link to verify your email account
    <br/>
    <a href="{{url('user/verify', $user->verifyUser->token)}}">Verify Email</a>
</body>
 

Изменить create метод в RegisterController :

 use AppMailVerifyMail;
use AppVerifyUser;
use IlluminateSupportFacadesMail;
use IlluminateHttpRequest;
...
protected function create(array $data)
    {
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);

        $verifyUser = VerifyUser::create([
            'user_id' => $user->id,
            'token' => sha1(time())
        ]);
        Mail::to($user->email)->send(new VerifyMail($user));

        return $user;
    }
 

С помощью этого метода после регистрации пользователя в таблицу пользователей добавляется запись, но проверенное значение в настоящее время равно false или нулю. Теперь, чтобы запретить пользователю входить в систему сразу после регистрации, добавьте следующий метод в RegisterController :

 protected function registered(Request $request, $user)
{
    $this->guard()->logout();
    return redirect('/login')->with('status', 'We sent you an activation code. Check your email and click on the link to verify.');
}
 

Непроверенный пользователь не должен входить в систему каким-либо образом. И вы должны переопределить authenticated метод для успешного входа пользователя в систему. Поэтому добавьте authenticated метод в LoginController :

 public function authenticated(Request $request, $user)
{
    if (!$user->verified) {
        auth()->logout();
        return back()->with('warning', 'You need to confirm your account. We have sent you an activation code, please check your email.');
    }
    return redirect()->intended($this->redirectPath());
}
 

Добавьте этот код login.blade.php , чтобы отобразить сообщение выше:

 @if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif
@if (session('warning'))
    <div class="alert alert-warning">
        {{ session('warning') }}
    </div>
@endif
 

Затем определите маршрут для ссылки, которую вы отправили на электронную почту пользователя:

 Route::get('/user/verify/{token}', 'AuthRegisterController@verifyUser');
 

Теперь пришло время активировать пользователя. Поэтому проверенное значение должно быть равно true или единице. Добавьте следующий метод в RegisterController :

 public function verifyUser($token)
{
    $verifyUser = VerifyUser::where('token', $token)->first();
    if(isset($verifyUser) ){
        $user = $verifyUser->user;
        if(!$user->verified) {
            $verifyUser->user->verified = 1;
            $verifyUser->user->save();
            $status = "Your e-mail is verified. You can now login.";
        } else {
            $status = "Your e-mail is already verified. You can now login.";
        }
    } else {
        return redirect('/login')->with('warning', "Sorry your email cannot be identified.");
    }
    return redirect('/login')->with('status', $status);
}
 

Полный.