Улавливание ошибок PHP mail() и отображение разумного сообщения об ошибке пользователя
Я пишу довольно простой регистр php script, который использует PHP, встроенный в функцию mail()
, чтобы отправить пользователю ссылку активации.
Проблема в том, что я могу уловить обычные ошибки, такие как форматирование электронной почты, но как только он запускается на сервер и говорит, что пользователь поставил неверный адрес электронной почты, я не знаю, как поймать эту ошибку и сказать пользователь, что произошло.
Например, на данный момент я получаю следующее:
Предупреждение: mail() [function.mail]: ответ SMTP-сервера: 554: Адрес получателя отклонен: доступ к ретрансляции отклонено в ** в строке 70
Любые идеи о том, что я могу сделать с ошибками? Я знаю использование символа @для подавления ошибки, но я вроде бы хочу сделать больше, чем это, и справиться с этой проблемой.
Ответы
Ответ 1
Используйте 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.
Ответ 2
Тривиальная ошибка, от которой я страдала, была просто отсутствием "sendmail" в моей системе.
В конце концов, я установил exim4 и настроил его, а затем php mail (...) работал нормально.
См. также:
Ответ 3
Вы хотите поймать столько, сколько сможете, прежде чем отправлять почту, дезинфицируйте свои входы, чтобы убедиться, что это действительно то, что вы ожидаете от нее.
Вы можете использовать filter_var
, чтобы проверить, действительно ли адрес электронной почты является адресом,
убедитесь, что целые числа попадают в допустимый диапазон и т.д.
Установите почтовый заголовок с адреса в место, где вы можете проверить наличие неудачных поставок:
$headers = 'From: [email protected]' . "\r\n";
Вы также можете проверить, что почта выполнена так, как ожидалось:
if(mail($to,$subject,$message))
И последнее, что вы, вероятно, не хотите показывать предупреждения в живой среде, вы можете отключить их, либо через ini или используя ini_set
.
Ответ 4
Лучше всего было бы использовать библиотеку типа Swift Mailer, которая генерирует исключения, которые могут быть легко обработаны.