PHP-функция mail не завершает отправку электронной почты
У меня возникла проблема при создании простого формы отправки письма. Форма расположена на странице index.html
, но отправляется на отдельную страницу "спасибо за ваше сообщение" — thankyou.php
, где размещен предложенный выше код на PHP.
Код выполняется нормально, и форма успешно отправляется, но письмо так и не приходит. Как я могу это исправить?
5 ответ(ов)
Чтобы добавить заголовки к письму в функции mail()
, вы можете использовать следующий код, который вы привели. Здесь создается строка заголовков, а затем передается в функцию mail()
.
$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>';
}
В этом примере:
- Заголовок
From
указывает адрес отправителя. MIME-Version
иContent-Type
позволяют указать тип содержимого письма и кодировку.X-Priority
задает приоритет письма.
После того как заголовки составлены, они передаются в функцию mail()
, которая отправляет письмо. Если отправка прошла успешно, вы увидите сообщение "Ваше письмо отправлено", иначе будет выведено сообщение об ошибке.
Убедитесь, что вы заменили "[email protected]"
на действительный адрес электронной почты, а переменные $to
, $subject
и $message
определены и содержат соответствующие значения.
Для успешной отправки почты в PHP, вот несколько рекомендаций:
- Всегда старайтесь отправлять заголовки с функцией mail().
- Если вы отправляете почту через localhost, убедитесь, что у вас настроены SMTP параметры для отправки почты.
- Если вы отправляете почту через сервер, проверьте, включена ли функция отправки почты на вашем сервере.
Вы можете добавить заголовки перед отправкой письма следующим образом:
<?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; charset=UTF-8\r\n"; // Указываем тип контента
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $body, $headers); // Обратите внимание, что здесь передается $body, а не $message
Существует еще один важный момент. Функция mail()
может не работать на локальном сервере (localhost). Если у вас возникают проблемы, попробуйте загрузить код на удаленный сервер и выполните его там.
Это сработало для меня на 000webhost следующим образом:
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: " . $from . "\r\n";
$headers .= "Reply-To: " . $from . "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";
При отправке электронной почты просто введите адрес получателя напрямую:
mail('[email protected]', $subject, $message, $headers);
Обратите внимание, что следует использовать ''
, а не ""
.
Этот код работает, однако email был получен с задержкой в полчаса.
В большинстве случаев функция mail()
отключена на совместном хостинге. Лучшим вариантом является использование SMTP. Наилучший вариант – это Gmail или SendGrid.
SMTPconfig.php
<?php
$SmtpServer = "smtp.*.*";
$SmtpPort = "2525"; // стандартный порт
$SmtpUser = "***";
$SmtpPass = "***";
?>
SMTPmail.php
<?php
class SMTPClient
{
function SMTPClient($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
{
$this->SmtpServer = $SmtpServer;
$this->SmtpUser = base64_encode($SmtpUser);
$this->SmtpPass = base64_encode($SmtpPass);
$this->from = $from;
$this->to = $to;
$this->subject = $subject;
$this->body = $body;
// Задаем порт SMTP по умолчанию, если он не указан
$this->PortSMTP = empty($SmtpPort) ? 25 : $SmtpPort;
}
function SendMail()
{
$newLine = "\r\n";
$headers = "MIME-Version: 1.0" . $newLine;
$headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;
// Открываем соединение с SMTP сервером
if ($SMTPIN = fsockopen($this->SmtpServer, $this->PortSMTP))
{
fputs($SMTPIN, "EHLO " . $_SERVER['HTTP_HOST'] . "\r\n");
fgets($SMTPIN, 1024);
fputs($SMTPIN, "auth login\r\n");
fgets($SMTPIN, 1024);
fputs($SMTPIN, $this->SmtpUser . "\r\n");
fgets($SMTPIN, 1024);
fputs($SMTPIN, $this->SmtpPass . "\r\n");
fgets($SMTPIN, 256);
fputs($SMTPIN, "MAIL FROM: <" . $this->from . ">\r\n");
fgets($SMTPIN, 1024);
fputs($SMTPIN, "RCPT TO: <" . $this->to . ">\r\n");
fgets($SMTPIN, 1024);
fputs($SMTPIN, "DATA\r\n");
fgets($SMTPIN, 1024);
fputs($SMTPIN, "To: <" . $this->to . ">\r\nFrom: <" . $this->from . ">\r\n" . $headers . "\n\nSubject: " . $this->subject . "\r\n\r\n\r\n" . $this->body . "\r\n.\r\n");
fgets($SMTPIN, 256);
// Закрываем соединение и выходим
fputs($SMTPIN, "QUIT\r\n");
fclose($SMTPIN);
}
return $talk;
}
}
?>
contact_email.php
<?php
include('SMTPconfig.php');
include('SMTPmail.php');
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$to = ""; // Укажите получателя
$from = $_POST['email'];
$subject = "Запрос";
$body = $_POST['name'] . '</br>' . $_POST['companyName'] . '</br>' . $_POST['tel'] . '</br>' . '<hr />' . $_POST['message'];
$SMTPMail = new SMTPClient($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
$SMTPChat = $SMTPMail->SendMail();
}
?>
Такой подход позволяет обойти ограничения, связанные с использованием функции mail()
, и обеспечивает более надежную отправку писем через SMTP. Не забудьте заменить параметры подключения вашими данными.
Как расположить div внизу своего контейнера?
Как получить расширение файла в PHP?
Установить фиксированную ширину столбца таблицы независимо от количества текста в ячейках?
Как читать большой файл построчно?
Как сделать перенос строки с помощью CSS, не используя <br />?