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

Другие вопросы по тегам