#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);
}
Полный.