Avatar ·

Отправка email через SMTP сервер Gmail из PHP скрипта

Всем привет. Я пишу на PHP небольшой сайт-портфолио и мне нужно добавить форму обратной связи. Я хочу, чтобы при заполнении формы письмо приходило мне на Gmail. Я читал, что для этого нужно использовать SMTP сервер Google. Проблема в том, что стандартная функция mail() у меня не работает на локальном сервере (OpenServer), а на хостинге письма уходят в спам. Поэтому я решил отправлять через Gmail SMTP. Я нашел в интернете пример кода, но он не работает. Вот что я пробовал: ```php ``` Я понимаю, что это наивный подход, но я новичок. Подскажите, как правильно настроить отправку через SMTP Gmail с использованием PHP? Нужно ли устанавливать какие-то библиотеки? И как быть с безопасностью? Слышал, что Google блокирует "менее безопасные приложения". Буду благодарен за подробный пример рабочего кода с пояснениями. Теги: php, email, smtp, gmail, форма обратной связи <<>>

Почему 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.
  • Создать пароль приложения:
    1. Перейдите в Настройки безопасности → Пароли приложений.
    2. Выберите "Другое" и введите имя (например, "PHP скрипт").
    3. Скопируйте сгенерированный 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).