2.24.11. Проверка работы исходящей почты через SMTP
- Создайте с помощью файл-менеджера или любого FTP-клиента в корневом каталоге сайта файл
test.php
с таким кодом:<?php $login = 'test@example.com'; // замените test@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.ukraine.com.ua через порт 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); // закрытие соединения ?>
Внимание! Обязательно подставьте в скрипт:
- Запустите созданный скрипт, обратившись к нему через браузер по адресу вида
www.ваш.сайт/test.php
. - В почтовом ящике, указанном вместо
to@example.com
, проверьте наличие письма, которое должен был отправить тестовый скрипт.
Важные моменты:
- Аккаунты Gmail имеют разные системы защиты, которые могут мешать подключению к SMTP-серверу Google. Для работы тестового скрипта как минимум необходимо: отключить двухэтапную аутентификацию и разрешить подключение к аккаунту ненадёжных приложений. Для корректной работы скрипта могут также потребоваться дополнительные действия с настройками безопасности аккаунта.
- Скрипт и библиотека из примера не собирают данные доступа и информацию об аккаунте.
- Подключитесь к хостингу по SSH.
- Перейдите в каталог сайта, где будет размещаться тестовый скрипт (вместо
example.com/www
укажите свои данные):cd ~/example.com/www/
- Установите библиотеку PHPMailer:
composer require phpmailer/phpmailer
- Отключите двухэтапную аутентификацию в аккаунте Google. Без этого подключение по SMTP работать не будет.
- Разрешите подключение к аккаунту ненадёжных приложений. Без этого подключение по SMTP работать не будет.
- Создайте с помощью файл-менеджера или любого FTP-клиента в корневом каталоге сайта файл
test.php
с таким кодом:<?php $login = 'test@gmail.com'; // замените test@gmail.com на адрес электронной почты, с которого производится отправка (поскольку логин совпадает с адресом отправителя - данная переменная используется и как логин, и как адрес отправителя) $password = 'password'; // замените 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(); }
Внимание! Обязательно подставьте в скрипт:
- Запустите созданный скрипт, обратившись к нему через браузер по адресу вида
www.ваш.сайт/test.php
. - В почтовом ящике, указанном вместо
to@example.com
, проверьте наличие письма, которое должен был отправить тестовый скрипт.