Реализация сохранения данных формы в базе и отправки на email

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация сохранения данных формы в базе и отправки на email
Простая
~1 рабочий день
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Реализация сохранения данных формы в базе и отправки на email

Любая форма на сайте — обратная связь, заявка, опрос — требует двух вещей: надёжного хранения и оперативного уведомления. Сохранять только в базу — риск пропустить заявку при сбое почты. Слать только на email — потерять данные при проблемах с SMTP. Правильная схема делает оба канала независимыми.

Структура таблицы

Минимальная таблица для хранения заявок с формы:

CREATE TABLE form_submissions (
    id          BIGSERIAL PRIMARY KEY,
    form_type   VARCHAR(64) NOT NULL,
    payload     JSONB NOT NULL,
    ip          INET,
    user_agent  TEXT,
    sent_at     TIMESTAMPTZ,
    created_at  TIMESTAMPTZ DEFAULT now()
);

CREATE INDEX idx_form_submissions_form_type ON form_submissions(form_type);
CREATE INDEX idx_form_submissions_created_at ON form_submissions(created_at DESC);

payload в JSONB позволяет хранить произвольную структуру без миграций при каждом изменении формы. sent_at — метка успешной отправки email, NULL означает «ещё не отправлено» или «отправка упала».

Серверная обработка (PHP/Laravel)

// app/Http/Controllers/FormController.php
public function submit(Request $request): JsonResponse
{
    $validated = $request->validate([
        'name'    => 'required|string|max:255',
        'email'   => 'required|email|max:255',
        'phone'   => 'nullable|string|max:32',
        'message' => 'required|string|max:4000',
    ]);

    // 1. Сохраняем в базу сразу — независимо от почты
    $submission = FormSubmission::create([
        'form_type'  => 'contact',
        'payload'    => $validated,
        'ip'         => $request->ip(),
        'user_agent' => $request->userAgent(),
    ]);

    // 2. Отправляем email через очередь
    Mail::to(config('mail.admin_address'))
        ->queue(new FormSubmissionMail($submission));

    return response()->json(['ok' => true]);
}

Ключевой момент: ->queue() вместо ->send(). Очередь означает, что сбой SMTP не вернёт 500 пользователю — заявка уже в базе, письмо уйдёт при следующей попытке.

Mailable

// app/Mail/FormSubmissionMail.php
class FormSubmissionMail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    public function __construct(public FormSubmission $submission) {}

    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'Новая заявка: ' . $this->submission->form_type,
            replyTo: [
                new Address($this->submission->payload['email'],
                            $this->submission->payload['name']),
            ],
        );
    }

    public function content(): Content
    {
        return new Content(view: 'emails.form-submission');
    }
}

replyTo заполняется из данных пользователя — менеджер нажимает «Ответить» и письмо уходит сразу на клиента, а не на no-reply адрес сайта.

Отметка об успешной отправке

Слушатель события MessageSent обновляет поле sent_at:

// app/Listeners/MarkSubmissionSent.php
public function handle(MessageSent $event): void
{
    $message = $event->message;
    // извлекаем submission_id из заголовка X-Submission-Id
    $id = $message->getHeaders()->get('X-Submission-Id')?->getValue();
    if ($id) {
        FormSubmission::where('id', $id)
            ->whereNull('sent_at')
            ->update(['sent_at' => now()]);
    }
}

Заявки с sent_at = NULL можно периодически перепосылать через Artisan-команду или просматривать в административной панели.

Повторная отправка упавших писем

// app/Console/Commands/RetryUnsentSubmissions.php
// Запускается каждые 15 минут через планировщик
$submissions = FormSubmission::whereNull('sent_at')
    ->where('created_at', '<', now()->subMinutes(5))
    ->limit(50)
    ->get();

foreach ($submissions as $submission) {
    Mail::to(config('mail.admin_address'))
        ->queue(new FormSubmissionMail($submission));
}

Защита от спама

CSRF-токен обязателен по умолчанию в Laravel. Дополнительно — honeypot-поле и rate limiting:

Route::post('/contact', FormController::class)
    ->middleware(['throttle:5,1']); // 5 запросов в минуту с одного IP

Для высоконагруженных форм — reCAPTCHA v3 или Turnstile от Cloudflare (без видимой капчи).

Что настраивается

  • Таблица и индексы под конкретную схему данных
  • Шаблон письма в HTML с брендингом клиента
  • Настройка SMTP/Mailgun/SES в .env
  • Supervisor для обработки очереди
  • Дашборд просмотра заявок в админке (опционально)

Срок реализации базовой версии — 1 рабочий день. С дашбордом просмотра заявок и повторной отправкой — 2–3 дня.