Você usa SendGrid ao hospedar Discourse? Leitura obrigatória!

Originalmente vi isso na lista mailop, mas também foi postado no Reddit. Trechos abaixo:

Se você está com dificuldades para que seus e-mails cheguem à caixa de entrada do Gmail, apesar de cabeçalhos limpos e boa reputação, seu ESP pode estar sabotando suas mensagens sem que você saiba. O relay SMTP do SendGrid viola os RFCs 2047 e 2369 ao codificar em MIME o cabeçalho List-Unsubscribe assim que seu valor excede 77 bytes. Isso quebra os links de cancelamento de inscrição no Gmail e Outlook. O problema foi confirmado internamente, mas permanece sem solução. O SendGrid envia mais de 100 bilhões de e-mails por mês - esta é uma falha massiva de conformidade com os padrões, com consequências reais para a entregabilidade e conformidade.

Desde que este cabeçalho tenha 77 bytes ou menos, o SendGrid o transmite sem alterações. Mas quando o valor atinge 78 bytes, seu relay SMTP o reescreve forçadamente usando a sintaxe de palavra codificada em MIME (RFC 2047). Essa codificação é explicitamente proibida em cabeçalhos estruturados como List-Unsubscribe.

Eis o que o SendGrid envia em vez disso:

List-Unsubscribe: =?us-ascii?Q?=3Chttps=3A=2F=2Fwww=2Eexample=2Ecom=2Funsubscribe=2F=3E=2C=3Cmailto=3Aunsubscribe=40opt?= =?us-ascii?Q?out=2Eexample=2Ecom=3E?=

Essa codificação quebra a análise do link de cancelamento de inscrição tanto no Gmail quanto no Outlook. Como resultado, os destinatários não conseguem cancelar a inscrição facilmente por meio de elementos da interface do usuário, o que pode levar a taxas de reclamação mais altas e menor colocação na caixa de entrada. Pior ainda, a visualização “Mostrar original” do Gmail decodifica o cabeçalho, então, inicialmente, pode-se não estar ciente da reescrita.

Esse comportamento viola:

RFC 2047, que proíbe palavras codificadas em cabeçalhos estruturados como List-Unsubscribe.

RFC 2369, que define a sintaxe e a estrutura do cabeçalho List-Unsubscribe e pressupõe a capacidade de análise em ASCII puro.

Um exemplo de cabeçalho list-unsubscribe que o Discourse envia é:

List-Unsubscribe: <https://meta.discourse.org/email/unsubscribe/abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl>

Há 64 caracteres apenas no token exclusivo, então é garantido que os links de cancelamento de inscrição que enviamos terão mais de 77 caracteres.

Nós não usamos SendGrid, mas sei que muitos de nossos auto-hospedeiros o utilizam, então acho importante alertar todos aqui.

Existem usuários do SendGrid aqui que possam confirmar esse comportamento?

8 curtidas

Tenho confirmação independente de @pfaffman (obrigado) de que ele está vendo esse comportamento em e-mails enviados via SendGrid:

List-Unsubscribe: 
 =?us-ascii?Q?=3Chttps=3A=2F=2Fforum=2Econtoso=2Ecom=2Femail=2Funsubscribe=2Fb87c085a68d9210e78?
 =?us-ascii?Q?6478e2a54849e5bca9b8002ff0081b0a77466e0?
 =?us-ascii?Q?f71c27=3E?=
List-Unsubscribe-Post: List-Unsubscribe=One-Click

e que o link fácil de Cancelar inscrição não está presente (o que é ruim).

3 curtidas

confirmando o mesmo comprimento do token

  List-Unsubscribe: <https://meta.discourse.org/email/unsubscribe/abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl>
List-Unsubscribe: <https://discuss.mydomain.org/email/unsubscribe/7d1687b646074f0efc9abef16daeb42200f1beca5767de095960f4ac6b9b4ea2>

confirmando a ausência da imagem de cancelamento de inscrição, apenas o link está presente

além disso, o Gmail aceita consistentemente e-mails de inscrição do Discourse/SendGrid, mas ou os coloca no spam ou os rotula como suspeitos, retém imagens e coloca o e-mail na caixa de entrada