POP3 이메일 폴링이 작동하지 않습니다

당사의 Discourse 서버에서 이상한 문제가 발생했습니다. 수개월 동안 내부 POP3 서버에서 이메일 폴링이 문제없이 작동해 왔습니다. 2월 16일에 갑자기 이메일 수신 중단이 시작되었습니다. 이상하게도, POP3 서버의 로그 파일에서 Discourse의 활동이 보입니다:

Feb 25 13:54:49 mailout popa3d[12458]: Authentication passed for discourse
Feb 25 13:54:49 mailout popa3d[12458]: 1545 messages (12060237 bytes) loaded
Feb 25 13:54:49 mailout popa3d[12458]: 0 (0) deleted, 1545 (12060237) left

그러나 새 이메일이 처리되지 않습니다.

현재 최신 버전인 Discourse 2.7.0.beta4를 사용하고 있습니다(오늘부터 2.7.0.beta3을 사용 중입니다). 다음은 저희의 이메일 설정입니다:

무엇이 문제일 수 있는지 아이디어가 있으신가요? 오류를 더 조사하기 위해 무엇을 할 수 있을까요?

이메일이 오래된 건가요? 이메일에 적힌 날짜는 언제인가요?

저도 거의 비슷한 상황을 겪고 있습니다.

POP3은 수년간 정상적으로 작동하다가 2월 23일부터 이메일이 도착하지 않고 있습니다.

이메일 서버를 확인해 보니 Discourse가 몇 분 간격으로 성실하게 서버를 폴링하고 있었습니다. 하지만 아무것도 수신되지 않았습니다.

이메일은 여전히 이메일 서버에 남아 있습니다.

참고: 2월 22일에 2.7.0.beta4 버전으로 업데이트를 수행했기 때문에, 이 문제가 그와 관련이 있을 것으로 추정됩니다…

이메일 서버에 쌓여 있는 이메일들은 모두 POP3이 작동하지 않게 된 이후, 즉 제 경우에는 2월 23일 이후 날짜로 표시되어 있습니다.

자, 이렇게 시도해 보세요:

이메일 서버에 들어가서 그곳의 모든 이메일을 삭제하세요. 물론, 보관하고 싶은 이메일은 따로 남겨둘 방법이 필요합니다…

그 다음 Discourse가 다시 POP3로 가져오기를 기다리세요.

이 방법으로 제 환경에서는 문제가 해결되었고, 이메일이 다시 표시되기 시작했습니다.

최근 버전 업데이트 과정에서 내부 이메일 ID 카운터가 어긋난 것 같습니다. @codinghorror 아마도 이 값이 매우 큰 숫자로 설정되어 있어 모든 이메일이 "이미 읽음"으로 처리되는 것 같네요…

기존 이메일을 모두 삭제하지 않으면, 새 이메일은 계속 쌓이기만 합니다.

POP3 폴링에 대한 가장 최근 변경 사항은 1월에 이루어졌습니다.

이것만으로 Discourse의 폴링이 중단되지는 않아야 하지만, 수신된 이메일이 예외를 발생시킬 수 있습니다. 새로운 코드에는 오류 처리가 없습니다…

@jzedlitz 여전히 문제를 겪고 계신가요? 이 문제를 해결하는 데 도움을 주실 의향이 있으신가요? /logs에 관련 오류가 있나요? Jobs::PollMailbox를 검색할 때 /sidekiq/scheduler에서 오류를 확인하시나요? rails 콘솔에서 수동으로 폴링을 실행할 때 오류가 발생하나요?

./launcher enter app
rails c

Jobs::PollMailbox.new.execute({})

보통, 적어도 내 경우에는 POP3 폴링이 _성공_합니다.

이메일 서버에서 Discourse가 폴링하는 것을 확인할 수 있습니다.

하지만 Discourse는 메일을 다운로드하지 않고 단순히 연결을 끊습니다.

적어도 내 경우에는 오류가 전혀 없습니다.

조금 전에 아주 오래된 메일을 무시하도록 안전 점검을 추가했는데, @martin 님이 기억하실지도 모르겠네요.

네, @gerhard 님이 POP3 email polling stopped working - #6 by gerhard 링크로 공유한 PR이었네요. 아무것도 깨지지 않을 거라고 _생각_합니다. 테스트를 위해 원본 이메일 메시지 전체가 필요합니다. 주요 코드 변경 사항은 다음과 같습니다:

