<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
Я пытался создать простую почтовую форму. Сама форма находится на моей index.html
странице, но она отправляется на отдельную страницу «Спасибо за ваше представление» thankyou.php
, где встроен указанный выше код PHP. Код отправляет отлично, но никогда не отправляет электронное письмо. Как я могу это исправить?
$from
Ответы:
Хотя есть части этого ответа, которые относятся только к использованию самой
mail()
функции, многие из этих шагов по устранению неполадок могут быть применены к любой почтовой системе PHP.Существует множество причин, по которым ваш скрипт не отправляет электронные письма. Это трудно диагностировать, если нет явной синтаксической ошибки. Без него вам нужно пройти через контрольный список ниже, чтобы найти возможные потенциальные подводные камни, с которыми вы можете столкнуться.
Убедитесь, что отчеты об ошибках включены и настроены для отчета обо всех ошибках
Отчеты об ошибках важны для устранения ошибок в вашем коде и общих ошибок, с которыми сталкивается PHP. Отчеты об ошибках должны быть включены для получения этих ошибок. Размещение следующего кода в верхней части ваших файлов PHP (или в главном файле конфигурации) включит создание отчетов об ошибках.
Смотрите Как я могу получить полезные сообщения об ошибках в PHP? - этот ответ для более подробной информации по этому вопросу.
Убедитесь, что
mail()
функция вызываетсяЭто может показаться глупым, но распространенная ошибка заключается в том, чтобы забыть поместить
mail()
функцию в ваш код. Убедитесь, что он там и не закомментирован.Убедитесь, что
mail()
функция вызывается правильноФункция mail принимает три обязательных параметра и, необязательно, четвертый и пятый. Если ваш вызов
mail()
не имеет хотя бы трех параметров, он потерпит неудачу.Если ваш вызов
mail()
не имеет правильных параметров в правильном порядке, он также потерпит неудачу.Проверьте почтовые журналы сервера
Ваш веб-сервер должен регистрировать все попытки отправить электронную почту через него. Расположение этих журналов может отличаться (вам может потребоваться узнать у администратора сервера, где они находятся), но их обычно можно найти в корневом каталоге пользователя в
logs
. Внутри будут сообщения об ошибках, о которых сообщал сервер, если таковые имеются, связанные с вашими попытками отправить электронную почту.Проверьте, нет ли соединения с портом
Блокировка порта является очень распространенной проблемой, с которой сталкивается большинство разработчиков при интеграции своего кода для доставки электронной почты с использованием SMTP. И это можно легко отследить в почтовых журналах сервера (местоположение сервера почтового журнала может варьироваться от сервера к серверу, как объяснено выше). Если вы находитесь на сервере общего хостинга, порты 25 и 587 остаются заблокированными по умолчанию. Этот блок специально сделан вашим хостинг-провайдером. Это верно даже для некоторых выделенных серверов. Когда эти порты заблокированы, попробуйте подключиться через порт 2525. Если вы обнаружите, что этот порт также заблокирован, то единственное решение - связаться с вашим хостинг-провайдером, чтобы разблокировать эти порты.
Большинство провайдеров хостинга блокируют эти порты электронной почты, чтобы защитить свою сеть от отправки спам-писем.
Используйте порты 25 или 587 для простых соединений / TLS и порт 465 для соединений SSL. Для большинства пользователей предлагается использовать порт 587, чтобы избежать ограничений скорости, установленных некоторыми хостинг-провайдерами.
Не используйте оператор подавления ошибок
Когда оператор подавления ошибок
@
добавляется к выражению в PHP, любые сообщения об ошибках, которые могут быть сгенерированы этим выражением, будут игнорироваться. Существуют обстоятельства, когда использование этого оператора необходимо, но отправка почты не входит в их число.Если ваш код содержит,
@mail(...)
то вы можете скрывать важные сообщения об ошибках, которые помогут вам отладить это. Удалите@
и посмотрите, нет ли сообщений об ошибках.Рекомендуется только тогда, когда вы проверяете
error_get_last()
сразу же на предмет конкретных сбоев.Проверьте
mail()
возвращаемое значениеmail()
Функция:Это важно отметить, потому что:
FALSE
возвращаемое значение, вы знаете, что ошибка заключается в том, что ваш сервер принимает вашу почту. Вероятно, это не проблема кодирования, а проблема конфигурации сервера. Вам нужно поговорить с системным администратором, чтобы узнать, почему это происходит.TRUE
возвращаемое значение, это не значит, что ваше письмо обязательно будет отправлено. Это просто означает, что письмо было успешно отправлено соответствующему обработчику на сервере PHP. Еще больше точек сбоя вне контроля PHP, которые могут привести к тому, что письмо не будет отправлено.Таким образом,
FALSE
это поможет направить вас в правильном направлении, в то времяTRUE
как не обязательно означает, что ваше письмо было успешно отправлено. Это важно отметить!Убедитесь, что ваш хостинг-провайдер позволяет отправлять электронную почту и не ограничивает отправку почты
Многие совместно используемые веб-хостинги, особенно поставщики бесплатных веб-хостингов, либо не разрешают отправлять электронные письма со своих серверов, либо ограничивают объем, который можно отправлять в течение любого заданного периода времени. Это связано с их усилиями по ограничению использования спамерами более дешевых услуг.
Если вы считаете, что ваш хост имеет ограничения по электронной почте или блокирует отправку электронной почты, проверьте их часто задаваемые вопросы, чтобы увидеть, если они перечисляют какие-либо такие ограничения. В противном случае вам может потребоваться обратиться в службу поддержки, чтобы проверить, существуют ли какие-либо ограничения в отношении отправки электронных писем.
Проверять папки со спамом; запретить помечать письма как спам
Часто по разным причинам электронные письма, отправляемые через PHP (и другие серверные языки программирования), попадают в папку спама получателя. Всегда проверяйте это перед устранением неисправностей вашего кода.
Чтобы не отправлять почту, отправляемую через PHP, в папку спама получателя, вы можете делать разные вещи, как в коде PHP, так и в других случаях, чтобы свести к минимуму вероятность того, что ваши письма будут помечены как спам. Хорошие советы от Michiel de Mare включают в себя:
См. Как убедиться, что электронная почта, которую вы отправляете программно, не помечается как спам? больше на эту тему.
Убедитесь, что все почтовые заголовки поставляются
Некоторые спам-программы отклоняют почту, если в ней отсутствуют общие заголовки, такие как «От» и «Ответить»:
Убедитесь, что заголовки почты не имеют синтаксических ошибок
Недействительные заголовки так же плохи, как и отсутствие заголовков. Один неверный символ может быть все, что нужно, чтобы сорвать вашу электронную почту. Перепроверьте, чтобы убедиться, что ваш синтаксис правильный, так как PHP не поймает эти ошибки за вас.
Не используйте поддельного
From:
отправителяХотя в письме должен быть отправитель From :, вы не можете просто использовать какое-либо значение. В частности, адреса отправителей, отправленных пользователями, являются надежным способом заблокировать почту:
Причина: ваш веб-сервер или почтовый сервер не занесен в белый список SPF / DKIM, чтобы притворяться ответственным за адреса @hotmail или @gmail. Он может даже молча отбрасывать письма с
From:
доменами отправителей, для которых он не настроен.Убедитесь в правильности значения получателя
Иногда проблема так же проста, как неправильное значение для получателя письма. Это может быть связано с использованием неверной переменной.
Другой способ проверить это - жестко закодировать значение получателя в
mail()
вызов функции:Это может относиться ко всем
mail()
параметрам.Отправить на несколько аккаунтов
Чтобы исключить проблемы с учетной записью электронной почты, отправьте свою электронную почту на несколько учетных записей электронной почты у разных поставщиков электронной почты . Если ваши электронные письма не поступают на учетную запись Gmail пользователя, отправьте те же электронные письма на учетную запись Yahoo, Hotmail и обычную учетную запись POP3 (например, на учетную запись электронной почты, предоставленную интернет-провайдером).
Если электронные письма поступают на все или на некоторые другие учетные записи электронной почты, вы знаете, что ваш код отправляет электронные письма, но вполне вероятно, что поставщик учетной записи электронной почты по какой-то причине блокирует их. Если электронная почта не поступает ни в одну учетную запись электронной почты, проблема, скорее всего, связана с вашим кодом.
Убедитесь, что код соответствует методу формы
Если вы установили для своего метода формы значение
POST
, убедитесь, что вы используете его$_POST
для поиска значений формы. Если вы установилиGET
или не установили его вообще, убедитесь, что вы используете его$_GET
для поиска значений формы.Убедитесь, что
action
значение вашей формы указывает на правильное местоположениеУбедитесь, что ваш
action
атрибут формы содержит значение, которое указывает на ваш почтовый код PHP.Убедитесь, что веб-хостинг поддерживает отправку электронной почты
Некоторые провайдеры веб-хостинга не разрешают или не разрешают отправку электронной почты через свои серверы. Причины этого могут быть разными, но если они отключили отправку почты, вам нужно будет использовать альтернативный метод, который использует третье лицо для отправки этих писем за вас.
В электронном письме к их технической поддержке (после посещения их онлайн-поддержки или FAQ) должно быть указано, доступны ли возможности электронной почты на вашем сервере.
Убедитесь, что
localhost
почтовый сервер настроенЕсли вы разрабатываете на своей локальной рабочей станции с использованием WAMP, MAMP или XAMPP, сервер электронной почты, вероятно, не установлен на вашей рабочей станции. Без такового PHP не может отправлять почту по умолчанию.
Вы можете преодолеть это, установив базовый почтовый сервер. Для Windows вы можете использовать бесплатную Mercury Mail .
Вы также можете использовать SMTP для отправки ваших писем. Посмотрите этот замечательный ответ от Викаса Двиведи, чтобы узнать, как это сделать.
Включить PHP на заказ
mail.log
В дополнение к вашему журналу MTA и PHP, вы можете включить ведение журнала специально для этой
mail()
функции . Он не записывает полное взаимодействие SMTP, но, по крайней мере, параметры вызова функции и сценарий вызова.Смотрите http://php.net/manual/en/mail.configuration.php для деталей. (Лучше всего включить эти опции в
php.ini
или.user.ini
или,.htaccess
возможно.)Проверьте с помощью службы тестирования почты
Существуют различные службы доставки и проверки на спам, которые вы можете использовать для проверки настроек MTA / веб-сервера. Как правило, вы отправляете почтовое исследование по адресу: их адрес, затем получаете отчет о доставке и более конкретные сбои или анализ позже:
Используйте другой почтовик
Встроенная
mail()
функция PHP удобна и часто выполняет свою работу, но имеет свои недостатки . К счастью, есть альтернативы, которые предлагают больше мощности и гибкости, включая решение многих проблем, описанных выше:Все это можно сочетать с профессиональным SMTP-сервером / поставщиком услуг. (Поскольку типичные планы общего веб-хостинга 08/15 ударились или пропали, когда дело доходит до настройки / конфигурирования электронной почты.)
источник
mail()
, он делает такую плохую работу и сложнее отлаживать, чем любая другая почтовая библиотекаДобавьте почтовый заголовок в функцию mail:
источник
источник
Если для отправки электронной почты вы используете конфигурацию SMTP, попробуйте использовать PHPMailer . Вы можете скачать библиотеку с https://github.com/PHPMailer/PHPMailer .
Я создал свою электронную почту, отправляя таким образом:
источник
Просто добавьте несколько заголовков перед отправкой почты:
И еще кое-что.
mail()
Функция не работает в локальном хосте. Загрузите свой код на сервер и попробуйте.источник
$from = 'From: yoursite.com';
которая не похожа на полный действительный адрес электронной почты, там нет локальной части. Вы заменили заголовок From и добавили дополнительные. Вернее,$from
вышесказанное в вашем примере излишне. И быть уродливым было, вероятно, оригинальной проблемой ОП.Он работал для меня на 000webhost следующим образом:
Введите адрес электронной почты непосредственно при отправке электронной почты:
Используйте
''
и нет""
.Этот код работает, но письмо было получено с задержкой в полчаса.
источник
В основном
mail()
функция отключена на виртуальном хостинге. Лучшим вариантом является использование SMTP. Лучшим вариантом будет Gmail или SendGrid.SMTPconfig.php
SMTPmail.php
contact_email.php
источник
Если вы используете только эту
mail()
функцию, вам необходимо заполнить файл конфигурации.Вам нужно открыть почтовое расширение, установить
SMTP smtp_port
и так далее, и самое главное, ваше имя пользователя и ваш пароль. Без этого почта не может быть отправлена. Также вы можете использоватьPHPMail
класс для отправки.источник
Попробуйте эти две вещи по отдельности и вместе:
if($_POST['submit']){}
$from
(только моя кишка)источник
Я думаю, что это должно сработать. Я просто добавил
if(isset
и добавил конкатенацию к переменным в теле, чтобы отделить PHP от HTML.источник
Для тех, кто считает, что это идет вперед, я бы не рекомендовал использовать
mail
. Есть некоторые ответы, которые касаются этого, но не причина этого.mail
Функция PHP не только непрозрачна, она полностью зависит от того, какой MTA вы используете (например, Sendmail ) для выполнения работы.mail
будет только сказать вам , если АПС не смог принять его (т.е. Sendmail был вниз , когда вы пытались отправить). Он не может сказать вам, была ли почта успешной, потому что она была передана. Как таковой (как ответ Джона Конде подробности ), теперь вы можете поиграть с журналами MTA и надеяться, что он достаточно расскажет вам о невозможности его исправить. Если вы используете общий хост или не имеете доступа к журналам MTA, вам не повезло. К сожалению, по умолчанию для большинства ванильных установок для Linux это так.Почтовая библиотека ( PHPMailer , Zend Framework 2+ и т. Д.) Делает нечто очень отличное от
mail
. Они открывают сокет непосредственно на принимающий почтовый сервер, а затем отправляют SMTP-команды прямо через этот сокет. Другими словами, класс действует как собственный MTA (обратите внимание, что вы можете указать библиотекам использоватьmail
для окончательной отправки почты, но я настоятельно рекомендую вам не делать этого).Это означает, что вы можете сразу увидеть ответы от принимающего сервера (например, в PHPMailer вы можете включить отладочный вывод ). Больше не нужно гадать, не удалось ли отправить письмо или почему.
Вы также получаете преимущество лучшего интерфейса. С
mail
вы должны настроить все заголовки, приложение и т.д. С библиотекой, есть специальная функция , чтобы сделать это. Это также означает, что функция выполняет все сложные части (например, заголовки).источник
источник
Вы можете использовать конфигурационную электронную почту от CodeIgniter . Например, используя SMTP (простой способ):
Меня устраивает!
источник
Попробуй это
источник
Возможно проблема в настройке почтового сервера. Чтобы избежать подобных проблем или вам не нужно беспокоиться о проблеме с почтовым сервером, я рекомендую вам использовать PHPMailer .
Это плагин, который имеет все необходимое для отправки почты, и единственное, что вы должны принять во внимание, это включить SMTP-порт (порт: 25 и 465).
источник
Убедитесь, что на вашем сервере установлен Sendmail.
Если вы проверили свой код и убедились, что в этом нет ничего плохого, перейдите в / var / mail и проверьте, пуста ли эта папка.
Если он пуст, вам нужно будет сделать:
если вы находитесь на сервере Ubuntu.
источник
Во-первых, у вас может быть слишком много параметров для функции mail () ... У вас может быть максимум пять,
mail(to, subject, message, headers, parameters);
Что касается
$from
переменной, то она должна автоматически исходить от вашего веб-хоста, если вы используете Linux cPanel . Он автоматически приходит от вашего имени пользователя и IP-адреса cPanel.Также убедитесь, что у вас есть правильный порядок переменных в вашей функции mail ().
В
mail($to, $subject, $message, etc.)
таком порядке, иначе есть шанс, что он не работает.источник
Если у вас возникают проблемы с отправкой писем с помощью PHP, рассмотрите альтернативу, такую как PHPMailer или SwiftMailer .
Я обычно использую SwiftMailer всякий раз, когда мне нужно отправлять письма с PHP.
Основное использование:
См. Официальную документацию для получения дополнительной информации о том, как использовать SwiftMailer.
источник
Для тех, кто не хочет использовать внешние почтовые программы и хочет использовать mail () на выделенном сервере Linux.
О том, как работает PHP-почта, описано
php.ini
в разделе[mail function]
.Параметр
sendmail-path
описывает, как вызывается sendmail. Значением по умолчанию являетсяsendmail -t -i
, так что если вы получите работуsendmail -t -i < message.txt
в консоли Linux - все будет готово. Вы также можете добавитьmail.log
в debug и убедиться, что mail () действительно вызывается.Различные MTA могут реализовать
sendmail
. Они просто делают символическую ссылку на свои двоичные файлы на это имя. Например, в Debian по умолчанию используется Postfix . Сконфигурируйте свой MTA для отправки почты и протестируйте его с консоли с помощьюsendmail -v -t -i < message.txt
. Файлmessage.txt
должен содержать все заголовки сообщения и тело, адрес получателя для конверта будет взят изTo:
заголовка. Пример:Я предпочитаю использовать ssmtp в качестве MTA, потому что он прост и не требует запуска демона с открытыми портами. ssmtp подходит только для отправки почты с локального хоста . Он также может отправлять проверенные электронные письма через вашу учетную запись в общедоступной почтовой службе. Установите ssmtp и отредактируйте файл конфигурации
/etc/ssmtp/ssmtp.conf
. Чтобы иметь возможность также получать локальную системную почту на учетные записи Unix (например, оповещения для root от заданий cron), настройте/etc/ssmtp/revaliases
файл.Вот моя конфигурация для моего аккаунта на яндекс почте:
источник
Это затронет только небольшую группу пользователей, но я бы хотел, чтобы это было задокументировано для этой небольшой группы. Этот член этой маленькой кучки потратил 6 часов на устранение неполадок в рабочем почтовом скрипте PHP из-за этой проблемы.
Если вы собираетесь в университет, в котором работает XAMPP с сайта www.AceITLab.com, вы должны знать, что наш профессор не сказал нам: брандмауэр AceITLab (не брандмауэр Windows) блокирует MercuryMail в XAMPP. Вам придется использовать альтернативный почтовый клиент, груша работает на нас. Вам придется отправить на учетную запись Gmail с низкими настройками безопасности.
Да, я знаю, это совершенно бесполезно для реальной электронной почты. Однако из того, что я видел, академические условия и реальный мир часто имеют мало общего.
источник
Если вы запускаете этот код на локальном сервере (т.е. на вашем компьютере в целях разработки), он не отправит электронное письмо получателю. Это создаст
.txt
файл в папке с именемmailoutput
.В случае, если вы используете бесплатную услугу шланг, как
000webhost
илиhostinger
, эти поставщики услуг отключитьmail()
функцию, чтобы предотвратить непреднамеренное использование спуфинга электронной почты, рассылки спама и т. Д. Я предпочитаю связаться с ними, чтобы узнать, поддерживают ли они эту функцию.Если вы уверены, что поставщик услуг поддерживает функцию mail (), вы можете проверить это руководство по PHP для дальнейшего использования,
PHP mail ()
Чтобы проверить, поддерживает ли ваш хостинг функцию mail (), попробуйте запустить этот код (не забудьте изменить адрес электронной почты получателя) :
источник
Отправить почтуУстановка для Debian 10.0.0 («Buster») была на самом деле тривиальной!
php.ini
Стандартная установка пакета sendmail (с разрешением «отправить»):
Разные полезные команды:
Подтверждение (возможности отправки)
Вышеуказанное заняло около 5 минут. Тогда я потратил впустую 5 часов ... Не забудьте проверить папку со спамом !
источник
Есть несколько возможностей:
Вы столкнулись с проблемой сервера. На сервере нет почтового сервера. Так что ваша почта не работает, потому что ваш код в порядке, и почта работает с типом.
Вы не получаете объявленную ценность. Попробуйте свой код со статическим значением.
Использовать почту SMTP для отправки почты ...
источник
Вы можете использовать libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
источник
mail()
оболочка функции. Добавляет только конструкцию сообщения и некоторые уловки.Вы можете увидеть свои ошибки по:
И мой пример кода:
источник
SMTPDebug = 0
не полезно Обычный «пароль» также не будет работать с GMail. Этот ответ не очень помогает здесь.Если ваша система sendmail работает, ваш код должен быть изменен следующим образом:
Это позволяет отправлять электронные письма в формате HTML.
Из заметного интереса:
Примечание:
<<<EOB
синтаксис требует, чтобы последний маркер EOB начинался как начало строки и не имел пробела или другого символа после точки с запятой.источник