Устранение неполадок PHP Mail

Как я могу проверить проблему с отправкой почты на моем сервере? Я запускаю простой тест:

if(mail($to, $subject, $message)) {
echo 'Mail Sent';
}

какой тест выводит текст; но почта никогда не приходит.

Как я могу отследить проблему?

6 ответов

Решение

Это довольно длинная история. Несколько ключевых пунктов (при условии, что mail() возвращает true и в журнале ошибок нет ошибок):

  • Адрес отправителя ("От") принадлежит домену на вашем сервере? Если нет, сделайте это так.
  • Ваш сервер находится в черном списке (например, проверьте IP на spamhaus.org)? Это удаленная возможность с общим хостингом.
  • Фильтруются ли письма фильтром спама? Откройте аккаунт в freemailer, в котором есть папка для спама, и узнайте. Также попробуйте отправить почту на адрес без спам-фильтра.
  • Возможно, вам нужен пятый параметр "-f" mail() для добавления адреса отправителя? (Смотрите команду mail() в руководстве по PHP)
  • Если у вас есть доступ к файлам журналов, проверьте их, конечно, как предложено выше.
  • Проверяете ли вы адрес "от:" на предмет возможной пересылки писем ("Возвращено отправителю")? Вы также можете настроить отдельный адрес для ошибок.

Для носителей немецкого языка я написал довольно исчерпывающее "что делать" по этому вопросу некоторое время назад. Смотрите здесь.

После Myles, если вы используете Linux, сделайте это в командной строке:

# echo “Body text.” | mail -s “Hello world” you@example.com

Если вы не получили это письмо, у вас есть проблема с почтовой системой в этом ящике. Этот вопрос отличается от вопроса PHP, который вы задавали.

Из руководства по PHP:

Return Values

Returns TRUE if the mail was successfully accepted for delivery, FALSE otherwise.

It is important to note that just because the mail was accepted for delivery, **it 
does NOT mean the mail will actually reach the intended destination**.

Не уверен, как сделать следующий шаг, но это важный момент.

Если все неполадки не удаются - теперь предполагается, что mail() возвращает false по неизвестным причинам - переключитесь на почтовый скрипт, такой как PHPMailer, который позволяет вообще обходить mail() и подключаться напрямую через SMTP, и предлагает расширенный режим отладки. Таким образом, вы сможете установить рабочее решение или найти суть проблемы.

Первое, что я бы начал, - это журнал ошибок PHP, а затем ваш журнал sendmail. Также попробуйте sendmail из командной строки и проверьте конфигурацию PHP, чтобы убедиться, что она правильно настроена для отправки почты.

Вы работаете над живым веб-сервером здесь или над чем-то более похожим на личную песочницу разработки? (То есть, ваш домашний компьютер?) Если это последний, я могу сказать вам, что у меня было много проблем в прошлом с моим ISP (Cox), фильтрующим мои порты исходящей почты. (Они скажут вам, что они этого не делают, но я уверен, что они делают.)

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

Я надеюсь, что это полезно.

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