def mail_too_old?(mail_string)
  mail = Mail.new(mail_string)
  date_header = mail.header['Date']
  return false if date_header.blank?

  date = Time.parse(date_header.to_s)
  date < 1.week.ago
end

그러니 아마 Time.parse가 실패하면 조용한 오류(silent error)가 발생할 수 있겠네요. Date 헤더가 없는 경우 아무 동작도 시도하지 않으니까요.

늦게 답변드려서 죄송합니다. Discourse의 POP3 메일함을 비우는 방식으로 문제를 거의 해결했습니다. 즉시 Discourse가 다시 메시지를 수신할 수 있게 되었습니다. 그 후 몇 개의 최신 이메일을 이제 비어 있는 POP3 메일함으로 옮겼고, 이 메시지도 정상적으로 처리되었습니다. 하지만 1,400개에 달하는 오래된 이메일 중 일부를 메일함에 넣자마자 Discourse가 더 이상 어떤 메시지도 처리하지 않습니다.

저도 방금 같은 문제를 발견했습니다. 이메일이 메시지를 생성해야 할 때 뭔가 이상하다는 것을 알게 되었습니다. POP3 메일함에 몇 개의 이메일이 남아 있었습니다(저는 작은 인스턴스를 운영하고 있습니다).
메시지를 하나씩 넣는 방식으로 처리하니 효과가 있었던 것 같습니다. 이제 더 잘 작동한다고 생각하지만, 이를 확인하려면 조금 더 기다려야 합니다.

불행히도 문제가 다시 발생했습니다. formail을 사용하여 mbox를 개별 메시지로 분리한 후, 이를 하나씩 POP3 계정에 전달했습니다. 일부(심지어 오래된) 메시지는 Discourse에서 처리되었지만, 다른 메시지는 처리되지 않았습니다.

Jobs::PollMailbox.new.execute({})에서 더 많은 로그 메시지를 출력하여 메시지가 무시되는 이유를 확인할 수 있는 방법이 있을까요?

처리되지 않는 이메일이 발견될 때 /logs를 확인해 보셨나요?

위 게시물들을 보면, 특정 메시지들이 실패하는 것 같습니다.

정확히 어떤 로그 파일인가요? Discourse가 이메일을 가져오려는 동안 tail -f /var/discourse/shared/standalone/log/rails/*.log를 시도해 보았지만, 아무 메시지도 표시되지 않습니다.

관리자로 로그인한 후 웹 브라우저에서 https://discourse.example.com/logs를 방문하세요.

참고로, 해당 폴더 이름은 /log/이며, 제가 언급했던 내용과는 다릅니다. :smirk:

설명해 주셔서 감사합니다. 불행히도 이메일을 가져오는 동안 /logs/가 비어 있습니다. 로그 레벨을 높이는 방법이 있을까요?

그렇다면 pop3 폴링의 오류 처리에 문제가 있을 수 있습니다. 누군가 코드를 확인해서 오류를 무시하고 있는지 살펴봐야 합니다.

rails 콘솔에서 Jobs::PollMailbox.new.execute({})를 실행하기 전에, docker 컨테이너 안의 app/jobs/scheduled/poll_mailbox.rb 파일에 다음 변경 사항을 적용할 수 있을까요?

       pop3.start(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) do |pop|
+        mail_string = nil
         pop.each_mail do |p|
+          mail_string = nil
           mail_string = p.pop
           break if mail_too_old?(mail_string)
           process_popmail(mail_string)
           p.delete if SiteSetting.pop3_polling_delete_from_server?
+        rescue => e
+          puts e.message
+          puts e.backtrace.join("\n\t")
+          puts "", "MESSAGE:", mail_string if mail_string
         end
       end

어떤 파일을 확인해야 하는지 알게 된 후, 직접 실험을 해 보았습니다. 문제는 mail_too_old 체크에 있었습니다. 이 부분을 제거한 후 막혀 있던 메시지가 처리되었습니다.

네, 그렇게 짐작했어요. 그런데 mail_too_old?가 작동하지 못하게 한 이메일이 무엇인지 알면 흥미롭겠네요. 정말로 오래된 이메일이었을까요? 아니면 이메일을 파싱하는 데 실패한 걸까요? 아니면 다른 이유가 있었을까요? 원하신다면 POP3 작동을 막았던 이메일을 쪽지로 보내주세요.