Почтовая функция PHP не завершает отправку электронной почты

php html email


<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $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. Код отправляет отлично, но никогда не отправляет электронное письмо. Как я могу это исправить?




Answer 1 John Conde


Хотя есть части этого ответа, которые относятся только к использованию самой функции mail() , многие из этих шагов по устранению неполадок могут быть применены к любой почтовой системе PHP.

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

Убедитесь,что отчет об ошибках включен и настроен на отчет обо всех ошибках.

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

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

Смотрите Как я могу получить полезные сообщения об ошибках в PHP? - этот ответ для более подробной информации по этому вопросу.

Убедитесь, что функция mail() вызвана

Это может показаться глупым, но распространенная ошибка заключается в том, чтобы забыть фактически поместить функцию mail() в ваш код. Убедитесь, что он там и не закомментирован.

Убедитесь, что функция mail() вызывается правильно

bool mail(строка $to,строка $subject,строка $message [,строка $additional_headers [,строка $additional_parameters ]]]).

Функция mail принимает три обязательных параметра и, опционально, четвертый и пятый. Если ваш вызов mail() не имеет хотя бы трех параметров, он потерпит неудачу.

Если ваш вызов mail() не имеет правильных параметров в правильном порядке, он также не будет выполнен.

Проверьте почтовые журналы сервера

Ваш веб-сервер должен регистрировать все попытки отправить электронную почту через него. Расположение этих журналов может отличаться (вам может потребоваться узнать у администратора сервера, где они находятся), но их обычно можно найти в корневом каталоге пользователя в разделе logs . Внутри будут сообщения об ошибках, о которых сообщал сервер, если таковые имеются, связанные с вашими попытками отправить электронную почту.

Проверьте,нет ли проблем с подключением к порту

Блок портов-очень распространенная проблема,с которой сталкивается большинство разработчиков при интеграции своего кода для доставки сообщений по SMTP.И это можно легко отследить на сервере почтовых логов (расположение сервера почтовых логов может варьироваться от сервера к серверу,как объяснялось выше).В случае,если вы находитесь на сервере общего хостинга,порты 25 и 587 по умолчанию остаются заблокированными.Этот блок специально сделан вашим хостинг-провайдером.Это справедливо даже для некоторых выделенных серверов.Когда эти порты заблокированы,попробуйте подключиться через порт 2525.Если вы обнаружите,что порт также заблокирован,то единственным решением будет связаться с вашим хостинг-провайдером,чтобы разблокировать эти порты.

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

Используйте порты 25 или 587 для соединений plainTLS и порт 465 для соединений SSL.Для большинства пользователей рекомендуется использовать порт 587,чтобы избежать ограничений по скорости,установленных некоторыми хостинг-провайдерами.

Не используйте оператор подавления ошибок

Когда к выражению в PHP добавляется оператор подавления ошибок @ , любые сообщения об ошибках, которые могут быть сгенерированы этим выражением, будут игнорироваться. Существуют обстоятельства, когда использование этого оператора необходимо, но отправка почты не входит в их число.

Если ваш код содержит @mail(...) то вы можете скрывать важные сообщения об ошибках, которые помогут вам отладить это. Удалите @ и посмотрите, нет ли ошибок.

Рекомендуется только тогда, когда вы проверяете с помощью error_get_last() сразу после этого на предмет конкретных сбоев.

Проверьте mail() возвращаемое значение

Функция mail() :

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

Это важно отметить,потому что:

  • Если вы получаете FALSE возвращаемое значение, вы знаете, что ошибка заключается в том, что ваш сервер принимает вашу почту. Вероятно, это не проблема кодирования, а проблема конфигурации сервера. Вам нужно поговорить с системным администратором, чтобы узнать, почему это происходит.
  • Если вы получаете TRUE возвращаемое значение, это не значит, что ваше письмо обязательно будет отправлено. Это просто означает, что письмо было успешно отправлено соответствующему обработчику на сервере PHP. Еще больше точек сбоя вне контроля PHP, которые могут привести к тому, что письмо не будет отправлено.

Так FALSE поможет сориентировать вас в правильном направлении , в то время как TRUE , это не обязательно означает , что ваша электронная почта была успешно отправлена. Это важно отметить!

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

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

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

Проверьте папки для спама;не допускайте,чтобы письма были помечены как спам.

Часто по разным причинам письма,отправленные через PHP (и другие серверные языки программирования),попадают в папку спама получателя.Всегда проверяйте там,прежде чем устранять неполадки с вашим кодом.

Чтобы избежать отправки почты через PHP в папку спама получателя, вы можете делать разные вещи, как в своем коде PHP, так и в других случаях, чтобы свести к минимуму вероятность того, что ваши письма будут помечены как спам. Хорошие советы от Michiel de Mare включают в себя:

  • Используйте методы аутентификации электронной почты, такие как SPF и DKIM, чтобы доказать, что ваши электронные письма и ваше доменное имя принадлежат друг другу, и предотвратить подделку вашего доменного имени. На веб-сайте SPF есть мастер для создания информации DNS для вашего сайта.
  • Проверьте ваш обратный DNS , чтобы убедиться , что IP - адрес почтового сервера точек на имя домена , который используется для отправки почты.
  • Убедитесь, что используемый вами IP-адрес отсутствует в черном списке
  • Убедитесь,что ответ на адрес является действительным,существующим адресом.
  • Используйте полное, настоящее имя адресата в поле «Кому», а не только адрес электронной почты (например, "John Smith" <[email protected]> ).
  • Отслеживайте свои аккаунты для злоупотреблений,такие как [email protected] и [email protected]Это означает-убедиться,что эти аккаунты существуют,прочитать то,что им прислали,и принять меры по жалобам.
  • Наконец, сделайте так, чтобы отписаться было действительно легко. В противном случае ваши пользователи откажутся от подписки, нажав кнопку спама , и это повлияет на вашу репутацию.

