Отправка email через SMTP сервер Gmail из PHP скрипта
Почему mail() не подходит для Gmail?
Функция mail() использует локальный почтовый сервер (Sendmail, Postfix и т.д.). На локальном сервере его часто нет, а на хостинге письма попадают в спам из-за отсутствия SPF/DKIM записей. Gmail требует аутентификации по SMTP, поэтому нужен специальный клиент.
Лучшее решение: PHPMailer
PHPMailer — это самая популярная библиотека для отправки почты из PHP. Она поддерживает SMTP с авторизацией, SSL/TLS, HTML-письма, вложения и работает стабильно с Gmail.
Пошаговая инструкция
1. Установка PHPMailer через Composer
Откройте терминал в корне проекта и выполните:
composer require phpmailer/phpmailer
Если Composer не установлен, скачайте PHPMailer вручную с GitHub и подключите через require.
2. Настройка Gmail
Google блокирует вход с обычным паролем для скриптов. Вам нужно:
- Включить двухфакторную аутентификацию в аккаунте Google.
- Создать пароль приложения:
- Перейдите в Настройки безопасности → Пароли приложений.
- Выберите "Другое" и введите имя (например, "PHP скрипт").
- Скопируйте сгенерированный 16-значный пароль.
3. Рабочий код отправки
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php'; // Если через Composer
// require 'PHPMailer/src/PHPMailer.php'; // Если вручную
$mail = new PHPMailer(true);
try {
// Настройки SMTP
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'your-email@gmail.com'; // Ваш Gmail
$mail->Password = 'your-app-password'; // Пароль приложения
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // или 'ssl'
$mail->Port = 587; // TLS — 587, SSL — 465
// Отправитель и получатель
$mail->setFrom('your-email@gmail.com', 'Ваше имя');
$mail->addAddress('recipient@example.com', 'Имя получателя');
// Контент письма
$mail->isHTML(true);
$mail->Subject = 'Тема письма';
$mail->Body = '<h1>Привет!</h1><p>Это HTML письмо.</p>';
$mail->AltBody = 'Текстовая версия для почтовых клиентов без HTML';
$mail->send();
echo 'Письмо отправлено успешно!';
} catch (Exception $e) {
echo "Ошибка: {$mail->ErrorInfo}";
}
?>
Важные моменты
- Пароль приложения — обычный пароль Gmail не подойдёт.
- SSL vs TLS: порт 587 с TLS надёжнее и реже блокируется.
- Отладка: включите
$mail->SMTPDebug = SMTP::DEBUG_SERVER;для просмотра логов. - Ограничения Gmail: не более 500 писем в день и 100 получателей за одно письмо.
Этот код гарантированно работает с Gmail. Если письмо не доходит — проверьте папку "Спам" и корректность пароля приложения.
<<Альтернативный подход: SwiftMailer (устаревший)
Ранее популярной альтернативой PHPMailer была библиотека SwiftMailer. Однако с 2021 года она не поддерживается, и я рекомендую использовать только PHPMailer. Но если по каким-то причинам вы работаете с легаси-кодом, вот пример:
<?php
require_once 'vendor/autoload.php';
$transport = (new Swift_SmtpTransport('smtp.gmail.com', 587, 'tls'))
->setUsername('your-email@gmail.com')
->setPassword('your-app-password');
$mailer = new Swift_Mailer($transport);
$message = (new Swift_Message('Тема письма'))
->setFrom(['your-email@gmail.com' => 'Ваше имя'])
->setTo(['recipient@example.com'])
->setBody('<h1>Привет!</h1>', 'text/html')
->addPart('Текстовая версия', 'text/plain');
$result = $mailer->send($message);
if ($result) {
echo 'Отправлено!';
}
?>
Без библиотек: через fsockopen
Можно отправить письмо напрямую через сокет, но это сложно и ненадёжно. Используйте готовые библиотеки — они уже содержат все обработки ошибок и шифрование.
Совет для формы обратной связи
Добавьте Google reCAPTCHA, чтобы защититься от спам-ботов, и проверяйте email через filter_var($_POST['email'], FILTER_VALIDATE_EMAIL).
Ответов пока нет.
Войдите чтобы оставить ответ