if (empty($email)) {
throw new Exception('Введите E-mail');
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new Exception('Введите корректный E-mail');
}
Проблема, маил ру, проверяет свои ящики на валидность, существует ли ящик или нет.
Надо как-то проверять маил ящики до отправки письма на почту и до добавления данных в бд, как это можно сделать?
> Надо как-то проверять маил ящики до отправки письма на почту и до добавления данных в бд, как это можно сделать?
/* Попытаемся сделать всё что нам надо*/
try {
$email = $request->getRequired("email"); // вытащим email из запроса
$validator->checkEmail($email); // сделаем базовую проверку на то что email корректный. Пример реализации ты как раз описал в вопросе
$password = $userComponent->generatePassword(); // сгенерируем пароль
$user = $userComponent->createUser($email, $password); // создадим пользователя, используя известные нам логин и пароль
$mailer->sendRegistrationEmail($user); // отошлём пользователю email c паролем
$response->setHeader(200); // укажем в ответе, что всё прошло успешно
/* Но в каждой строчке из блока try может пойти что-то не так. Надо предусмотреть это и обработать такие случаи */
} catch (MalformedRequestException) { // могут не передать email в запросе
$response->setHeader(400); // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
} catch (ValidationException) { // email может быть корявым. Ну, например "test1111"
$response->setHeader(422); // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
} catch (ComponentException $e) { // при попытке создать пользователя что-то может пойти не так
$logger->write("warning", "An error occurred during creation of the user.") // вообще, интересно бы узнать, что именно пошло не так, поэтому данную информацию надо залоггировать
$logger->writeExceptionInfo("debug", $e); // ... и максимально подробно. Чтобы при переключении системы в
$response->setHeader(500); // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
} catch (MailerException $e) { // при попытке отправить email что-то может пойти не так. ВОТ ОНО РАДИ ЧЕГО ВСЁ ЗАТЕВАЛОСЬ
$logger->write("warning", "Unable to send registration email to {$user->email}"); // первым делом залоггирем ошибку
$logger->writeExceptionInfo("debug", $e); // подробности ошибки тоже залоггируем
// раз отправить пароль не удалось, то регистрация не прошла успешно. И свежесозданного пользователя можно смело удалять. Можно использоватль для этого механизм транзакций, но этот пример у нас простой и такие сложности ни к чему
try { // да, в момент удаления тоже что-то может пойти не так, поэтому опять используем try...catch
$userComponent->deleteUser($user->id);
} catch(\Throwable $e) { // если не удалось удалить пользователя, то просто запишем информацию в лог
$userId = $user->id ?? "Not Specified";
$logger->write("warning", "Unable to delete user {$userId}" during rollback caused by MailerException);
$logger->writeExceptionInfo("debug", $e);
}
$response->setHeader(502); // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
}
$response->send(); // отошлём ответ пользователю