Discourse가 이메일을 두 번 보내는 문제

안녕하세요, 제 서버에서 셀프호스팅된 Discourse를 사용 중입니다. 현재 최신 dev 빌드를 사용하고 있으며, 커밋은 다음과 같습니다: Commits · discourse/discourse · GitHub

사용자가 가입하거나 개인 메시지를 받는 등 특정 이벤트가 발생하면 Discourse가 이메일을 2번 보내는 것을 발견했습니다.

새로운 사용자를 가입시키면 이 문제를 재현할 수 있습니다. 어떻게 문제를 해결해야 하는지, 정확한 원인이 무엇인지, 혹은 제 이메일 서버의 문제일 수 있는지 파악이 되지 않습니다. 비슷한 주제에 대한 게시물을 찾았지만 몇 년 전 것이어서 새 주제를 개설하게 되었습니다.

도움 주셔서 감사합니다!

해당 이메일과 관련하여 사이트의 ‘보낸 이메일’ 로그에서 관련 정보를 확인하고 계신가요? 해당 페이지 상단의 입력 필드를 사용하여 사용자, 수신 주소 또는 이메일 유형별로 이메일을 필터링할 수 있습니다:

이것이 버그라면, 중복으로 보내지는 이메일이 정확히 어떤 용도로 보내지는지 파악하는 것이 중요합니다.

사용자가 가입할 때 수신되는 이메일의 유형은 무엇인가요? 승인 대기 중인 사용자가 있다는 내용을 알려주는 이메일인가요?

개인 메시지와 관련된 이메일은 사용자가 귀하에게 보낸 메시지에 대한 것인가요?

안녕하세요,

해당 페이지에서는 이중으로 전송하더라도 하나만 표시됩니다.

다만, 특이한 일이 하나 있었습니다. protonmail.com 도메인의 경우 이중 전송이 일어나지 않았지만, anonaddy.com의 경우 이중 이메일이 수신되었습니다. 이로 인해 이 문제가 Discourse가 아닌 메일 서버와 관련이 있을 수도 있다고 생각하게 되었습니다.

하지만 제 개인 도메인/메일 서버에서도 이중 이메일을 수신하고 있습니다. 보내기 페이지에 이메일이 표시되지 않는다면, Discourse가 이중 이메일을 보내지 않는다고 100% 신뢰할 수 있을까요?

감사합니다.

이중 이메일의 헤더를 확인하면 문제가 어디서 발생했는지 알 수 있을 것입니다.

특히 received-by 헤더를 확인해 보세요.

아 맞다, 내가 제대로 이해했으면 두 메일 모두 Discourse에서 온 것 같네요:

첫 번째 메일:

Return-Path: <SRS0=ll8P=FH=anonaddy.com=b_na4w2nlvmv3gizdenmya_gq4wmodfhfrwm@Mail Server>
Delivered-To: Email Address
Received: from mail2.anonaddy.me (mail2.anonaddy.me [***.***.***.***])
	by Mail Server (Postfix) with ESMTPS id A9132370DA
	for Email Address; Sat, 23 Sep 2023 11:06:42 +0300 (+03)
Received: from mail2.anonaddy.me (mail2.anonaddy.me [127.0.0.1])
	by mail2.anonaddy.me (Postfix) with ESMTPS id 64958FA584
	for Email Address; Sat, 23 Sep 2023 09:06:41 +0100 (BST)
DKIM-Signature: [Truncated]
From: [Sender]
To: Email Address
Subject: =?utf-8?Q?=5BBilin=C3=A7li?= Teknoloji
 =?utf-8?Q?T=C3=BCketicileri=5D_Hesab=C4=B1n=C4=B1z=C4=B1_ona?=
 =?utf-8?Q?ylaman=C4=B1z_i=C3=A7in_an=C4=B1msat=C4=B1c=C4=B1?=
Feedback-ID: F:28f5e9fd-7ba5-4466-8b17-b52f087bd332:anonaddy
Message-ID: [Message ID]
Received: from Mail Server ([***.***.***.***]) by
 mail2.anonaddy.me (Postfix) with ESMTPS id 70F86100233 for
 Email Address; Sat, 23 Sep 2023 09:06:37 +0100 (BST)

두 번째 메일 (동일하며, 초 단위 차이로 구분되는 것을 볼 수 있음):

Return-Path: <SRS0=mdkr=FH=anonaddy.com=b_payts6dtgn5dkodznftq_my3tgntdgvqwk@Mail Server>
Delivered-To: Email Address
Received: from mail2.anonaddy.me (mail2.anonaddy.me [***.***.***.***])
	by Mail Server (Postfix) with ESMTPS id D2066370DA
	for Email Address; Sat, 23 Sep 2023 11:06:54 +0300 (+03)
