Office 365에서 SMTP 인증 유형을 인식하지 못함

이 오류가 발생하여 다양한 옵션을 시도해 보았습니다. Office 365를 사용 중입니다.

오류: 504 5.7.4 Unrecognized authentication type [MN2PR20CA0010.namprd20.prod.outlook.com]

설정 내용:

  DISCOURSE_SMTP_ADDRESS: smtp.office365.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email
  DISCOURSE_SMTP_PASSWORD: "PASSWORD"
  DISCOURSE_SMTP_ENABLE_START_TLS: true

먼저 openssl 도구를 사용하여 설정을 테스트해 보세요

  1. Office 365 사용자 인코딩
echo -n "your email here " | openssl enc -base64
xxx_encoded_email_xxx
  1. 비밀번호 인코딩
echo -n "your password here" | openssl enc -base64
xxx_encoded_password_xxx
  1. 연결 열기
openssl s_client -connect SMTP.office365.com:587 -starttls smtp -quiet -crlf
  1. 인증 테스트
  • 250 SMTPUTF8 메시지가 나올 때까지 대기
  • EHLO SMTP.office365.com 전송
  • 응답 대기
    250-PR3P189CA0029.outlook.office365.com Hello [88.138.0.68]
    250-SIZE 157286400
    250-PIPELINING
    250-DSN
    250-ENHANCEDSTATUSCODES
    250-AUTH LOGIN XOAUTH2
    250-8BITMIME
    250-BINARYMIME
    250-CHUNKING
    250 SMTPUTF8
    
  • AUTH LOGIN 전송
  • 334 VXNlcm5hbWU6 대기
  • 인코딩된 사용자 로그인 정보 xxx_encoded_email_xxx 전송
  • 334 UGFzc3dvcmQ6 대기
  • 인코딩된 비밀번호 xxx_encoded_password_xxx 전송
  • 응답 235 2.7.0 Authentication successful 대기

즉, openssl 테스트는 성공하지만 discourse-doctor가 실행하는 연결 테스트가 해당 설정을 사용해도 여전히 실패한다면 다음 단계는 무엇일까요? openssl 테스트는 성공하지만, 내 Discourse 연결은 504 5.7.4 Unrecognized authentication type… 오류로 계속 실패합니다. 아마도 LOGIN 인증 방식을 인식하지 못하는 것 같습니다. app.yml 파일에 DISCOURSE_SMTP_AUTHENTICATION: login을 추가해 보았지만, 문제가 해결되지 않았습니다.

참고로, 제가 찾은 내용을 공유합니다. docker 이미지 안에 들어가서 lib/tasks/emails.rake 스크립트와 config/discourse.conf 파일을 이것저것 만져보았습니다. 몇 시간 동안 smtp.office365.com과 .mail.protection.outlook.com의 AUTH login과 AUTH plain 조합을 모두 시도해 본 끝에, SMTP 시작 부분 위에 있는 주석 처리된 블록을 활성화했습니다.

# We would like to do this, but Net::SMTP errors out using starttls
#Net::SMTP.start(smtp[:address], smtp[:port]) do |s|
#  s.starttls if !!smtp[:enable_starttls_auto] && s.capable_starttls?
#  s.auth_login(smtp[:user_name], smtp[:password])
#end

이대로 실행하니 읽기 시간 초과(read timeout) 오류가 발생했습니다.
아래처럼 수정하여 start 대신 new를 호출하자 전송에 성공했습니다.

Net::STMP.new(smtp[:address], smtp[:port]) do |s|
    s.enable_starttls
    s.auth_login(smtp[:user_name], smtp[:password])
end

저는 Ruby, rake 등을 처음 접해 보는 입장입니다. 왜 이것이 작동하는지, 혹은 일반적인 경우에 '좋은 방법’인지 설명할 수는 없습니다.
J.

