Я пишу довольно простой скрипт регистрации php, который использует встроенную функцию mail()
PHP, чтобы отправить пользователю ссылку активации.
Проблема в том, что я могу поймать обычные ошибки, такие как форматирование электронной почты, но как только он запускается на сервер и говорит, что пользователь поставил неверный адрес электронной почты, я не знаю, как поймать эту ошибку и сообщить пользователю, что получилось.
Например, на данный момент я получаю следующее:
Предупреждение: mail () [function.mail]: ответ SMTP-сервера: 554: адрес получателя отклонен: доступ к ретрансляции запрещен ** в строке 70
Любые идеи, что я могу сделать с ошибками? Я знаю использование символа @ для подавления ошибки, но я вроде бы хочу сделать больше, чем это, и справиться с этой проблемой.
Используйте boolean result для обнаружения ошибки:
$success = @mail(...);
Затем вы хотите узнать, какая внутренняя ошибка вызвала проблему, поэтому используйте:
$error = error_get_last(); preg_match("/\d+/", $error["message"], $error); switch ($error[0]) { case 554: ... default: ...
Обратите внимание, что это работает только с php 5.2.
Невозможно проверить доставку или просмотреть сообщения об ошибках при отправке с помощью PHP. Для этого вам понадобится обработчик опроса pop3.
Тривиальная ошибка, от которой я страдала, была просто отсутствием «sendmail» в моей системе. В конце концов, я установил exim4 и настроил его, а затем почта php (…) работала нормально.
Смотрите также:
Вы хотите поймать столько, сколько сможете, прежде чем отправлять почту, дезинфицируйте свои материалы, чтобы убедиться, что это действительно то, что вы ожидаете от нее
Вы можете использовать filter_var
чтобы проверить, действительно ли адрес электронной почты является адресом, проверьте, попадают ли целые числа в допустимый диапазон и т. Д.
Установите почтовый заголовок с адреса в место, где вы можете проверить наличие неудачных поставок:
$headers = 'From: webmaster@example.com' . "\r\n";
Вы также можете проверить, что почта выполнена так, как ожидалось:
if(mail($to,$subject,$message))
И последнее, вы, вероятно, не хотите отображать предупреждения в живой среде, вы можете отключить их либо через ini-файл, либо с помощью ini_set
.
Лучше всего было бы использовать библиотеку, например Swift Mailer, которая генерирует исключения, которые можно легко обрабатывать.