Почта PHP прекратила работать

Несколько дней назад при использовании mail() У меня был он работа.

Но теперь это не работает. И я не знаю, какова проблема.

$to      = 'testmail@gmail.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: sender@gmail.com' . "\r\n" .
    'Reply-To: sender@gmail.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

$mail_sent = @mail( $to, $subject, $message, $headers ); 
echo $mail_sent ? "Mail sent" : "Mail failed";

Это отображает "Отправленную почту".

Я ничего не коснулся в Apache или этом коде. Я протестировал код в пустом файле PHP с тем же результатом. Как я могу отладить эту проблему?

6
задан ЯegDwight 23 November 2012 в 23:50
поделиться

6 ответов

Может быть, электронная почта отправляется в порядке, но попадает в спам-фильтр? Если это возможно, позвольте мне перекрёстный столб :


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

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

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

11
ответ дан 8 December 2019 в 04:30
поделиться

Когда вы отправляете электронное письмо с помощью mail (), php передает данные приложению, которое вы настроили в sendmail_path , т.е. запускает новый процесс для и передает некоторые параметры и данные электронной почты. Предполагается, что это приложение помещает электронное письмо в очередь агента пересылки почты (MTA).
Возвращаемое значение функции php mail () "только" отражает, смог ли php запустить этот процесс, передать ему данные, и процесс завершится без кода ошибки. Т.е. mail () == true только сообщает вам, что электронное письмо (предположительно) было вставлено в очередь первого MTA на маршруте.

MTA затем решает, что делать с электронной почтой. Вы, вероятно, не работаете в Google, и ваш собственный MTA не находится "внутри" gmail.com. Итак, ваш MTA должен отправить его следующему MTA на пути к gmail.com (прямой путь). Это может работать или нет, но mail () === true ничего вам об этом не сообщает.
Ретрансляция почты от MTA к MTA может завершиться ошибкой на любом из шагов. И когда почта, наконец, приходит "на" gmail.com, последний MTA или агент доставки почты (MDA) также может отклонить ее по разным причинам.

Если происходит ошибка, «текущий» MTA может (на самом деле должен, но при условии, что все настроено правильно ;-)) отправить отчет об ошибке. Этот отчет об ошибке следует по прямому пути, но в обратном порядке (обратный путь), и наконец (или «надеюсь») отправитель получает электронное письмо с «недоставленной почтой».

(и это краткая версия. Вероятно, это неточно, и я не администратор и не эксперт по электронной почте / smtp; -))

Итак ... что вы можете сделать?

  1. Расскажите подробнее о своем сервере. Это ваш собственный (домашний / тестовый) сервер? Какая операционная система. Вы знаете, какая «система рассылки» был установлен (sendmail, qmail, ...)? Кто его настраивал?

  2. Спросите у Server Fault , как настроить почтовую систему вашего сервера, как она может попытаться сообщить вам, если что-то пошло не так и как убедить Google принять ваши электронные письма.

  3. Устраните первый MTA или более, пусть сам скрипт php станет первым MTA. Вы можете сделать это, используя, например, Swiftmailer (используя его транспортный модуль smtp) вместо mail (). Таким образом, локальная почтовая система вашего сервера не должна работать должным образом. Сценарий «напрямую» свяжется с SMTP-сервером Google, аутентифицирует «вас» и доставит почту в Google. Это по-прежнему не гарантирует, что почта будет доставлена, но гораздо более вероятно, что ошибка будет немедленно сообщена вашему сценарию, то есть если swiftmailer сигнализирует "ОК", это ' s гораздо более вероятно, что это действительно нормально, чем mail (), возвращающий "true".

11
ответ дан 8 December 2019 в 04:30
поделиться

The SMTP server handling your mail might be rejecting the message because it claims to come from gmail.com.

Try changing the 'From' field in $headers to an address from your domain.

1
ответ дан 8 December 2019 в 04:30
поделиться

Well, I bet you are using free/commercial server which is managed by some other guys. Unfortunately sometimes the server setting is not correct so that you cannot get the email even you have followed the correct php syntax. Try contacting its customer service center and let them do the diagnostic stuff for you.

This happens to my server for one time (justhost is to blame!) so this might be helpful to you.

check these attributes from your phpinfo(); (if it allows you to see that)

sendmail_from   no value    no value
sendmail_path   /usr/sbin/sendmail -t -i    /usr/sbin/sendmail -t -i

Chances are, these attributes are not configured well.

I don't see anything wrong with your php statement:)

edited : you can also upload the mail script written by another language (Perl is the best as most Linux servers have it installed as default). See if you can send email from there. If so, then I assume it is the server configuration error(php.ini problem?), not yours. If the Perl script cannot send email either, well... let guys in the customer service center know and see if you can get your money back:)

1
ответ дан 8 December 2019 в 04:30
поделиться

Try adding -f parameter to the mail() call

Signup with email authentication, only 30% are activated?

0
ответ дан 8 December 2019 в 04:30
поделиться

Если вы правы, и код, который раньше работал, больше не работает, то что-то вне вашего кода должно было измениться. Есть как минимум 2 MTA (один локальный и один удаленный), которые могут помешать вашей электронной почте. Если вы контролируете локальный, то проверяете очередь и журналы на предмет пересылки.

К сожалению, из-за объема и характера спама многие изобретают нестандартные методы борьбы с ним - RBLs, RMX, ключи домена, id отправителя, байесовские фильтры.... - в этих подходах нет ничего принципиально плохого, кроме того, что они применяются провайдерами услуг в одностороннем порядке часто без ведома, не говоря уже о согласии пользователей сервиса. А провайдеры, как правило, очень скрытно относятся к тем положениям, которые они вводят в действие. Но если вы посылаете в gmail, то, скорее всего, это будут байесовские системы фильтрации, которые они используют - НАСТОЯЩИЙ СПАМ-ФОЛДЕР?

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

C.

.
1
ответ дан 8 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: