Почта 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-файле с тем же результатом. Как я могу отладить эту проблему?

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


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

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

Для немецких докладчиков я написал довольно подробное «что делать» по этому вопросу некоторое время назад. См. Здесь .

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

Затем MTA решает, что делать с электронной почтой. Вероятно, вы не работаете в Google, и ваш собственный MTA не входит в «gmail.com». Поэтому ваш MTA должен отправить его на следующий MTA на пути к gmail.com (forward-path). Это может работать или нет, но 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 «Ok», это гораздо более вероятно, что это действительно нормально, чем mail (), возвращающий «true».

Сервер SMTP, обрабатывающий вашу почту, может отклонять сообщение, потому что он утверждает, что пришел с gmail.com.

Попробуйте изменить поле «От» в $headers на адрес из вашего домена.

Хорошо, я уверен, вы используете бесплатный / коммерческий сервер, которым управляют другие ребята. К сожалению, иногда настройки сервера неверны, поэтому вы не можете получить электронную почту, даже если вы следовали правильному синтаксису php. Попытайтесь связаться со своим центром обслуживания клиентов и позволить им делать диагностические материалы для вас.

Это случается с моим сервером в течение одного раза (justhost виноват!), Так что это может быть полезно для вас.

проверьте эти атрибуты на своем phpinfo (); (если это позволяет вам это увидеть)

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

Скорее всего, эти атрибуты плохо настроены.

Я не вижу ничего плохого в вашем заявлении php 🙂

отредактировано: вы также можете загрузить почтовый скрипт, написанный на другом языке (Perl является лучшим, поскольку большинство серверов Linux установлены по умолчанию). Посмотрите, можете ли вы отправить письмо оттуда. Если это так, то я предполагаю, что это ошибка конфигурации сервера (проблема php.ini?), А не ваша. Если скрипт Perl не может отправлять электронную почту, ну … пусть ребята из центра обслуживания клиентов знают и узнают, сможете ли вы вернуть свои деньги 🙂

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

К сожалению, из-за объема и характера спама многие люди придумывают нестандартизированные методы борьбы с ним – RBL, RMX, ключи домена, идентификатор отправителя, байесовские фильтры … в этих подходах нет ничего неправильного, но для факт, что они в одностороннем порядке применяются поставщиками услуг часто без ведома, не говоря уже о согласии пользователей сервиса. И провайдеры обычно очень скрытно относятся к положениям, которые они ввели в действие. Но если вы отправляете в gmail, то, вероятно, это будут байесовские системы фильтрации, которые они используют – ВЫ ПРОВЕРЯЛИ ПАПКУ СПАМА?

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

C.

Попробуйте добавить параметр -f к вызову mail()

Регистрация с проверкой подлинности электронной почты активируется только 30%?