---
title: Guia rápido – Formulário que só envia e-mail (sem banco)
---

# Formulário que só envia e-mail

Formulário indicado para:

- inscrições simples em eventos
- contatos rápidos
- recebimento de informações pontuais de cidadãos

Sempre siga:

- usar Blade + Bootstrap (sem CSS/JS inline)
- usar `{{ __('texto') }}` em TODO texto visível
- separar responsabilidades (rota, controller, Request, Mailable, view)

---

## 1. Definir a rota

Crie as rotas no `routes/web.php` (ajuste o caminho/nome para o seu módulo):

```php
use App\Http\Controllers\Paginas\Formularios\FormularioContatoController;

Route::middleware(['web'])
    ->group(function () {
        Route::get('/contato', [FormularioContatoController::class, 'create'])
            ->name('paginas.contato.create');

        Route::post('/contato', [FormularioContatoController::class, 'store'])
            ->name('paginas.contato.store');
    });
```

- **GET** mostra o formulário
- **POST** processa, valida e envia o e-mail

---

## 2. Criar o Request de validação

Crie um Request dedicado (ex.: `app/Http/Requests/Paginas/Formularios/FormularioContatoRequest.php`):

```php
<?php

namespace App\Http\Requests\Paginas\Formularios;

use Illuminate\Foundation\Http\FormRequest;

class FormularioContatoRequest extends FormRequest
{
    public function authorize(): bool
    {
        // Formulário público – sem permissão especial
        return true;
    }

    public function rules(): array
    {
        return [
            'nome'   => ['required', 'string', 'max:255'],
            'email'  => ['required', 'email', 'max:255'],
            'assunto'=> ['required', 'string', 'max:255'],
            'mensagem' => ['required', 'string', 'max:5000'],
        ];
    }

    public function attributes(): array
    {
        return [
            'nome'     => __('Nome'),
            'email'    => __('E-mail'),
            'assunto'  => __('Assunto'),
            'mensagem' => __('Mensagem'),
        ];
    }
}
```

- Toda validação fica no Request (padrão do projeto).

---

## 3. Criar o Mailable

Crie um Mailable (ex.: `app/Mail/FormularioContatoMail.php`):

```php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class FormularioContatoMail extends Mailable
{
    use Queueable, SerializesModels;

    public array $dados;

    public function __construct(array $dados)
    {
        $this->dados = $dados;
    }

    public function build(): self
    {
        return $this
            ->subject(__('Novo contato recebido pelo site'))
            ->view('emails.formularios.contato');
    }
}
```

View de e-mail (ex.: `resources/views/emails/formularios/contato.blade.php`):

```blade
@php($dados = $dados ?? [])

<p><strong>{{ __('Nome') }}:</strong> {{ $dados['nome'] ?? '' }}</p>
<p><strong>{{ __('E-mail') }}:</strong> {{ $dados['email'] ?? '' }}</p>
<p><strong>{{ __('Assunto') }}:</strong> {{ $dados['assunto'] ?? '' }}</p>
<p><strong>{{ __('Mensagem') }}:</strong></p>
<p>{{ $dados['mensagem'] ?? '' }}</p>
```

---

## 4. Criar o Controller magro

Crie o controller (ex.: `app/Http/Controllers/Paginas/Formularios/FormularioContatoController.php`).

```php
<?php

namespace App\Http\Controllers\Paginas\Formularios;

use App\Http\Controllers\Controller;
use App\Http\Requests\Paginas\Formularios\FormularioContatoRequest;
use App\Mail\FormularioContatoMail;
use Illuminate\Support\Facades\Mail;

class FormularioContatoController extends Controller
{
    public function create()
    {
        return view('paginas.formularios.contato');
    }

    public function store(FormularioContatoRequest $request)
    {
        $dados = $request->validated();

        Mail::to(config('mail.formularios.contato_destino'))
            ->send(new FormularioContatoMail($dados));

        return redirect()
            ->route('paginas.contato.create')
            ->with('success', __('Mensagem enviada com sucesso.'));
    }
}
```

