Discourse가 이메일 목록, 특히 반송된 이메일(bounced emails)을 정리하는 방법을 알아보고 있습니다. 사이트는 이메일을 보내기 위해 개인 SMTP 서버를 사용하고 있지만, 응답은 Discourse가 POP 접근을 위해 사용할 Gmail 주소로 돌아오도록 설정되어 있습니다.
정리하자면, 바운스된 이메일을 받는 대상 SMTP 도메인 서버는 + 주소 지정 방식을 인식하지 못합니다. 따라서 해당 서버는 To 필드 기준으로만 이메일을 Gmail 주소로 전달하며, 이 Gmail 주소는 Discourse가 POP를 통해 가져옵니다. 즉, To 필드에 reply_key가 포함되어 있으면, 해당 이메일은 Discourse가 사용하는 Gmail 계정으로 전달되지 않습니다.
따라서 이메일 주소에 reply_key를 넣을 수 없는데, 다른 위치에 넣을 수 있을까요? Discourse가 이를 파싱할 수 있는 주제(subject) 필드나 본문(body) 또는 다른 어디ś에 넣을 수 있을까요?
Discourse가 보내는 이메일은 discourse@xxx.com에서 discourse 전용으로 설정된 도메인 SMTP 서버를 통해 발송됩니다. (discourse 도메인 주소를 사용함)
답장이 오거나 이메일이 바운스(bounce)될 경우, 해당 도메인 SMTP 서버는 이메일을 discourse.xxxx@gmail.com으로 전달합니다. 이 도메인 SMTP 서버는 + 주소 지정 방식을 인식하지 못하므로, 답장 이메일 주소에 reply_key를 포함하면 도메인 SMTP 서버에서 제거됩니다. 저는 개별/고유한 수신 이메일 주소에 대한 전달 규칙만 설정할 수 있습니다.
Discourse 포럼은 GMail을 통해 POP 프로토콜로 해당 전달된 답장/바운스 이메일에 접근하여 이를 파싱합니다.
저도 discourse에서 이메일 주소로 답변 설정을 discourse.xxx+%{reply_to}@gmail.com으로 변경해 보았지만, 이메일이 전달될 때 Gmail은 yyy.com 도메인(discourse SMTP 도메인)이 Gmail 도메인을 스푸핑하려는 것으로 판단하여 스팸으로 분류합니다. 발신자 도메인과 다른 답변 도메인을 설정하는 것이 DMARC 및 SPF 실패를 유발하는 것으로 보입니다.
ARC-Authentication-Results: i=1; mx.google.com;
spf=softfail (google.com: domain of transitioning discussion.xxx+verp-b9c40db917ca04993dd3433cc9748518@gmail.com does not designate y.y.y.y as permitted sender) smtp.mailfrom=discussion.xxx+verp-b9c40db917ca04993dd3433cc9748518@gmail.com;
dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yyy.com
Return-Path: <discussion.xxx+verp-b9c40db917ca04993dd3433cc9748518@gmail.com>
구성되어 있으며, Discourse가 yyy.com SMTP 서버를 통해 “보낸” 이메일은 관리 콘솔의 “테스트 이메일 보내기” 페이지에서 확인했을 때 SPF, DKIM, DMARC를 모두 문제없이 통과합니다.
이 문제는 reply_by_email_address를 yyy.com 주소 대신 Gmail 주소로 설정할 때 발생합니다. 발신 서버를 yyy.com으로 유지하면서 reply_by_email_address를 Gmail 주소로 설정했을 때 DMARC가 실패하지 않도록 이 설정을 위해 할 수 있는 방법이 있을까요?
“명백한” 위치에서 필요한 정보를 찾을 수 없는 경우, 바운스된 이메일의 나머지 콘텐츠/첨부 파일에서 해당 정보를 추출하도록 파싱할 수 없나요? (또는 위장 공격에 대한 필요한 경고와 함께 그렇게 할 수 있는 옵션을 설정에 제공하는 것도 좋습니다.)
제가 이해한 바로는, Discourse(yyy.com)가 전송하는 envelope의 reply-to 필드에 reply_by_email_address가 설정되어야 합니다. 따라서 사용자가 회신할 때 원래의(yyy.com) 주소가 아니라 reply-to 이메일(gmail.com)에 답장하게 됩니다. 즉, 이메일 응답 envelope에서 from 주소는 사용자의 이메일 주소가 되고, to는 gmail.com 주소가 되어야 합니다.
즉, reply_by_email_address는 from 헤더에 사용되어 반송(bounce)된 경우 해당 이메일 주소로 되돌아오도록 하는 데 사용됩니다. 또한 이메일로 회신이 활성화된 경우, 동일한 이메일 주소가 reply-to 헤더에도 설정됩니다.
따라서 제 이해가 맞다면, Discourse에 reply-to 헤더를 위한 별도의 설정(reply_to_email)을 추가할 수 있다면 DMARC 실패 문제를 해결할 수 있을 것입니다. 발송 시 from에는 reply_by_email_address에서 가져온 yyy.com 도메인을 사용하고, reply-to에는 새로운 reply_to_email 설정에서 가져온 gmail.com을 사용하는 방식입니다. 이렇게 하면 이메일이 반송되어도 여전히 reply_by_email_address로 되돌아오지만, 사용자가 회신하면 reply_to_email로 보내지게 됩니다.
네, 맞습니다. envelope-from과 reply-to를 다르게 설정하는 것이 아이디어입니다.
envelope-from 도메인과 발송 IP가 일치하므로 SPF는 통과해야 하지만, 동시에 답장은 GMail로 가서 응답을 처리하게 됩니다. 그리고 이메일이 바운스(bounce)되면 원래 도메인 서버로 돌아가게 되며, 이 서버는 다시 바운스를 GMail 수신함으로 전달할 수 있습니다.
실제로는 다음과 같이 보일 것입니다:
envelope-from: outgoing@yyy.com
…
From: notifications@yyy.com
To: user@contoso.com
Reply-to: my_sweet_forum+12309847801923840923502389423@gmail.com
제 설정에서는 수신 SMTP가 VERP를 지원하지 않기 때문에(즉, 바운스된 메일에 VERP 주소가 포함되지 않기 때문에) outgoing에 VERP가 없습니다. 그래서 VERP를 지원하는 GMail로 reply-to를 보내는 것입니다. 이렇게 하면 현재처럼 DMARC 실패가 발생하지 않아야 합니다.