Я обновил свой экземпляр laravel с версии 5.6 до версии 5.7. Сейчас пробую использовать встроенная проверка электронной почты от laravel.
Моя проблема в том, что я не получаю электронное письмо после успешной регистрации, когда я использую функцию «повторной отправки», когда приходит электронное письмо.
В чем проблема?
Я использую код по умолчанию после настройки laravel и реализованных элементов аутентификации / проверки.
вы выполнили все шаги по настройке проверки электронной почты?
вы получаете электронную почту в папке со спамом или во входящих?
Нет. Когда я повторно отправляю письмо, все работает нормально.






У меня была такая же проблема. Это код по умолчанию из Laravel.
Чтобы отправить электронное письмо после успешной регистрации, вы можете сделать следующее:
на App\Http\Controllers\Auth\RegisterController
измените это:
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
к этому:
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
$user->sendEmailVerificationNotification();
return $user;
}
Я сделал, как показано выше, но я все еще не могу получить электронное письмо в своем почтовом ящике. Я проверил почтовую ловушку, и он показывает, что письмо было отправлено !!
Если вы используете почтовую ловушку, вы никогда не получите письмо на свой почтовый ящик. Все данные будут в почтовом ящике. Это инструмент для развития.
что мне использовать, чтобы получать электронную почту в свой почтовый ящик?
@YoussefBoudaya Laravel предоставляет чистый и простой API поверх популярной библиотеки SwiftMailer с драйверами для SMTP, Mailgun, SparkPost, Amazon SES и sendmail. Я рекомендую вам начать использовать SMTP, указав только учетные данные в вашем файле .env. Вот пример: MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 465 [email protected] MAIL_PASSWORD = 123456 MAIL_ENCRYPTION = ssl
Я обнаружил, что «правильный (по умолчанию 5.7) способ» - перейти к классу App\Providers\EventServiceProvider и добавить слушателя для SendEmailVerificationNotification. Добавьте это так: protected $listen = [ Illuminate\Auth\Events\Registered::class => [ Illuminate\Auth\Listeners\SendEmailVerificationNotification::class, ], ]; * Вы можете использовать / импортировать классы, чтобы сделать вещи красивыми.
Уже есть событие для Registered и слушателя SendEmailVerificationNotification. Не понимаю, почему это принятый ответ. Нет лучшего способа? У меня такая проблема.
У меня тоже была такая же проблема. Поскольку я проверил исходный код, нет необходимости реализовывать вызов метода sendEmailVerificationNotfication(), вам просто нужно добавить обработчик событий в свой EventServiceProvider.php, поскольку из-за того, что ваш обработчик событий был создан ранее, поэтому Larael не может его обновить. Должно получиться так:
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
Следуя структуре Laravel, это должен быть правильный ответ, большое спасибо.
Если у вас есть настраиваемая страница регистрации, вы можете просто запустить событие после создания пользователя следующим образом:
event(new Registered($user));
это единственный ответ, который сработал для меня. На случай, если кто-то столкнется с этим в будущем, вы должны включить это в верхнюю часть вашего контроллера use Illuminate\Auth\Events\Registered.
на случай, если кто-то другой ищет решение той же проблемы.
пожалуйста, прочтите документацию, она точно объясняет, что нужно сделать, чтобы решить эту проблему.
https://laravel.com/docs/5.7/verification
в двух словах, и если вы уже используете 5.7 (т.е. у вас есть необходимые поля в таблице users), все, что вам нужно сделать, это следующее:
User реализовала интерфейс MustVerifyEmail.['verify' => true] в метод Auth::routesAuth::routes(['verify' => true]);вы можете найти все, что вам нужно о подтверждении электронной почты, по ссылке выше.
В дополнение к ответу djug, если вы столкнетесь с той же проблемой после обновления с версии 5.6, как и я, вы найдете здесь пошаговое руководство по реализации:
https://laravel.com/docs/5.7/upgrade
в разделе подтверждение адреса электронной почты
Надеюсь, это поможет кому-то, поскольку я довольно долго боролся с этим.
Убедитесь, что у вас есть настройка «От электронной почты», так как большинство SMTP-серверов не разрешают отправку с любого адреса. Конфигурация env для них:
[email protected]
MAIL_FROM_NAME=Something
Я знаю, что этот пост немного устаревший, но у меня была аналогичная проблема с Laravel 7. Я думаю, что приведенный выше ответ Зейна должен быть принятым ответом. Чтобы уточнить это, используйте следующие шаги. Это нужно сделать после установки скаффолдинга auth с помощью composer и php artisan. Примечание: я ни в коем случае не профессионал в области Laravel. Если есть какие-либо проблемы с моим кодом, ПОЖАЛУЙСТА, дайте мне знать. Чем больше я узнаю, тем лучше буду.
Убедитесь, что ваша модель App \ User реализует Illuminate \ Contracts \ Auth \ MustVerifyEmail:
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}
В routes \ web.php измените это:
Auth::routes();
К этому:
Auth::routes(['verify'=>true]);
После этого вы можете указать, для каких маршрутов требуется подтвержденный адрес электронной почты, либо используя промежуточное ПО непосредственно на маршруте, подобном этому:
Route::get('/profile','ProfileController@index')->middleware('verified');
или вы можете сделать это в функции конструктора контроллера следующим образом:
public function __construct()
{
$this->middleware(['auth','verified']);
}
Я использую следующий код контроллера регистра. Обратите внимание, что функция регистрации содержит вызов следующего:
event(new Registered($user));
Это был ключ к отправке письма с первоначальной регистрацией.
Имейте в виду, что этот контроллер был разработан для работы в основном с сайтом ajax, поэтому функция register возвращает ответ json.
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Auth;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'first_name' => ['required', 'string', 'max:255'],
'last_name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'phone_number' => ['required', 'numeric', 'min:10'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
'password_confirmation'=> ['required', 'string'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
$user=User::create([
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'email' => $data['email'],
'phone_number' => $data['phone_number'],
'password' => Hash::make($data['password']),
]);
return $user;
}
/**
* Execute registration and login the user
*
* @param array $request
* @return response
*/
public function register(Request $request) {
$validation = $this->validator($request->all());
if ($validation->fails()) {
return response()->json($validation->errors(),422);
}
else{
$user = $this->create($request->all());
event(new Registered($user));
Auth::login($user);
if (Auth::user()){
return response()->json(['success'=>'Registration Successful']);
}
}
}
}
Да, кажется, правильно. Для меня отправка нового события регистрации кажется лучше, чем отправка письма с подтверждением, как в текущем принятом ответе. Думаю, я приму ответ Зейна. Но все равно спасибо за это приятное разъяснение :)
Не могли бы вы поделиться с нами своим кодом? Было бы очень полезно.