Receber um formulário no e-mail

Receber um formulário no e-mail6 min de leitura

Envie um formulário para vários endereços de e-mail

Mande um formulário por e-mail para a equipe toda, ou encaminhe cada mensagem à pessoa certa pelo assunto, sem deixar o próprio formulário escolher quem recebe.

Preet SutharFundador, Ikiform

Adicione cada pessoa como destinatária do formulário no painel: membros do workspace marcando-os, e qualquer outra pessoa por um link de confirmação, até 10 endereços. Cada um recebe a própria cópia de cada envio. Para mandar perguntas de vendas para uma pessoa e de suporte para outra, faça o roteamento por um campo num webhook.

O que muda aqui

Scripts PHP antigos e alguns serviços de formulário deixam o formulário indicar os próprios destinatários, com um campo oculto to ou cc. É prático, e também é assim que formulários de contato viram relays de spam: um bot muda o campo oculto e o seu servidor manda e-mail para quem ele quiser, a partir do seu domínio. O Ikiform não tem campo de destinatário. Quem recebe e-mail é definido no painel, e qualquer pessoa de fora do seu workspace precisa confirmar antes.

Isso deixa dois trabalhos diferentes, resolvidos em lugares diferentes:

Você querOnde se fazLimite
Todos recebem todos os enviosDestinatários nas configurações de Notifications do formulário10 endereços por formulário
Cada envio vai para a pessoa certaUm webhook que lê um campo e manda e-mail para uma equipe3 endpoints de webhook por workspace

Envie cada envio para a equipe toda

Um envio, um e-mail por destinatárioseu formulárioum envioIkiformdefine destinatáriosmembros marcadose-mails verificados doworkspaceendereços de foraconfirmados por linkdevolvidos oupendentespuladosenvioUm envio, um e-mail por destinatárioseuformulárioum envioIkiformdefinedestinatáriosmembrosmarcadose-mails verificadosdo workspaceendereços deforaconfirmados porlinkdevolvidos oupendentespuladosenvio
  1. O formulário envia uma vez ao Ikiform.
  2. O Ikiform monta a lista de destinatários: os membros marcados para este formulário, ou o padrão do workspace, mais os endereços de fora que confirmaram.
  3. Os duplicados são removidos e a lista para em 10.
  4. Cada destinatário recebe um e-mail separado, então ninguém vê os endereços dos outros.
  5. Endereços que ainda aguardam confirmação, e endereços pausados após uma devolução, são pulados.
Cópias separadas significam que a resposta de uma pessoa não copia os outros. Decida quem responde o quê antes de adicionar cinco pessoas.
  1. Abra o formulário no painel, depois Settings e Notifications. Confira se Email new submissions está ligado.
  2. Marque cada membro do workspace que deve receber e-mail. Só membros com endereço verificado aparecem na lista.
  3. Para quem é de fora do workspace, digite o endereço em Add someone outside the workspace e clique em Send link. Você pode adicionar 5 por formulário.
  4. Peça para a pessoa confirmar. Até ela confirmar, a linha dela diz Waiting for confirmation e ela não recebe nada.

Destinatários de fora veem os campos do envio e um link para cancelar a inscrição; eles não recebem um link para o painel, porque não têm conta. Membros recebem um botão View submission. Se alguém sair, remova a linha da pessoa; se ela cancelar a inscrição, a linha some também.

Precisa de mais de 10 pessoas, ou de uma equipe que muda com frequência? Adicione um único endereço compartilhado, como um Google Group ou um alias de e-mail, como o único destinatário e gerencie lá quem faz parte.

Membros e endereços de fora

Os dois tipos de destinatário se comportam de forma diferente, o que importa na hora de decidir quem adicionar onde:

ItemMembro do workspaceEndereço de fora
Adicionado porMarcá-lo no formulárioSend link, depois a confirmação da pessoa
Vê no e-mailOs campos e um botão View submissionOs campos e um link para cancelar a inscrição
Pode abrir o painelSimNão
Para de receber e-mail quandoVocê o desmarca, ou ele sai do workspaceVocê remove a linha, ou a pessoa cancela a inscrição
Conta paraO limite de 10 endereçosO limite de 10 endereços e os 5 endereços de fora por formulário

Dê às pessoas que respondem as mensagens um assento no workspace, para que vejam envios anteriores e o spam. Use endereços de fora para quem só precisa ficar sabendo, como um gestor ou uma caixa compartilhada.

Encaminhe cada envio pelo assunto

Os destinatários não podem depender do que o visitante escolheu. Para isso, adicione um campo que nomeia a equipe e deixe um pequeno handler de webhook escolher o endereço. Este é o formulário:

contact.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="department">Who should read this?</label>
  <select id="department" name="department" required>
    <option value="sales">Sales</option>
    <option value="support">Support</option>
    <option value="billing">Billing</option>
  </select>

  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required />

  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="5" required></textarea>

  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>