- Controller apenas orquestra fluxo (padrão do projeto).
- Se preferir seguir mais à risca a separação, crie um **Service** para a lógica de envio e apenas chame o Service aqui.

---

## 5. Criar a view Blade do formulário

Crie a view em `resources/views/paginas/formularios/contato.blade.php`.

Use os **componentes já existentes** no projeto (layouts, alerts, etc.). Exemplo simplificado com Bootstrap:

```blade
@extends('layouts.app')

@section('content')
    <div class="container">
        <h1>{{ __('Fale conosco') }}</h1>

        @if(session('success'))
            <div class="alert alert-success" role="alert">
                {{ session('success') }}
            </div>
        @endif

        <form action="{{ route('paginas.contato.store') }}" method="post">
            @csrf

            <div class="mb-3">
                <label for="nome" class="form-label">{{ __('Nome completo') }}</label>
                <input
                    type="text"
                    class="form-control @error('nome') is-invalid @enderror"
                    id="nome"
                    name="nome"
                    value="{{ old('nome') }}"
                    required
                >
                @error('nome')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>

            <div class="mb-3">
                <label for="email" class="form-label">{{ __('E-mail') }}</label>
                <input
                    type="email"
                    class="form-control @error('email') is-invalid @enderror"
                    id="email"
                    name="email"
                    value="{{ old('email') }}"
                    required
                >
                @error('email')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>

            <div class="mb-3">
                <label for="assunto" class="form-label">{{ __('Assunto') }}</label>
                <input
                    type="text"
                    class="form-control @error('assunto') is-invalid @enderror"
                    id="assunto"
                    name="assunto"
                    value="{{ old('assunto') }}"
                    required
                >
                @error('assunto')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>

            <div class="mb-3">
                <label for="mensagem" class="form-label">{{ __('Mensagem') }}</label>
                <textarea
                    class="form-control @error('mensagem') is-invalid @enderror"
                    id="mensagem"
                    name="mensagem"
                    rows="5"
                    required
                >{{ old('mensagem') }}</textarea>
                @error('mensagem')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>

            <button type="submit" class="btn btn-primary">
                {{ __('Enviar mensagem') }}
            </button>
        </form>
    </div>
@endsection
```

- Use componentes Blade já existentes (por exemplo, componentes de alertas ou layout padrão) em vez de duplicar HTML.

---

## 6. Configuração de e-mail

No `.env`, garanta as configurações de e-mail:

```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.seudominio.com
MAIL_PORT=587
MAIL_USERNAME=seu_usuario
MAIL_PASSWORD=sua_senha
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=nao-responda@angra.rj.gov.br
MAIL_FROM_NAME="Prefeitura de Angra dos Reis"
```

Crie (ou ajuste) um arquivo de configuração para os destinatários, por exemplo `config/mail.php`:

```php
// Exemplo dentro de config/mail.php
'formularios' => [
    'contato_destino' => env('MAIL_FORM_CONTATO_DESTINO', 'contato@angra.rj.gov.br'),
],
```

E defina no `.env`:

```env
MAIL_FORM_CONTATO_DESTINO=contato@angra.rj.gov.br
```

---

## 7. Exemplo mínimo funcional – resumo

1. **Rotas** `paginas.contato.create` (GET) e `paginas.contato.store` (POST).
2. **Request** `FormularioContatoRequest` com regras de validação.
3. **Mailable** `FormularioContatoMail` com view própria.
4. **Controller** magro chamando o Request e o Mailable.
5. **View Blade** com formulário Bootstrap, `@csrf`, `@error` e textos com `{{ __('...') }}`.
6. **Configuração de e-mail** em `.env` e `config/mail.php`.

Seguindo esses passos, você tem um formulário público simples, seguro e padronizado, que **não grava nada no banco**, apenas **envia e-mail** para o setor responsável.

