<?php
// --- НАСТРОЙКИ (замените на свои данные Яндекса) ---
$smtp_server = "ssl://smtp.yandex.ru";
$port = 465;
$username = 'miltorg@yandex.ru'; // Ваш полный адрес
$password = ''; // ПАРОЛЬ ПРИЛОЖЕНИЯ (не от аккаунта! Брать в Яндексе)
$to = 'miltorg@gmail.com';
// --------------------------------------------------
echo "Подключение к $smtp_server...\n";
$socket = fsockopen($smtp_server, $port, $errno, $errstr, 15);
if (!$socket) die("Ошибка соединения: $errstr ($errno)\n");
function send_cmd($sock, $cmd) {
if ($cmd) fwrite($sock, $cmd . "\r\n");
$data = "";
while ($str = fgets($sock, 515)) {
$data .= $str;
if (substr($str, 3, 1) == " ") break;
}
echo "S: $data";
return $data;
}
send_cmd($socket, ""); // Приветствие
send_cmd($socket, "EHLO localhost");
send_cmd($socket, "AUTH LOGIN");
send_cmd($socket, base64_encode($username));
send_cmd($socket, base64_encode($password));
send_cmd($socket, "MAIL FROM:<$username>");
send_cmd($socket, "RCPT TO:<$to>");
send_cmd($socket, "DATA");
$subject_text = "Тема на русском языке";
$encoded_subject = "=?UTF-8?B?" . base64_encode($subject_text) . "?=";
$headers = "From: <$username>\r\n";
$headers .= "To: <$to>\r\n";
$headers .= "Subject: $encoded_subject\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=utf-8\r\n";
$headers .= "Content-Language: ru\r\n"; // Явно указываем язык контента
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
// 2. Тело письма
$html_body = "Привет!Теперь тема должна быть видна.";
// 3. Соединяем: Заголовки + ПУСТАЯ СТРОКА + Тело + ТОЧКА
// Важно: между заголовками и телом письма (\r\n\r\n)
send_cmd($socket, $headers . "\r\n" . $html_body . "\r\n.");
send_cmd($socket, "QUIT");
fclose($socket);
echo "Завершено.\n";
================================
smtp - это практически основной протокол для ОТПРАВКИ писем.
В Друпале есть модуль для отправки писем: /smtpdrupal
Всё можно делать Сокетами, но это долго и нудно.
Функция mail() в PHP — это «обертка», которая сама по себе не умеет отправлять письма. Она делегирует эту задачу внешней программе или другому серверу, в зависимости от операционной системы и настроек в файле php.ini.
То есть - mail() жестко привязана к серверу, но сама по себе не несёт ничего и просто передаёт параметры.
На сервере тоже могут быть любые настройки - как через отправку с помощью внутренних программ сервера, так и при помощи внешних почтовых серверов. Если mail() запрещена в php - то получается что запрещена только обёртка для одной из программ сервера. Но это не мешает в php запретить также и системные команды отправки почты.
===========
~$ cat .msmtprc
account default
logfile /home/drupal1/.msmtp-default.log
host smtp.yandex.ru
port 587
from mail@example.com
user mail@example.com
password **********
auth on
keepbcc off
tls on
tls_starttls on
tls_certcheck off
==========
Наличие файла .msmtprc означает, что на вашем сервере настроена утилита msmtp. И все программы будут пытаться работать прежде всего через неё.
1. Как это работает технически
Ваш сервер использует метод «SMTP-клиента».
Когда любая программа (например, Drupal, PHP-функция mail() или скрипт на Perl) пытается отправить письмо «локально», утилита msmtp перехватывает этот запрос, берет данные из этого конфига и пересылает письмо через внешний сервер Яндекса (smtp.yandex.ru), например.
Как проверить работу прямо сейчас?
Попробуйте отправить тестовое письмо из командной строки:
bash
echo "Hello, this is a test" | msmtp recipient@example.com
Используйте код с осторожностью.
Затем загляните в лог-файл, указанный в конфиге: cat /home/drupal1/.msmtp-default.log. Там будет зафиксирован результат отправки.
==========
