5

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

17

У меня возникла проблема при создании простого формы отправки письма. Форма расположена на странице index.html, но отправляется на отдельную страницу "спасибо за ваше сообщение" — thankyou.php, где размещен предложенный выше код на PHP.

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

5 ответ(ов)

0

Чтобы добавить заголовки к письму в функции 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>';
}

В этом примере:

  1. Заголовок From указывает адрес отправителя.
  2. MIME-Version и Content-Type позволяют указать тип содержимого письма и кодировку.
  3. X-Priority задает приоритет письма.

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

Убедитесь, что вы заменили "[email protected]" на действительный адрес электронной почты, а переменные $to, $subject и $message определены и содержат соответствующие значения.

0

Для успешной отправки почты в PHP, вот несколько рекомендаций:

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

Вы можете добавить заголовки перед отправкой письма следующим образом:

<?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). Если у вас возникают проблемы, попробуйте загрузить код на удаленный сервер и выполните его там.

0

Это сработало для меня на 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 был получен с задержкой в полчаса.

0

В большинстве случаев функция 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. Не забудьте заменить параметры подключения вашими данными.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь