С целью борьбы со спамом многие хостеры накладывают ограничение на использование стандартной функции PHP mail():
- Ограничивают количество отправляемых писем (в день, в час, ваш вариант)
- Требуют наличия почтового ящика у себя (раз отправляете от нашего имени, тогда храните почту у нас)
- Или попросту рекомендуют использовать внешний SMTP сервер
Внешние SMTP сервера бывают разные, на мой взгляд удобнее всего работать с Gmail.
Для работы используем PHPMailer — полнофункциональный класс создания и передачи электронной почты для PHP.
PHPMailer намного удобнее стандартной функции PHP mail(), позволяет легко создавать HTML письма, прикладывать файлы к письмам, в итоге упрощает задачи по отправке почты.
Скачиваем PHPMailer, распаковываем и удобно именуем:
wget https://github.com/PHPMailer/PHPMailer/archive/master.zip
unzip master.zip
mv PHPMailer-master PHPMailer
А потом создаем скрипт:
<?php
// Импортируем классы PHPMailer в глобальное пространство имен
// Эти строки должны быть вначале скрипта, не внутри функции
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
$mail = new PHPMailer(true); // "true" включает работу исключений (exceptions)
try {
//Настройки сервера
$mail->SMTPDebug = 2; // "2" включает подробный вывод отладки. Отключить - "0"
$mail->isSMTP(); // Включаем SMTP
$mail->Host = 'smtp.gmail.com'; // задаем адрес SMTP сервера
$mail->SMTPAuth = true; // Включаем SMTP аутентификацию
$mail->Username = '[email protected]'; // имя пользователя
$mail->Password = 'gm41lp4$$w0rd'; // Пароль (https://myaccount.google.com/apppasswords)
$mail->SMTPSecure = 'ssl'; // Включаем SSL шифрование (или можно TLS для порта 587)
$mail->Port = 465; // Порт для подключения
//Задаем получателей
$mail->setFrom('[email protected]', 'SMTP Mailer'); //Задаем адрес и имя отправителя
$mail->addAddress('[email protected]', 'Gmail User'); // И адрес и имя получателя
//$mail->addAddress('[email protected]'); // Имя не обязательно
//$mail->addReplyTo('[email protected]', 'Info'); // Сюда будут приходить ответы
//$mail->addCC('[email protected]'); // копия
//$mail->addBCC('[email protected]'); //скрытая копия
//Приложения
//$mail->addAttachment('/var/tmp/file.tar.gz'); // Приложить файл
//$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Задать файлу имя
//Содержание
$mail->CharSet = 'UTF-8'; // Задаем кодировку, иначе письмо будет нечитабельным
$mail->isHTML(true); // Задаем HTML формат письма
$mail->Subject = 'Здесь будет тема письма';
$mail->Body = 'Здесь будет текст письма <b>в формате HTML</b>';
//$mail->AltBody = 'Здесь будет обычный текст письма для раритетных не-HTML клиентов.';
$mail->send();
echo 'Сообщение было отправлено';
} catch (Exception $e) {
echo 'Сообщение не отправлено.';
echo 'Ошибка: ' . $mail->ErrorInfo;
}
?>
При включенной двухэтапной аутентификации, следует создать пароль для приложения здесь: https://myaccount.google.com/apppasswords