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 사용자는 계신가요?

I have independent confirmation from @pfaffman (thank you) that he’s seeing this behaviour on mail sent 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

and that the Unsubscribe easy link is not present (which is bad).

confirming same token length

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

confirming missing unsubscribe image, only link is present

also, gmail consistently accepts discourse/sendgrid sign up emails but either places them in spam or labels as suspect, holds images and places the email in inbox