아, 그래서 my_domain.mail.protection.outlook.com으로 25번 포트나 587번 포트 중 어느 쪽으로 시도해도 작동하지 않았는데, smtp.office365.com:587을 사용했을 때 작동했습니다.

저는 이메일 전송 서비스로 socketlabs.com을 사용하며, 비슷한 문제를 겪었습니다. 제 경우 해결 방법은 lib/tasks/emails.rake 파일을 다음과 같이 수정하는 것이었습니다.
다음 줄을 변경하세요:
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password])
아래와 같이:
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])

이 변경이 없으면 DISCOURSE_SMTP_AUTHENTICATION: login이 하위 SMTP 코드로 전달되지 않습니다.

수정된 코드가 다른 인증 방식에서도 여전히 작동하는지는 테스트해 보지 않았지만, login 인증 방식에 대해서는 문제를 해결해 줍니다.

확인 결과, Net::SMTP.start 호출에 smtp[:authentication]를 추가하고 app.yml에 DISCOURSE_SMTP_AUTHENTICATION: login을 설정하면 이메일 테스트 페이지의 문제가 해결됩니다.

일반적인 이메일은 mail 라이브러리를 통해 전송되는 것으로 생각되며, app.yml에 DISCOURSE_SMTP_AUTHENTICATION: login을 설정하면 라이브러리가 올바르게 작동하는 데 충분할 것입니다.

다만, lib/tasks/emails.rake도 DISCOURSE_SMTP_AUTHENTICATION 설정을 사용하도록 패치해야 한다고 생각합니다. 이렇게 하면 불필요한 디버깅을 줄일 수 있습니다.

저한테는 버그처럼 보이네요. PR을 제출했습니다:

안녕하세요,

Net::SMTP.start(smtp[:address], smtp[:port], ‘localhost’, smtp[:user_name], smtp[:password], smtp[:authentication])
rescue Exception => e

현재 버전에서 위와 같이 패치를 적용했지만 여전히 동일한 문제가 발생합니다.

에러: 504 5.7.4 Unrecognized authentication type with smtp.office365.com.

혹시 해결 방법을 아시는 분 계신가요?

lib/tasks/emails.rake 스크립트를 어떻게 수정해야 이 작업을 수행할 수 있나요?

이 문제에 대한 일반적인 업데이트를 드리자면, MS는 SMTP 및 POP3에 대한 레거시 인증을 제거하는 과정을 진행 중입니다. 이는 O365를 메일 제공업체로 사용하는 경우 문제를 복잡하게 만들 수 있습니다. 현재 기본적으로 적용되는 정책은 SMTP AUTH를 금지하는 것이며, 이를 사용하려면 메일박스별로 활성화해야 합니다. 이 정보가 도움이 되길 바랍니다. 저는 어제 오전에 이 문제로 고생했거든요.

특히 POP의 경우 정말 아쉬운 부분입니다. Discourse가 수신 메일박스에 대한 IMAP 지원을 추가하지 않는 한, 수신 메일 설정이 훨씬 어려워질 것이기 때문입니다.

수신함에 컨테이너를 포함하는 수신 메일에 대한 간단한 해결책이 있습니다. 이전에는 "straightforward"라고 불렸지만, 누군가가 이름에 이의를 제기하여 변경되었고, 이제 더 이상 찾을 수 없습니다.

또한 그룹 공용 메일함용 IMAP 지원도 있습니다. 하지만 주로 Gmail만 지원합니다.

음, 자체 메일 서버를 운영하는 것은 어떤 경우에도 최후의 수단으로 고려되어야 합니다. "직접 전달"이라고 하는 것인 것 같은데, 그 단어로 검색해 보세요.

2023년 기준, Exchange에서는 더 이상 POP3 인증이 불가능합니다.

PHPMailer를 사용 중이라면
해당 줄을 주석 처리하거나 삭제한 후 다시 시도해 보세요: //$mail->isSMTP(true);