Usar
mailto no atributo action de um formulário HTML é uma daquelas ideias que parecem razoáveis até você ver o que realmente acontece. Um atributo como
mailto html form nunca foi uma forma confiável de coletar envios de formulários de contato, e na maioria dos navegadores modernos ele simplesmente abre um cliente de email desktop ou não faz nada.
Índice de Conteúdo
Como o mailto em uma Ação de Formulário Realmente Funciona
Quando um navegador encontra
<form action="mailto:[email protected]" method="POST">
</form>, ele não envia uma requisição HTTP para um servidor. Em vez disso, tenta transferir os dados do formulário para qualquer cliente de email registrado no sistema operacional do usuário. Isso significa que tenta abrir Outlook, Apple Mail, Thunderbird ou o aplicativo para o qual o sistema operacional aponta.
A especificação HTML 4.01 do W3C realmente definiu esse comportamento, mas sempre foi marcado como um recurso descontinuado e pouco confiável. Navegadores modernos reduziram ou removeram completamente o suporte, e o comportamento varia muito dependendo do dispositivo e da configuração do sistema operacional.
Os Problemas Reais com a Ação de Formulário mailto
Veja o que dá errado na prática:
- A maioria dos visitantes não tem um cliente de email desktop configurado. A maioria das pessoas usa Gmail, Outlook.com ou outro serviço de email baseado na web. Quando o navegador tenta abrir um aplicativo de email nativo, nada acontece ou uma caixa de diálogo de erro aparece.
- Navegadores móveis lidam com isso de forma inconsistente. No iOS, tocar em enviar pode abrir o aplicativo Mail. No Android com Chrome, pode abrir o Gmail ou mostrar um diálogo de seleção. Em muitos dispositivos Android sem um aplicativo de email padrão configurado, simplesmente falha silenciosamente.
- Você nunca sabe se a mensagem foi enviada. Não há confirmação do servidor, nenhuma página de sucesso, nenhuma forma de verificar a entrega. Se o cliente de email do usuário falhar ao enviar, o envio é simplesmente perdido.
-
O formato dos dados é ilegível.
Os campos do formulário são codificados como texto codificado em URL no corpo do email, como
name=Jane+Doe&message=Hello+there. Sem formatação, sem rótulos, apenas strings codificadas. - Seu endereço de email fica exposto no código-fonte HTML. Qualquer pessoa que visualizar o código-fonte da sua página pode coletar seu endereço para spam. Não há ofuscação ou proteção.
- Sem filtro de spam no lado do formulário. Não há campo honeypot, nenhum gancho de CAPTCHA, nenhuma limitação de taxa. Bots que analisam HTML podem disparar envios diretamente.
-
Complicações com o atributo ENCTYPE.
A especificação exigia
enctype="text/plain"para formulários mailto, que é diferente do padrãoapplication/x-www-form-urlencodedusado por manipuladores de formulários reais. Essa inconsistência causa mais dores de cabeça na análise.
O Que o Navegador Realmente Envia
Para deixar o problema concreto, veja como um envio de formulário de contato com mailto se parece quando realmente chega a uma caixa de entrada. Dado um formulário com campos para nome e mensagem, o corpo do email chega como:
name=Jane+Doe
message=I+have+a+question+about+your+pricing
É todo o email. Nenhuma linha de assunto que você controle, nenhuma formatação HTML, nenhum rótulo claro. Se você tiver dez campos, receberá dez linhas de pares chave-valor codificados. Analisar isso manualmente é tedioso, e qualquer processamento automatizado requer trabalho extra que você não precisaria com um backend de formulário adequado.
Compare com receber um email limpo e formatado que diz "Nome: Jane Doe" e "Mensagem: Tenho uma pergunta sobre seus preços" com um carimbo de data/hora e o endereço de email do remetente já no campo De. É isso que um manipulador de formulário real oferece.
Uma Alternativa Melhor ao mailto para Formulários HTML
A abordagem correta é apontar o atributo
action do seu formulário para um endpoint HTTP real que aceita uma requisição POST, processa os dados no servidor e os encaminha para sua caixa de entrada. Isso é chamado de serviço de backend de formulário, e é a alternativa padrão ao mailto para sites estáticos.
Com um backend de formulário:
- O envio vai diretamente do navegador para um servidor via HTTPS, sem envolvimento de cliente de email.
- Você recebe uma página de confirmação ou redirecionamento após um envio bem-sucedido.
- Seu endereço de email nunca aparece no código-fonte HTML.
- Proteção básica contra spam, como um campo honeypot, pode ser adicionada sem JavaScript.
- Funciona de forma idêntica em desktop, dispositivos móveis e em todos os navegadores.
Essa abordagem funciona em qualquer host de site estático, incluindo GitHub Pages, Cloudflare Pages, Netlify e Vercel, porque o formulário em si ainda é HTML simples. O backend faz o trabalho no servidor para você.
action. Nenhum Node.js, nenhum PHP, nenhuma função serverless necessária.
Um Exemplo de Formulário HTML de Email Funcionando
Aqui está a diferença entre um formulário mailto quebrado e uma configuração de formulário HTML de email funcionando, lado a lado:
| Abordagem | Funciona em dispositivos móveis | Confirma entrega | Oculta seu email | Proteção contra spam |
|---|---|---|---|---|
mailto ação de formulário
|
Pouco confiável | Não | Não | Nenhuma |
| Endpoint de backend de formulário | Sim, sempre | Sim | Sim | Honeypot, limitação de taxa |
Um formulário de contato funcionando usando um backend de formulário se parece com isto:
<!-- Do NOT do this -->
<form action="mailto:[email protected]" enctype="text/plain">
<input name="name" type="text"/>
<textarea name="message"></textarea>
<button type="submit">Send</button>
</form>
<!-- Do this instead -->
<form action="https://sendform.net/en/!a8Kz3mXq12" method="POST">
<input name="email" placeholder="[email protected]" required="" type="email">
<textarea name="message" placeholder="Tell us more" required=""></textarea>
<button type="submit">Send</button>
</input></form>
O segundo formulário usa
method="POST" e aponta para um endpoint HTTPS real. O navegador envia os dados diretamente para o servidor, que os valida, os encaminha para sua caixa de entrada e redireciona o usuário para uma página de obrigado que você configura ou mostra sua própria confirmação. A
referência do formulário do MDN Web Docs
explica o conjunto completo de opções action e method se você quiser explorar o comportamento no nível da especificação.
Você também recebe extras opcionais como um campo honeypot para proteção contra spam e uma URL de redirecionamento configurável para a página pós-envio, tudo sem escrever uma única linha de JavaScript ou código no servidor. O
Padrão HTML Living do WHATWG
é a especificação atual e autorizada para como os envios de formulários funcionam, e deixa claro que
mailto nunca foi pensado como um mecanismo de formulário de contato para produção.
Substitua sua Ação de Formulário mailto por um Backend de Formulário Real
O Sendform.net oferece ao seu formulário HTML um endpoint HTTPS adequado para que os envios cheguem à sua caixa de entrada sempre, sem expor seu endereço de email ou depender de um cliente de email desktop. Abandone o formulário HTML mailto e tenha um formulário de contato funcionando em minutos.
Experimente o Sendform Grátis →
Depende inteiramente de o usuário ter um cliente de email nativo instalado e definido como o manipulador de email padrão. No Chrome e Firefox no Windows ou macOS com Outlook ou Apple Mail configurados, pode abrir o aplicativo de email. Em dispositivos móveis e para usuários que dependem de email baseado na web como Gmail, geralmente não faz nada ou mostra um erro. Você não pode prever qual resultado um determinado visitante experimentará, o que a torna completamente pouco confiável para um formulário de contato.
Não realmente. JavaScript pode interceptar o evento de envio do formulário e construir um link
mailto:
dinamicamente, mas isso ainda passa para o cliente de email do sistema operacional. Não resolve o problema central de que a maioria dos usuários não tem um cliente de email desktop configurado. Usar JavaScript para construir uma string
mailto:
e disparar
window.location.href
produz o mesmo resultado pouco confiável. O único reparo real é enviar os dados para um endpoint HTTP real em vez disso.
Porque o endereço de email é escrito diretamente no código-fonte HTML como parte do valor do atributo
action
. Qualquer pessoa que visualize o código-fonte da sua página, use as ferramentas do desenvolvedor de um navegador ou execute um raspador pode lê-lo instantaneamente. Bots de coleta de email procuram especificamente por padrões
mailto:
em HTML. Um backend de formulário oculta completamente seu endereço porque ele vive nas configurações da sua conta de backend, não na marcação da página.
Sim, é exatamente para isso que os serviços de backend de formulário foram projetados. Seus arquivos HTML permanecem completamente estáticos. O atributo
action
do formulário aponta para um endpoint HTTPS externo hospedado pelo serviço. Quando um usuário envia o formulário, o navegador envia a requisição POST diretamente para esse endpoint. Seus arquivos de site no GitHub Pages, Netlify, Vercel ou Cloudflare Pages não precisam mudar nada além de atualizar a URL do
action
.
Os requisitos variam por serviço, mas um backend de formulário típico precisa no mínimo de um campo de email (para que saiba para onde a resposta vai) e um campo de mensagem. Para o Sendform, os campos obrigatórios são um
<input/>
com
name="email"
contendo um endereço de email válido e um
<textarea>
</textarea> com
name="message"
de até 3000 caracteres. Campos adicionais podem ser incluídos e serão encaminhados no email de notificação, mas esses dois são o mínimo para que um envio seja aceito.
Com um backend de formulário, você configura uma URL de redirecionamento nas configurações da sua conta para esse formulário. Após um envio bem-sucedido, o serviço redireciona o navegador para a URL especificada, como
/thank-you.html
. Sem um redirecionamento configurado, o serviço retorna sua própria página de confirmação. De qualquer forma, o usuário sempre vê um estado de sucesso claro, algo que um formulário mailto nunca pode garantir.