大家好,今天我正在设计我的网站,任何新用户都必须在该网站上注册,我使用电子邮件向他们进行验证。
我在我的网站上使用 laravel 我想使用真实的电子邮件为新用户发送验证码 我不想要 mail-trap
服务 我想要真实的电子邮件。请告诉我完成这项工作需要什么。
请记住,当我的网站使用免费托管而非真实托管时,我想这样做。
答案 0 :(得分:1)
您可以通过事件或在同一控制器中实现电子邮件。我的解决方案已经在 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
将此代码添加到创建的 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
字段添加到 users 表:
$table->boolean('verified')->default(false);
那么:
php artisan migrate
将此方法添加到User Model
:
class User extends Authenticatable
{
public function verifyUser()
{
return $this->hasOne('App\VerifyUser');
}
}
将此方法添加到VerifyUser Model
:
class VerifyUser extends Model
{
protected $guarded = [];
public function user()
{
return $this->belongsTo('App\User', 'user_id');
}
}
为继承自 Maiable
的电子邮件创建一个类。此文件是在电子邮件文件夹中创建的。
php artisan make:mail VerifyMail
对 VerifyMail class
应用以下更改:
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>
更改 create
中的 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;
}
使用这种方法,在用户注册后,会在用户表中添加一条记录,但当前验证的值为false或0。现在为了防止用户在注册后立即登录,在 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}', 'Auth\RegisterController@verifyUser');
现在是激活用户的时候了。因此,验证值必须设置为 true 或 1。将以下方法添加到 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);
}
完成。