Перехват ошибок PHP mail() и отображение разумного сообщения об ошибке пользователя
Я пишу довольно простой регистр PHP-скрипт, который использует встроенный PHP mail()
функция для отправки пользователю по электронной почте ссылку для активации.
Проблема в том, что я могу поймать обычные ошибки, такие как форматирование электронной почты, но как только он отправляется на сервер и говорит, что пользователь ввел адрес электронной почты, который дает сбой, я не знаю, как отловить эту ошибку и сказать пользователю, что получилось.
Например, на данный момент я получаю это:
Предупреждение: mail() [function.mail]: ответ SMTP-сервера: 554: адрес получателя отклонен: доступ к ретрансляции запрещен ** в строке 70
Любые идеи, что я мог бы сделать с ошибками, как это? Мне известно об использовании символа @ для подавления ошибки, но я хочу сделать что-то большее и справиться с проблемой.
4 ответа
Используйте логический результат для обнаружения ошибки:
$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, которая генерирует исключения, которые легко обрабатываются.