mail () не выполняется, но возвращает true - PullRequest
13 голосов
/ 27 мая 2011

Я пытаюсь использовать функцию php mail() на моем сервере.Как ни странно, он возвращает true, но я ничего не получаю в своем почтовом ящике.

Тем не менее, пересылка электронной почты cpanel работает нормально.

То есть, это не конфигурация, так как экспедитор отправляет мне письма?

Я пытался добавить:

ini_set("sendmail_from", "do-not-reply@gmail.com");

Но это не сработало.

Вот мой код:

$subject = "My Subject";
$body = "Email Body ";
$headers = 'From: do-not-reply@domain.com' . "\r\n" . 
    'Reply-To: do-not-reply@domain.com' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 

if (mail($email,$subject,$body,$headers))
    echo "Sent!";
else
    echo "Fail!";

Ответы [ 6 ]

6 голосов
/ 27 мая 2011

Существует множество причин, которые могут вызвать эту проблему.Вот некоторые из них:

  1. Письмо было получено, но помечено как спам.
  2. Адрес получателя был неверным.
  3. В очереди медленных сообщенийотправляющий почтовый сервер.
  4. На принимающем почтовом сервере имеется очередь медленной почты.

mail() возвращает значение true, когда сервер исходящей почты принимает сообщение для доставки.Вам нужно будет устранить другие возможности, чтобы найти точку отказа.

4 голосов
/ 27 мая 2011

Функция mail() очень редко возвращает что-либо кроме true. Его заботит только тот факт, что он успешно передал электронное письмо MTA (Mail Transfer Agent - т.е. программе, которая фактически отправляет его).

MTA сразу же отклонит письмо, только если оно плохо сформировано. В этом случае вы получите ошибку в PHP. Но он также может отклонить электронное письмо или не отправлять его после того, как принял его от PHP, по ряду причин, о которых PHP не будет иметь никакого представления, поскольку он уже получил свой ответ true.

Ваш MTA будет иметь журнал ошибок, который вы можете просмотреть для получения дополнительной информации, если ошибка происходит локально.

1 голос
/ 12 января 2015

Проверьте свой mail.log после отправки тестового электронного письма:

sudo tail -f /var/log/mail.log

Затем вы увидите идентификатор, присвоенный последнему электронному письму, которое вы пытались отправить.Например, я вижу:

Jan 11 23:03:14 vagrant-ubuntu-trusty-64 postfix/pickup[17228]: 69F3441529: uid=33 from=<www-data>

69F3441529 - это уникальный идентификатор, назначенный этому электронному письму.Затем вы можете выполнить поиск в журнале для всех строк с таким идентификатором ...

sudo grep 69F3441529 /var/log/mail.log

После этого вы сможете найти любое сообщение об ошибке, которое может присутствовать, и затем отсканировать их:)

1 голос
/ 29 ноября 2012

Мы столкнулись с точно такой же проблемой.Решение было в php.ini установить соответствующий sendmail_path.

sendmail_path = "/ usr / sbin / sendmail -t -i"

Установка вышеуказанного решала проблему.

1 голос
/ 27 мая 2011

У меня была проблема со сценарием, который я использовал, который отправлял и получал в том же домене. Вы пытались отправить электронное письмо на адрес электронной почты, находящийся в другом домене? Это может помочь сузить возможные проблемы.

0 голосов
/ 10 марта 2015

В моем случае изменение настроек сервера с IPv6-адресов на IPv4-адреса решило проблему.

...