Mail в PHP: как отправить email из формы

Короткий ответ: mail() в PHP отправляет email через почтовую систему сервера. Для учебной формы нужно принять данные через $_POST, проверить их, собрать тему и текст письма, указать заголовки и вызвать mail($to, $subject, $message, $headers)

Важно: mail() не является полноценным почтовым клиентом. На локальном компьютере она часто не работает без настройки почтового сервера, а на хостинге может требовать корректный адрес отправителя на домене сайта

Минимальный пример

<?php

$to = 'admin@example.com';
$subject = 'Тестовое письмо';
$message = 'PHP отправил тестовое письмо';
$headers = 'From: site@example.com';

if (mail($to, $subject, $message, $headers)) {
    echo 'Письмо отправлено';
} else {
    echo 'Письмо не отправлено';
}

Этот пример показывает сам вызов mail(), но для реального сайта нужно проверять данные пользователя и аккуратно собирать заголовки

Форма обратной связи

Создайте файл contact.php

<?php

$result = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name'] ?? '');
    $email = trim($_POST['email'] ?? '');
    $text = trim($_POST['text'] ?? '');

    if ($name === '' || $email === '' || $text === '') {
        $result = 'Заполните все поля';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $result = 'Укажите корректный email';
    } else {
        $to = 'admin@example.com';
        $subject = 'Сообщение с сайта';
        $message = "Имя: {$name}\nEmail: {$email}\n\n{$text}";
        $headers = "From: site@example.com\r\nReply-To: {$email}";

        $result = mail($to, $subject, $message, $headers)
            ? 'Сообщение отправлено'
            : 'Не удалось отправить сообщение';
    }
}
?>

<!doctype html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Форма на PHP</title>
</head>
<body>
    <?php if ($result !== ''): ?>
        <p><?php echo htmlspecialchars($result, ENT_QUOTES, 'UTF-8'); ?></p>
    <?php endif; ?>

    <form method="post">
        <input type="text" name="name" placeholder="Ваше имя">
        <input type="email" name="email" placeholder="Ваш email">
        <textarea name="text" placeholder="Сообщение"></textarea>
        <button type="submit">Отправить</button>
    </form>
</body>
</html>

В этом примере форма отправляет POST-запрос в тот же файл. PHP проверяет поля, валидирует email и только после этого вызывает mail()

Почему письмо может не прийти

Даже если mail() вернула true, это не гарантирует доставку во входящие. Это значит только, что PHP передал письмо почтовой системе сервера

Письмо может не прийти из-за нескольких причин

  • на локальном компьютере не настроена отправка почты
  • хостинг блокирует отправку с неподтвержденного адреса
  • письмо ушло в спам
  • домен не настроен для отправки почты
  • в заголовках указан чужой From
  • сервер отключил функцию mail

На коммерческом сайте для надежной отправки лучше использовать SMTP через библиотеку вроде PHPMailer или Symfony Mailer

From и Reply-To

Новички часто ставят в From email пользователя из формы. Это может ухудшить доставляемость, потому что сервер сайта пытается отправить письмо как будто от имени чужого домена

Лучше так

$headers = "From: site@example.com\r\nReply-To: {$email}";

From — адрес вашего сайта, Reply-To — адрес пользователя, на который можно ответить

Мини-практика

Сделайте форму с полями name, email и text. Сначала проверьте пустые поля и неправильный email, затем отправьте письмо на свой адрес. Если работаете локально и письмо не приходит, перенесите файл на тестовый хостинг или используйте SMTP-библиотеку

Частые ошибки

Ждут работу mail на любом локальном компьютере Без почтовой настройки локальная отправка часто не работает

Не проверяют email Перед отправкой используйте filter_var($email, FILTER_VALIDATE_EMAIL)

Ставят пользовательский email в From Для From лучше использовать адрес на домене сайта

Не экранируют вывод результата Любой текст, который выводится в HTML, пропускайте через htmlspecialchars()

Что почитать дальше по PHP

Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x