См. Как убедиться, что электронная почта, которую вы отправляете программно, не помечается автоматически как спам? больше на эту тему.

Убедитесь,что все почтовые заголовки

Некоторые программы для борьбы со спамом будут отклонять почту,если в ней отсутствуют общие заголовки,такие как "From" (От)и "Reply-to" (Ответить на):

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

Убедитесь,что в почтовых заголовках нет синтаксических ошибок.

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

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

Не используйте поддельные From: отправитель

Хотя в письме должен быть отправитель From :, вы не можете просто использовать какое-либо значение. В частности, адреса отправителей, отправленных пользователями, являются надежным способом заблокировать почту:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Причина: ваш веб-сервер или почтовый сервер не занесен в белый список SPF / DKIM, чтобы притворяться ответственным за адреса @hotmail или @gmail. Он может даже молча уронить письма с From: отправитель доменами не настроены на.

Убедитесь,что значение получателя верно

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

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

Другой способ проверить это - жестко закодировать значение получателя в вызов функции mail() :

mail('[email protected]', $subject, $message, $headers); 

Это может применяться ко всем параметрам mail() .

Отправить на несколько счетов

Чтобы исключить проблемы с учетной записью электронной почты, отправьте свою электронную почту на несколько учетных записей электронной почты у разных поставщиков электронной почты . Если ваши электронные письма не поступают на учетную запись Gmail пользователя, отправьте те же электронные письма на учетную запись Yahoo, Hotmail и обычную учетную запись POP3 (например, на учетную запись электронной почты, предоставленную интернет-провайдером).

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

Убедитесь,что код соответствует форме

Если вы установили для своего метода формы значение POST , убедитесь, что вы используете $_POST для поиска значений формы. Если вы установили GET или не установили его вообще, убедитесь, что вы используете $_GET для поиска значений формы.

Убедитесь, что значение action формы указывает на правильное местоположение

Убедитесь, что ваш атрибут action формы содержит значение, которое указывает на ваш почтовый код PHP.

<form action="send_email.php" method="POST">

Убедитесь,что веб-хост поддерживает отправку электронной почты

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

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

Убедитесь, что localhost почтовый сервер настроен

Если вы разрабатываете на локальной рабочей станции с использованием WAMP,MAMP или XAMPP,почтовый сервер,скорее всего,не установлен на вашей рабочей станции.Без него PHP не может отправлять почту по умолчанию.

Вы можете преодолеть это, установив базовый почтовый сервер. Для Windows вы можете использовать бесплатную Mercury Mail .

Вы также можете использовать SMTP для отправки ваших писем. Посмотрите этот замечательный ответ от Викаса Двиведи, чтобы узнать, как это сделать.

Включить PHP mail.log

В дополнение к файлу журнала МТА и PHP, вы можете включить ведение журнала для mail() функции в частности. Он не записывает полное взаимодействие SMTP, но, по крайней мере, параметры вызова функции и сценарий вызова.

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

Смотрите http://php.net/manual/en/mail.configuration.php для деталей. (Лучше всего включить эти опции в php.ini или .user.ini или .htaccess , возможно.)

Проверьте в службе тестирования почты

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

Использовать другой почтовый ящик

Встроенная в PHP функция mail() удобна и часто выполняет свою работу, но у нее есть свои недостатки . К счастью, есть альтернативы, которые предлагают большую мощность и гибкость, включая решение многих проблем, описанных выше:

Все это может быть объединено с профессиональным поставщиком услуг SMTP-серверов.(Потому что типичные 0815 общие планы веб-хостинга попадают или пропускаются,когда дело доходит до настройки электронной почты).




Answer 2 er.irfankhan11


Добавьте почтовый заголовок в функцию почты:

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}



Answer 3 sonam gupta


  1. Всегда пытайтесь отправлять заголовки в функции почты.
  2. Если вы отправляете почту через localhost,выполните настройки SMTP для отправки почты.
  3. Если вы отправляете почту через сервер,проверьте,включена ли на вашем сервере функция отправки почты.



Answer 4 oneDerer


Если для отправки электронной почты вы используете конфигурацию SMTP, попробуйте использовать PHPMailer . Вы можете скачать библиотеку с https://github.com/PHPMailer/PHPMailer .

Я создал свою электронную почту,отправляя ее таким образом:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "[email protected]"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}



Answer 5 user1258544


Просто добавьте несколько заголовков перед отправкой почты:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

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

И еще кое-что. Функция mail() не работает в localhost. Загрузите свой код на сервер и попробуйте.