Comentar não é assinar a newsletter: consentimento separado, caixa desmarcada
Separe o comentário da inscrição na newsletter, registre o consentimento com data e texto exibido, confirme por e-mail e nunca reinscreva quem saiu. Com exemplo em Node e MySQL.
A pessoa deixou um comentário num post sobre Docker, agradecendo a dica. Na semana seguinte, recebeu a primeira oferta do curso. Na outra, mais duas. Ela nunca pediu newsletter: a caixinha "quero receber novidades" vinha marcada embaixo do formulário, e ninguém lê a letra miúda depois de escrever um comentário. A resposta curta: comentar autoriza o comentário, e só. Newsletter é um gesto separado, com caixa desmarcada, texto claro e confirmação por e-mail.
O atalho parece inofensivo porque aumenta a lista. Na prática, ele enche a lista de gente que não quer estar ali, que marca suas mensagens como spam, e isso derruba a entrega para quem queria receber.
Por que a caixa pré-marcada sai cara
Há três custos, e eles se somam.
Reputação de envio. Quem recebe e-mail que não pediu não procura o link de descadastro. Aperta "spam". Os provedores contam essas reclamações contra o seu domínio, e a reputação ruim afeta todas as mensagens, inclusive as transacionais se elas saem do mesmo lugar. O guia sobre e-mail transacional que chega e se entende explica por que vale separar os dois fluxos.
Confiança. A pessoa voltou ao blog para comentar porque gostou do conteúdo. Ela sai com a sensação de que foi enganada, e o próximo artigo bom chega com o rótulo de "aquele site que manda propaganda".
Base legal. A LGPD define consentimento como manifestação livre, informada e inequívoca, para uma finalidade determinada. Uma caixa que já vem marcada, colada num formulário com outra finalidade, dificilmente se sustenta como manifestação inequívoca de querer receber marketing. E é você quem precisa provar que o consentimento existiu.
Este texto explica o mecanismo prático; ele não substitui a orientação de um profissional de direito para o seu caso. A página da ANPD e o guia de adequação à LGPD em sistema pequeno são bons pontos de partida.
Como separar comentário e inscrição
- Peça no formulário só o que o comentário precisa. Nome, e-mail (se você usa para moderação ou para avisar de respostas) e o texto.
- Coloque a newsletter como opção separada e desmarcada. O texto diz o que é, com que frequência e como sair: "Quero receber o resumo semanal do DevBras por e-mail. Dá para sair com um clique."
- Trate "avisar respostas" como outra finalidade. Se você oferece aviso de resposta ao comentário, ele também é uma escolha própria, e não autoriza newsletter.
- Registre o consentimento. Data, origem, o texto exato que estava na tela e o e-mail. Sem registro, você não consegue provar nada depois.
- Confirme por e-mail antes de ativar. A dupla confirmação garante que o dono do endereço quis entrar, e não alguém digitando o e-mail de outra pessoa.
- Respeite quem saiu. Antes de criar inscrição, consulte a lista de supressão. Comentar de novo não reinscreve ninguém.
O formulário
<form method="post" action="/blog/docker-no-servidor-primeiro-passo/comentarios">
<label for="nome">Nome</label>
<input id="nome" name="nome" required maxlength="80">
<label for="email">E-mail (não aparece no comentário)</label>
<input id="email" name="email" type="email" required maxlength="190">
<label for="texto">Comentário</label>
<textarea id="texto" name="texto" required maxlength="4000"></textarea>
<label>
<input type="checkbox" name="newsletter" value="sim">
Quero receber o resumo semanal do DevBras por e-mail. Dá para sair com um clique.
</label>
<button type="submit">Publicar comentário</button>
</form>
Sem atributo checked. A caixa só fica marcada se a pessoa marcar.
O tratamento no servidor
const TEXTO_CONSENTIMENTO_V = 'newsletter-semanal-v3';
app.post('/blog/:slug/comentarios', express.urlencoded({ extended: false }), async (req, res, next) => {
const { nome, email, texto } = req.body;
const querNewsletter = req.body.newsletter === 'sim';
let conn;
try {
conn = await pool.getConnection();
await conn.beginTransaction();
await conn.execute(
'INSERT INTO comentarios (post_slug, nome, email, texto, status, criado_em) VALUES (?, ?, ?, ?, ?, NOW())',
[req.params.slug, nome, email, texto, 'moderacao']
);
if (querNewsletter) {
const [suprimido] = await conn.execute(
'SELECT 1 FROM supressao WHERE email = ? LIMIT 1',
[email]
);
if (suprimido.length === 0) {
await conn.execute(
'INSERT INTO consentimentos (email, finalidade, texto_versao, origem, criado_em) VALUES (?, ?, ?, ?, NOW())',
[email, 'newsletter', TEXTO_CONSENTIMENTO_V, 'comentario:' + req.params.slug]
);
await conn.execute(
'INSERT INTO fila_emails (tipo, destino, criado_em) VALUES (?, ?, NOW())',
['confirmar-newsletter', email]
);
}
}
await conn.commit();
res.redirect(303, '/blog/' + encodeURIComponent(req.params.slug) + '#comentario-enviado');
} catch (err) {
if (conn) await conn.rollback().catch(() => {});
next(err);
} finally {
if (conn) conn.release();
}
});
O que este código garante: o comentário é gravado sempre; a inscrição só nasce se a caixa veio marcada; quem está na lista de supressão não volta; e o consentimento fica registrado com a versão do texto exibido, para você saber o que a pessoa leu. A inscrição ainda não está ativa: ela só passa a valer quando a pessoa clicar no link de confirmação que o worker vai enviar a partir da fila_emails.
As consultas usam parâmetro (?), nunca concatenação. Se esse padrão não é familiar, veja Node.js e MySQL com parâmetro. Validação de tamanho e de formato do e-mail também precisa existir no servidor; os atributos do HTML são só conveniência.
Repare que a tela de retorno não diz se o e-mail estava suprimido. Ela só confirma que o comentário foi recebido. Informar "este e-mail já saiu da lista" revelaria a terceiros quem é inscrito.
A confirmação que ativa a inscrição
O e-mail de confirmação é curto e honesto. Assunto: "Confirme sua inscrição no resumo semanal do DevBras". Primeira linha: "Você pediu para receber o resumo semanal ao comentar no post sobre Docker. Se não foi você, ignore esta mensagem e nada acontece." Depois, um botão com texto claro: "Confirmar inscrição".
O link carrega um token aleatório, de uso único e com prazo. Ao ser clicado, o servidor marca o consentimento como confirmado, grava a data da confirmação e ativa a inscrição. Se o prazo passar sem clique, a inscrição pendente é apagada. No blog do exemplo, cerca de metade das caixas marcadas nunca foram confirmadas, e essa metade é justamente a que mais reclamaria.
Erros comuns
- Caixa de newsletter pré-marcada. A lista cresce com gente que não quer, e as reclamações de spam derrubam a entrega para todos.
- Usar o e-mail do comentário para marketing "porque ele já está no banco". O dado foi coletado para outra finalidade, e a pessoa nunca escolheu receber.
- Inscrição sem confirmação. Qualquer um inscreve o e-mail de outra pessoa, e você manda mensagem para quem nunca pediu.
- Reinscrever quem saiu. A pessoa comenta de novo e volta à lista. Do ponto de vista dela, o descadastro não funcionou.
- Não guardar o texto do consentimento. Se alguém questionar, você só tem um booleano "aceitou = 1", sem saber o que estava escrito na tela.
- Texto vago na caixa. "Aceito comunicações" não diz o que, com que frequência nem como sair.
Checklist
- Dá para publicar um comentário sem marcar nenhuma caixa extra.
- A caixa da newsletter vem desmarcada e diz frequência e como sair.
- Cada inscrição tem registro de data, origem e versão do texto exibido.
- A inscrição só fica ativa depois do clique de confirmação.
- A lista de supressão é consultada antes de qualquer nova inscrição.
- O e-mail do comentário não alimenta nenhuma lista de marketing por outra via.
Para fechar: abra o formulário de comentário do seu site agora. Dá para comentar sem entrar em nenhuma lista?
Referência: https://www.gov.br/anpd/pt-br