Discourse 호스팅 시 SendGrid를 사용하시나요? 꼭 읽어주세요!

처음에는 mailop 리스트에서 이 내용을 봤지만, Reddit에도 게시되어 있었습니다. 아래는 발췌한 내용입니다:

헤더가 깔끔하고 평판도 좋은데도 Gmail 수신함投递(인박스 배치)에 어려움을 겪고 있다면, 본인의 인지 없이 ESP(이메일 서비스 제공업체)가 메시지를 방해하고 있을 수 있습니다. SendGrid의 SMTP 릴레이는 List-Unsubscribe 헤더의 값이 77바이트를 초과하는 즉시 MIME 인코딩을 수행하여 RFC 2047과 RFC 2369를 위반합니다. 이로 인해 Gmail과 Outlook에서 구독 취소 링크가 깨집니다. 이 문제는 내부적으로 확인되었으나 아직 해결되지 않았습니다. SendGrid는 매월 1000억 통 이상의 이메일을 전송하는데, 이는 전달률과 규정 준수에 실제 영향을 미치는 심각한 표준 준수 실패입니다.

이 헤더의 값이 77바이트 이하인 경우 SendGrid는 변경 없이 릴레이합니다. 하지만 값이 78바이트에 도달하면, 그들의 SMTP 릴레이는 RFC 2047의 MIME encoded-word 구문을 사용하여 헤더를 강제 재작성합니다. List-Unsubscribe와 같은 구조화된 헤더에서는 이러한 인코딩이 명시적으로 금지되어 있습니다.

SendGrid가 대신 전송하는 내용은 다음과 같습니다:

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?=

이러한 인코딩은 Gmail과 Outlook 모두에서 구독 취소 링크 파싱을 깨뜨립니다. 그 결과, 수신자가 UI 요소를 통해 쉽게 구독을 취소할 수 없게 되어 불만 신고율이 높아지고 수신함 배치율이 낮아질 수 있습니다. 더 나쁜 것은 Gmail의 "원본 보기"에서 헤더가 디코딩되므로, 사용자가 재작성된 사실을 처음에는 인지하지 못할 수 있다는 점입니다.

이러한 행동은 다음을 위반합니다:

List-Unsubscribe와 같은 구조화된 헤더에서 encoded-word를 금지하는 RFC 2047.

List-Unsubscribe 헤더의 문법과 구조를 정의하고 평문 ASCII에서의 파싱 가능성을 전제로 하는 RFC 2369.

Discourse가 전송하는 list-unsubscribe 헤더의 예시는 다음과 같습니다:

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

유니크 토큰 자체에 이미 64자가 포함되어 있으므로, 우리가 전송하는 구독 취소 링크가 77자를 초과할 것은 보장됩니다.

저희는 SendGrid를 사용하지 않지만, 많은 자가 호스팅 사용자가 SendGrid를 사용하고 있다는 것을 알고 있으므로, 이 문제에 대해 여기 있는 모든 사람이 인지하는 것이 중요하다고 생각합니다.

이러한 동작을 확인할 수 있는 SendGrid 사용자는 계신가요?

@pfaffman (감사합니다)에게서 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

그리고 Unsubscribe 간편 링크가 존재하지 않는다는 사실도 확인했습니다(이는 좋지 않은 상황입니다).

동일한 토큰 길이를 확인합니다

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

해제 이미지가 누락되었음을 확인하며, 링크만 존재합니다

또한, Gmail은 discourse/sendgrid의 가입 이메일을 일관되게 수신하지만, 스팸으로 분류하거나 의심스러운 이메일로 표시하고, 이미지를 차단한 채로 이메일을 받은 편지함으로 이동시킵니다