Почта для домена от маил, как убрать проверку ящика на существование при отправки письма? или как чекать почту до отправки письма?

Почта для домена от маил, как убрать проверку ящика на существование при отправки письма? или как чекать почту до отправки письма?

Кто-то делал почту для домена от mail.ru сервиса? Проблема, маил ру, проверяет свои ящики на валидность, существует ли ящик или нет.

Сделал форму регистрации, проверяю поля на заполнение и т.д, далее если все ок, проходит валидацию, идет генерация пароль и запись данных в бд, после уже идет отправка на почту, пароль и т.д, вот тогда и вылезает ошибка, (Expected response code 250 but got code "550"), получается так, пользователь зарегистрировался, но такого ящика не существует и пароль туда не придет.

Надо как-то проверять маил ящики до отправки письма на почту и до добавления данных в бд, как это можно сделать?

Так обычно проверяю на корректность и заполненность поля.
if (empty($email)) {
throw new Exception('Введите E-mail');
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new Exception('Введите корректный E-mail');
}
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Kirill-Gorelov
С ума с IT
Бро, в этом и суть создания регистрации и проверки почты.
Ты со своей стороны должен написать код так, что бы он работал в любым случаях, даже если почта не существует или с ошибкой.
И ты должен ошибку 550 обработать, а ящик пометить как не активный, к примеру.

Проблема, маил ру, проверяет свои ящики на валидность, существует ли ящик или нет.

А это делает не только майл, но и все почтовые сервисы.

Надо как-то проверять маил ящики до отправки письма на почту и до добавления данных в бд, как это можно сделать?

Есть специальные сервисы, но они не умееют проверять маил.ру ящики
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
а зачем это делать?
а если я укажу несуществующую почту gmail то что будете делать?

если письмо не ушло, ловите Exception чтобы приложение не падало и всё.

а вообще проверяется это через SMTP
https://github.com/zytzagoo/smtp-validate-email
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега PHP
> Надо как-то проверять маил ящики до отправки письма на почту и до добавления данных в бд, как это можно сделать?

Не надо. Надо ожидать ошибки на любом этапе и корректно это обрабатывать. Например, так:

/* Попытаемся сделать всё что нам надо*/
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(); // отошлём ответ пользователю
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы