Улавливание ошибок 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, которая генерирует исключения, которые могут быть легко обработаны.