Received: from mail2.anonaddy.me (mail2.anonaddy.me [127.0.0.1])
	by mail2.anonaddy.me (Postfix) with ESMTPS id 68CBC107D41
	for Email Address; Sat, 23 Sep 2023 09:06:54 +0100 (BST)
DKIM-Signature: [Truncated]
From: [Sender]
To: Email Address
Subject: =?utf-8?Q?=5BBilin=C3=A7li?= Teknoloji
 =?utf-8?Q?T=C3=BCketicileri=5D_Hesab=C4=B1n=C4=B1z=C4=B1_ona?=
 =?utf-8?Q?ylaman=C4=B1z_i=C3=A7in_an=C4=B1msat=C4=B1c=C4=B1?=
Feedback-ID: F:28f5e9fd-7ba5-4466-8b17-b52f087bd332:anonaddy
Message-ID: [Message ID]
Received: from Mail Server ([***.***.***.***]) by
 mail2.anonaddy.me (Postfix) with ESMTPS id E34B6100233 for
 Email Address; Sat, 23 Sep 2023 09:06:51 +0100 (BST)

이 부분들이 흥미로운 지점입니다.

Message-ID가 동일한가요?

다음으로, Mail Server의 로그를 확인하여 Discourse가 하나의 메시지를 보냈는지 두 개를 보냈는지, 그리고 70F86100233과 E34B6100233으로 anonaddy의 메일 서버에 도착한 이메일의 이력이 어떻게 되는지 알아보세요.

메시지 ID가 서로 다릅니다.

첫 번째는: Message-ID: <6172c966-5777-44c2-988f-6acdd7ff33ff@btt.community>
두 번째는: Message-ID: <70297dae-5cb7-467b-980d-ef6dcfeea220@btt.community>

다음과 같이 메일 서버 로그를 확인했습니다: cat mail.log | grep 70297dae

출력 결과:

Sep 30 13:20:18 yuno postfix/cleanup[1559656]: 7C0F03D047: message-id=<70297dae-5cb7-467b-980d-ef6dcfeea220@btt.community>
Sep 30 13:20:38 yuno postfix/cleanup[1559656]: 88FE33D027: message-id=<70297dae-5cb7-467b-980d-ef6dcfeea220@btt.community>
Sep 30 13:20:44 yuno dovecot: lda(nonrelated@x.x.me)<1559829><m0KuF3z2F2UVzRcAMzq6nQ>: sieve: msgid=<70297dae-5cb7-467b-980d-ef6dcfeea220@btt.community>: stored mail into mailbox 'INBOX'

다른 메시지 ID도 마찬가지입니다: cat mail.log | grep 6172c966

출력 결과:

Sep 30 13:20:43 yuno postfix/cleanup[1559799]: D3D4A3D059: message-id=<6172c966-5777-44c2-988f-6acdd7ff33ff@btt.community>
Sep 30 13:20:49 yuno postfix/cleanup[1559656]: EFEBC3D027: message-id=<6172c966-5777-44c2-988f-6acdd7ff33ff@btt.community>
Sep 30 13:20:49 yuno dovecot: lda(nonrelated@x.x.me)<1559834><Z0kBEIH2F2UazRcAMzq6nQ>: sieve: msgid=<6172c966-5777-44c2-988f-6acdd7ff33ff@btt.community>: stored mail into mailbox 'INBOX'

하지만 관리 패널에서는 여전히 하나만 전송된 것처럼 보입니다:
image

이전에도 Dovecot가 실행 중인 서버에서 이와 유사한 문제를 본 적이 있습니다. Dovecot 쪽에 문제가 있어서 재전송이 발생하고 있었습니다.

정보를 찾아볼게요.

수정: 아직 정보를 찾는 중입니다. 얼마나 많은 데이터를 검색해야 하는지 잊고 있었습니다. :slight_smile:

클라우디아가 해당 정보를 찾지 못하는 것 같습니다. 제가 전혀 감이 없으니, 문제를 정확히 파악하고 해결하는 방법에 대한 다른 제안이 있다면 알려주시면 감사하겠습니다. 감사합니다. :slight_smile:

해결책을 찾으셨나요?

저도 비슷한 문제를 겪어본 적이 있습니다. 메일 서버에서는 메일이 정상적으로 전송되었지만, Discourse에서는 전송되지 않은 것으로 표시되어 사용자들이 메일을 대량으로 받는 상황이 발생했습니다.

제 추측은 다음과 같습니다. Discourse가 메일 서버에 작업을 전달하는 과정에서 타임아웃이 발생하면, 메일은 실제로 전송되었음에도 Discourse에서는 실패로 인식될 수 있습니다. 이후 실패한 작업이 다시 시도되면서 새로운 메일이 추가로 발송되는 것입니다.

저는 Sidekiq에서 작업을 종료하고, 메일 서버를 재시작하며, fail2ban 규칙을 조정하는 방식으로 이 문제를 해결했습니다.