4.9.3. Проверка работы исходящей почты через SMTP

Для проверки защищённого соединения в строке 34 замените mail.adm.tools на ssl://mail.adm.tools и 25 на 465.

flowchart LR Хостинг-аккаунт-->|Порт 25|mail.adm.tools mail.adm.tools-->|Письмо|Получатель

  1. С помощью файл-менеджера или любого FTP-клиента в корневом каталоге сайта создайте файл smtp_test.php с таким кодом:
    <?php
    
    $login = 'from@example.com'; // вместо from@example.com укажите адрес созданного на хостинге почтового ящика
    $password = 'password'; // вместо password укажите пароль созданного на хостинге почтового ящика
    $to = 'to@example.com'; // вместо to@example.com укажите адрес получателя
    
    $text = "Привет, проверка связи по SMTP."; // содержимое отправляемого письма
    
    // функция получения кода ответа сервера
    function get_data($smtp_conn) {
        $data = "";
        while ($str = fgets($smtp_conn, 515)) {
            $data .= $str;
            if (substr($str, 3, 1) == " ") {
                break;
            }
        }
        return $data;
    }
    
    // формирование служебного заголовка письма
    $header = "Date: " . date("D, j M Y G:i:s") . " +0300\r\n";
    $header .= "From: =?UTF-8?Q?" . str_replace("+", "_", str_replace("%", "=", urlencode('Тестовый скрипт'))) . "?= <$login>\r\n";
    $header .= "X-Mailer: Test script hosting Ukraine.com.ua \r\n";
    $header .= "Reply-To: =?UTF-8?Q?" . str_replace("+", "_", str_replace("%", "=", urlencode('Тестовый скрипт'))) . "?= <$login>\r\n";
    $header .= "X-Priority: 3 (Normal)\r\n";
    $header .= "Message-ID: <12345654321." . date("YmjHis") . "@ukraine.com.ua>\r\n";
    $header .= "To: =?UTF-8?Q?" . str_replace("+", "_", str_replace("%", "=", urlencode('Получателю тестового письма'))) . "?= <$to>\r\n";
    $header .= "Subject: =?UTF-8?Q?" . str_replace("+", "_", str_replace("%", "=", urlencode('проверка'))) . "?=\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: text/plain; charset=UTF-8\r\n";
    $header .= "Content-Transfer-Encoding: 8bit\r\n";
    
    $smtp_conn = fsockopen("mail.adm.tools", 25, $errno, $errstr, 10); // соединение с почтовым сервером mail.adm.tools через порт 25
    if (!$smtp_conn) { print "Соединение с сервером не прошло"; fclose($smtp_conn); exit; }
    $data = get_data($smtp_conn);
    
    fputs($smtp_conn, "EHLO ukraine.com.ua\r\n"); // начало приветствия
    $code = substr(get_data($smtp_conn), 0, 3); // проверка, не вернул ли сервер ошибку
    if ($code != 250) { print "Ошибка приветствия EHLO"; fclose($smtp_conn); exit; }
    
    fputs($smtp_conn, "AUTH LOGIN\r\n"); // начало процедуры авторизации
    $code = substr(get_data($smtp_conn), 0, 3);
    if ($code != 334) { print "Сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit; }
    
    fputs($smtp_conn, base64_encode("$login") . "\r\n"); // отправка логина от почтового ящика (на хостинге он совпадает с именем почтового ящика)
    $code = substr(get_data($smtp_conn), 0, 3);
    if ($code != 334) { print "Ошибка доступа к такому пользователю"; fclose($smtp_conn); exit; }
    
    fputs($smtp_conn, base64_encode("$password") . "\r\n"); // отправка пароля
    $code = substr(get_data($smtp_conn), 0, 3);
    if ($code != 235) { print "Неправильный пароль"; fclose($smtp_conn); exit; }
    
    fputs($smtp_conn, "MAIL FROM:$login\r\n"); // отправка значения MAIL FROM
    $code = substr(get_data($smtp_conn), 0, 3);
    if ($code != 250) { print "Сервер отказал в команде MAIL FROM"; fclose($smtp_conn); exit; }
    
    fputs($smtp_conn, "RCPT TO:$to\r\n"); // отправка адреса получателя
    $code = substr(get_data($smtp_conn), 0, 3);
    if ($code != 250 AND $code != 251) { print "Сервер не принял команду RCPT TO"; fclose($smtp_conn); exit; }
    
    fputs($smtp_conn, "DATA\r\n"); // отправка команды DATA
    $code = substr(get_data($smtp_conn), 0, 3);
    if ($code != 354) { print "Сервер не принял DATA"; fclose($smtp_conn); exit; }
    
    fputs($smtp_conn, $header . "\r\n" . $text . "\r\n.\r\n"); // отправка тела письма
    $code = substr(get_data($smtp_conn), 0, 3);
    if ($code != 250) { print "Ошибка отправки письма"; fclose($smtp_conn); exit; }
    if ($code == 250) { print "Письмо отправлено успешно. Ответ сервера $code"; }
    
    fputs($smtp_conn, "QUIT\r\n"); // завершение отправки командой QUIT
    fclose($smtp_conn); // закрытие соединения
    ?>

    ⚠️ Обязательно подставьте в скрипт:

    • Вместо from@example.comназвание почтового ящика.
    • Вместо passwordпароль почтового ящика.
    • Вместо to@example.com — почта получателя.
  2. Запустите созданный скрипт, обратившись к нему через браузер по адресу вида example.com/smtp_test.php.
  3. Проверьте наличие тестового письма в почтовом ящике получателя.

Важные моменты:

  • Для подключения к почтовому ящику Gmail используется пароль приложения, не пароль аккаунта Google.
  • Скрипт и библиотека из примера не собирают данные доступа и информацию об аккаунте Google.

flowchart LR Хостинг-аккаунт-->|Порт 587|Gmail Gmail-->|Письмо|Получатель

  1. Подключитесь к хостингу по SSH.
  2. Перейдите в каталог сайта, где будет размещаться тестовый скрипт (вместо example.com/www укажите свои данные):
    cd ~/example.com/www/
  3. Установите библиотеку PHPMailer:
    composer require phpmailer/phpmailer
  4. Создайте пароль приложения для доступа к почтовому ящику Gmail.
  5. С помощью файл-менеджера или любого FTP-клиента в корневом каталоге сайта создайте файл gmail_test.php с таким кодом:
    <?php
    
    $login    = 'from@gmail.com'; // вместо from@gmail.com укажите адрес вашего почтового ящика Gmail
    $password = 'app_password'; // вместо app_password укажите созданный пароль приложения
    $to       = 'to@example.com'; // вместо to@example.com укажите адрес получателя
    
    use PHPMailer\PHPMailer\PHPMailer; 
    use PHPMailer\PHPMailer\SMTP; 
    use PHPMailer\PHPMailer\Exception;
    require_once __DIR__ . '/vendor/phpmailer/phpmailer/src/Exception.php'; 
    require_once __DIR__ . '/vendor/phpmailer/phpmailer/src/PHPMailer.php'; 
    require_once __DIR__ . '/vendor/phpmailer/phpmailer/src/SMTP.php';
    
    $mail = new PHPMailer(true);
    try {
        $mail->SMTPDebug = SMTP::DEBUG_SERVER;
        $mail->isSMTP();
        $mail->Host = 'smtp.gmail.com';
        $mail->SMTPAuth = true;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port = 587;
        $mail->Username = $login;
        $mail->Password = $password;
        $mail->setFrom($login, 'Hosting Ukraine user');
        $mail->addAddress($to, 'John Doe');
        $mail->addReplyTo($login, 'Hosting Ukraine user');
        $mail->Subject = "Gmail SMTP test";
        $mail->Body = 'Hi, test Gmail SMTP connection';
        $mail->send();
        echo "Email message sent.";
    } catch (Exception $e) {
        echo "Error in sending email. Mailer Error: {$mail->ErrorInfo}";
    } finally {
        $mail->smtpClose();
    }
  6. Запустите созданный скрипт, обратившись к нему через браузер по адресу вида example.com/gmail_test.php.
  7. Проверьте наличие тестового письма в почтовом ящике получателя.
Содержание