Defina department como um campo select no painel, para que um envio só possa trazer sales, support ou billing. Um bot que envia qualquer outra coisa recebe 422 validation_failed e nunca chega ao seu handler.

Depois, o handler. Ele verifica a assinatura, escolhe a equipe a partir de department e envia pelo seu próprio provedor de e-mail, aqui o Resend. Como é você quem envia o e-mail, você também escolhe o assunto:

app/api/route-message/route.ts
import { Resend } from "resend";
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";

const resend = new Resend(process.env.RESEND_API_KEY);

const TEAMS: Record<string, string[]> = {
  sales: ["sales@example.com"],
  support: ["support@example.com", "oncall@example.com"],
  billing: ["accounts@example.com"],
};

export async function POST(request: Request) {
  const payload = await request.text();
  try {
    const event = await verifyWebhook({
      payload,
      headers: request.headers,
      secret: process.env.IKIFORM_WEBHOOK_SECRET!,
    });
    if (event.type !== "submission.created") return new Response(null, { status: 204 });

    const fields = event.data.fields;
    const department = String(fields.department ?? "support");
    const { error } = await resend.emails.send(
      {
        from: "Website <forms@example.com>",
        to: TEAMS[department] ?? TEAMS.support,
        replyTo: typeof fields.email === "string" ? fields.email : undefined,
        subject: `[${department}] ${String(fields.name ?? "New message")}`,
        text: Object.entries(fields)
          .map(([key, value]) => `${key}: ${String(value)}`)
          .join("\n"),
      },
      { idempotencyKey: event.id },
    );
    if (error) return new Response(error.message, { status: 502 });
    return new Response(null, { status: 204 });
  } catch (error) {
    if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
    throw error;
  }
}
  • Os endereços ficam no seu código, não no formulário. Um visitante escolhe o nome de uma equipe, nunca um endereço.
  • replyTo mantém o Reply apontando para o visitante, como o próprio e-mail do Ikiform faz.
  • idempotencyKey: event.id faz uma entrega repetida não enviar nada novo. O Ikiform tenta de novo uma entrega que não recebe 2xx, com o mesmo id.
  • Um 502 quando o provedor falha diz ao Ikiform para tentar mais tarde, então uma instabilidade curta não faz uma mensagem se perder.
  • Departamentos desconhecidos ou ausentes caem no suporte em vez de descartar a mensagem.

Adicione a URL em Webhooks no painel e copie o segredo whsec_ dela para IKIFORM_WEBHOOK_SECRET. A documentação de webhooks explica as novas tentativas e o payload. Prefere sem código? Um fluxo no Zapier ou no n8n com um filtro por departamento faz o mesmo.

Mantenha o e-mail do próprio Ikiform ligado para uma pessoa, como reserva, ou desligue Email new submissions para ninguém receber a mensagem duas vezes.

Confira se funciona

  1. Confira cada linha de destinatário nas configurações de Notifications do formulário. Nenhuma deve dizer Waiting for confirmation.
  2. Preencha o formulário na sua página e envie. Você cai na sua página de agradecimento, ou na hospedada pelo Ikiform.
  3. Cada destinatário recebe o próprio e-mail. Peça a um deles para conferir a linha To: ela mostra só o endereço dele.
  4. Se você faz o roteamento por webhook, envie uma vez por departamento e confira o log de entregas em Webhooks. Cada uma mostra succeeded.
  5. Envie com o honeypot preenchido, _gotcha=bot. Ele ainda recebe uma resposta de sucesso, mas o envio é armazenado como spam e não dispara e-mail nem webhook.

Pegadinhas

  • Sem CC nem BCC. Cada destinatário recebe uma mensagem separada, então não há conversa compartilhada. Combinem quem responde, ou façam o roteamento pelo assunto.
  • O limite conta envios, não destinatários. Passando de 50 envios por hora num formulário, todos os destinatários recebem o resumo no lugar.
  • Mudanças na equipe. Quando alguém sai do workspace, para de receber e-mail na hora. Confira os destinatários do formulário depois de uma mudança na equipe, para o formulário não ficar mandando e-mail para ninguém.
  • Um endereço devolvido fica pausado. A linha mostra Emails bounced com uma data, e os e-mails para ele voltam depois disso. Corrija o endereço ou remova-o.
  • Nada vai para o visitante. O Ikiform não envia e-mail para quem preenche o formulário. Os e-mails de notificação vão só para você e sua equipe, então não há resposta automática, e-mail de confirmação nem double opt-in. Envie esses e-mails pela sua ferramenta de e-mail, disparados por um webhook.

Perguntas

Travou em algum passo ou quer um guia para o seu caso? Envie um e-mail para hello@ikiform.com.