使用laravel通过电子邮件验证注册

使用laravel通过电子邮件验证注册,laravel,Laravel,大家好,这一天我正在设计我的网站,任何新用户都必须注册,我用电子邮件向他们核实。 我在我的网站上使用laravel我想使用真实的电子邮件为新用户发送验证码我不想要邮件陷阱服务我想要真实的电子邮件。请告诉我完成这项工作需要什么。 记住,当我的网站是免费托管,而不是真正的托管时,我想这样做。您可以通过活动或在同一控制器中实现电子邮件。我的解决方案已在Laravel 5.6上进行了测试。首先,在.env文件中设置gmail的电子邮件设置 MAIL_DRIVER=smtp MAIL_HOST=smtp.

大家好,这一天我正在设计我的网站,任何新用户都必须注册,我用电子邮件向他们核实。 我在我的网站上使用laravel我想使用真实的电子邮件为新用户发送验证码我不想要
邮件陷阱
服务我想要真实的电子邮件。请告诉我完成这项工作需要什么。
记住,当我的网站是免费托管,而不是真正的托管时,我想这样做。

您可以通过活动或在同一控制器中实现电子邮件。我的解决方案已在Laravel 5.6上进行了测试。首先,在
.env
文件中设置gmail的电子邮件设置

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
将此代码添加到已创建的
迁移中

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);
然后:

将此方法添加到
用户模型中

class User extends Authenticatable
{    
    public function verifyUser()
    {
        return $this->hasOne('App\VerifyUser');
    }
}
class VerifyUser extends Model
{
    protected $guarded = [];

    public function user()
    {
        return $this->belongsTo('App\User', 'user_id');
    }
}
将此方法添加到
验证用户模型

class User extends Authenticatable
{    
    public function verifyUser()
    {
        return $this->hasOne('App\VerifyUser');
    }
}
class VerifyUser extends Model
{
    protected $guarded = [];

    public function user()
    {
        return $this->belongsTo('App\User', 'user_id');
    }
}
为从
Maiable
继承的电子邮件创建一个类。此文件是在电子邮件文件夹中创建的

php artisan make:mail VerifyMail
将以下更改应用于VerifyMail类

namespace App\Mail;
...
class VerifyMail extends Mailable
{
    use Queueable, SerializesModels;
    public $user;

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

    public function build()
    {
        return $this->view('emails.verifyUser');
    }
}
创建一个名为emails的文件夹,并在其中创建一个名为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>
使用此方法,在用户注册后,会将记录添加到用户表中,但验证值当前为false或零。现在,为了防止用户在注册后立即登录,请将以下方法添加到
RegisterController

use App\Mail\VerifyMail;
use App\VerifyUser;
use Illuminate\Support\Facades\Mail;
use Illuminate\Http\Request;
...
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;
    }
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.');
}
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());
}
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);
}
未经验证的用户不应以任何方式登录。您必须重写
已验证的
方法才能成功登录用户。因此,将
authenticated
方法添加到
LoginController

use App\Mail\VerifyMail;
use App\VerifyUser;
use Illuminate\Support\Facades\Mail;
use Illuminate\Http\Request;
...
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;
    }
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.');
}
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());
}
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);
}
将此代码添加到
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
现在是激活用户的时候了。因此,验证值必须设置为true或one。将以下方法添加到注册表控制器中:

use App\Mail\VerifyMail;
use App\VerifyUser;
use Illuminate\Support\Facades\Mail;
use Illuminate\Http\Request;
...
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;
    }
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.');
}
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());
}
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);
}

完成。

对于这些情况,有一个非常好的网站可以查看: