이메일에 +가 포함된 기존 이메일로 새 가입이 REST API에서 작동하지 않음

최근 업데이트 이후, 동일한 이메일에 +를 추가하여 새 이메일 주소를 나타내는 방식의 가입이 허용되지 않는 것 같습니다. 제 시스템은 이 기능에 크게 의존하고 있습니다. 이 기능을 다시 활성화하는 방법은 무엇인가요?

예를 들어, 이미 email@gmail.com으로 가입한 상태라면 email+1@gmail.com으로 가입할 수 없습니다.

참고로 REST API로 이 부분을 테스트하고 있습니다.

또한, 아래 옵션이 체크되어 있지 않습니다:

그건 normalize emails 관리자 설정인 것 같습니다. :+1:

수정: 게시 전에 그 수정 사항을 보지 못했습니다. :slight_smile:

네, 제 계정에서는 이미 비활성화되어 있습니다

try.discourse.org에서 이 문제를 재현할 수 없습니다.

이 이메일로 일반 UI에서 가입할 수 있나요?

또한, +1 이메일이 이미 가입에 사용되었는지 다시 확인해 주시겠습니까?

네, 일반 UI는 괜찮습니다. REST API는 괜찮지 않습니다.

저도 정확히 같은 방법으로 시도해 보았지만, 현재 운영 중인 최신 코드에서는 문제를 재현할 수 없었습니다. normalize emails 설정을 비활성화했을 때 예상대로 정상적으로 동작했습니다:

rails 콘솔에서 다음 명령어의 출력을 보여 주실 수 있나요:

[1] pry(main)> SiteSetting.normalize_emails

[2] pry(main)> User.find_by_email('YOURUSERNAME@gmail.com').username

[3] pry(main)> User.find_by_email('YOURUSERNAME+1@gmail.com').username

또한, 사용 중인 Discourse 버전이 무엇인지 알려 주시겠어요?

혹시 프로덕션 사이트가 아닌 테스트 사이트(또는 그 반대)에 접속하고 계신 건 아닌지 한 번 더 확인해 보시는 것도 좋습니다.

방금 업데이트했습니다.

여기 있습니다.

이것들은 무슨 뜻인가요?

(여기에 복사/붙여넣기 해도 될까요?)

먼저 이것을 물어봤어야 했는데 :man_facepalming:

“주 이메일이 허용되지 않습니다.”

이것은 user.email.blocked에 대한 번역입니다.

음…

정규화된 이메일이 차단된 것 같습니다. :thinking:

email@gmail.com이 차단되어 있다면, email+1@gmail.com도 차단된다는 뜻입니다. 정규화된 이메일 옵션을 선택하지 않았는데도 이렇게 되는 건 제게는 좀 이상하게 느껴집니다.

그래서 처음부터 가정하기보다는 먼저 물어봤어야 했는데 :rofl:

이메일과 사용자 카테고리에서 오버라이드된 설정이 어떻게 되어 있나요?

해당 이메일 주소를 차단했거나, 예를 들어 Gmail 도메인을 차단한 건가요?

이것을 이해하지 못했습니다. 어디서 확인해야 하나요?

네, 정규화된 이메일이 차단되어 있는 것을 확인할 수 있습니다.

이 경우, 정규화 옵션이 기본값이 아니기 때문에, 괴롭힘 방지 조치로 설정과 관계없이 차단된 주소의 서브어드레스를 거의 확실하게 차단합니다.

설정에서 "오버라이드된 항목만 표시"를 확인하세요. 하지만 이제 그 부분은 걱정하지 않아도 될 것 같습니다.

자리에 돌아와서 이 거부를 수행하는 실제 코드를 살펴보았습니다:

가장 상단에서 정준 이메일(canonical email)을 차단 목록과 비교하고 있습니다:

  def self.canonical(email)
    name, domain = email.split("@", 2)
    name = name.gsub(/\+.*/, "")
    name = name.gsub(".", "") if %w[gmail.com googlemail.com].include?(domain.downcase)
    "#{name}@#{domain}".downcase
  end

그리고 이 체크로 잡히지 않더라도, 여기의 Levenshtein 거리 검사에 의해 잡힐 것입니다:

[1] pry(main)> ScreenedEmail.levenshtein('fakezabanshenas@gmail.com', 'fakezabanshenas+1@gmail.com')
=> 2

SiteSetting.levenshtein_distance_spammer_emails의 기본값이 2이기 때문입니다.