[에러 해결] [Python smtplib] Outlook 550 5.7.1 Client does not have permission 에러 원인과 해결 방법

안녕하세요, 개발자 여러분! Python의 smtplib 라이브러리를 사용하여 Outlook 계정으로 이메일을 보내려 할 때 겪는 흔한 문제 중 하나인 “550 5.7.1 Client does not have permission” 에러는 많은 개발자를 좌절하게 만듭니다. 이 글에서는 해당 에러가 발생하는 명확한 원인을 분석하고, 실제 개발 환경에서 적용할 수 있는 효과적인 해결 방법을 상세한 코드 예시와 함께 제시합니다. 또한, 향후 이러한 문제를 예방하기 위한 실용적인 팁도 공유하여 여러분의 개발 생산성 향상에 기여하고자 합니다.

Google 검색 상위 노출을 목표로 하는 고품질 기술 문서인 만큼, 여러분이 이 에러를 빠르게 이해하고 해결할 수 있도록 핵심 정보를 명확하고 체계적으로 전달하겠습니다.

1. 에러 발생 상황

개발자가 Python의 smtplib 모듈을 사용하여 Outlook (또는 Office 365) 계정으로 이메일을 보내려고 할 때, 다음과 같은 시나리오에서 “550 5.7.1 Client does not have permission” 에러가 발생합니다. 일반적으로 smtp.office365.com 서버와 587 포트를 사용하며, TLS를 시작하고 사용자 자격 증명으로 로그인 시도 후 이메일을 전송하려 할 때 발생합니다.

소스코드는 다음과 같습니다.

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


outlook_email = "your_outlook_email@outlook.com"
outlook_password = "your_password_or_app_password" # 실제 비밀번호 또는 앱 비밀번호
to_email = "recipient@gmail.com"

msg = MIMEMultipart()
msg["From"] = outlook_email
msg["To"] = to_email
msg["Subject"] = "Test Email from Python"

body = "Hello, this is a test email sent using Python and Outlook SMTP."
msg.attach(MIMEText(body, "plain"))

try:
    # Connect to Outlook SMTP server
    server = smtplib.SMTP("smtp.office365.com", 587)
    server.starttls()  # Secure the connection
    server.login(outlook_email, outlook_password)
    server.sendmail(outlook_email, to_email, msg.as_string())
    print("Email sent successfully!")
    server.quit()
except Exception as e:
    print("Error:", e)

위 코드를 실행하면 smtplib.SMTPAuthenticationError: 550 5.7.1 Client does not have permission과 같은 메시지가 출력되며 이메일 전송에 실패하게 됩니다.

2. 명확한 발생 원인

이 에러는 단순히 비밀번호가 틀려서 발생하는 문제가 아닙니다. 핵심은 Outlook 또는 Office 365 계정의 보안 설정 및 정책에 있습니다. 이 에러의 가장 흔한 원인은 다음과 같습니다.

2.1. SMTP AUTH(Authenticated SMTP) 비활성화

대부분의 Outlook.com 개인 계정이나 Office 365 (Microsoft 365) 비즈니스 계정은 보안 강화 목적으로 기본적으로 SMTP AUTH가 비활성화되어 있는 경우가 많습니다. SMTP AUTH는 프로그램(예: Python 스크립트)이 사용자 이름과 비밀번호를 사용하여 SMTP 서버를 통해 이메일을 보내는 기능입니다. 이 기능이 꺼져 있으면, 아무리 올바른 자격 증명을 입력해도 ‘권한 없음’ 에러를 받게 됩니다.

2.2. 2단계 인증(MFA) 사용 및 앱 암호 미사용

계정에 2단계 인증(Multi-Factor Authentication, MFA)이 활성화되어 있다면, 일반적인 계정 비밀번호로는 smtplib와 같은 외부 애플리케이션에서 로그인할 수 없습니다. 이 경우, ‘앱 암호(App Password)’를 생성하여 사용해야 합니다. 앱 암호는 특정 애플리케이션(여기서는 Python 스크립트)에 한하여 일회성으로 사용할 수 있는 고유한 비밀번호입니다.

2.3. 계정 또는 조직의 보안 정책

회사에서 사용하는 Office 365 계정의 경우, 조직의 IT 관리자가 SMTP AUTH 사용을 특정 사용자에게만 허용하거나, 아예 조직 전체에 대해 비활성화했을 수 있습니다. 또한, 특정 IP 주소 대역에서의 SMTP 접근을 제한하는 보안 정책이 적용되었을 수도 있습니다. 이러한 경우는 개발자가 직접 해결하기 어렵고 관리자의 도움이 필요합니다.

3. 해결 방법 및 코드 예시

위에서 언급된 원인에 따라, 해결 방법도 달라집니다. 다음은 가장 일반적이고 효과적인 해결 방법들입니다.

3.1. Office 365/Outlook.com 계정의 SMTP AUTH 활성화 (가장 흔한 해결책)

Office 365 관리자 계정이 있다면, 다음 단계를 통해 특정 사용자 계정의 SMTP AUTH를 활성화할 수 있습니다. 개인 Outlook.com 계정 사용자는 이 설정이 자동으로 활성화되는 경우가 많지만, 기업 환경에서는 관리자의 개입이 필요할 수 있습니다.

  1. Microsoft 365 관리 센터에 관리자 계정으로 로그인합니다.
  2. 사용자(Users) > 활성 사용자(Active users)로 이동합니다.
  3. SMTP AUTH를 활성화하려는 사용자 계정을 선택하고, 팝업 창에서 메일(Mail) 탭을 클릭합니다.
  4. 메일 앱 인증 관리(Manage mail apps authentication) 또는 이와 유사한 설정을 찾아서 인증된 SMTP(Authenticated SMTP) 옵션을 켜기(On)로 변경합니다.
  5. 변경 사항을 저장합니다. 이 변경 사항이 적용되는 데 몇 분 정도 소요될 수 있습니다.

개인 Outlook.com 계정의 경우, 이 옵션이 보이지 않는다면 기본적으로 활성화되어 있을 가능성이 큽니다. 만약 계속해서 에러가 발생한다면, 다음의 ‘앱 암호’ 사용 방법을 고려해야 합니다.

3.2. 2단계 인증 사용 시 앱 암호 생성 및 적용

계정에 2단계 인증이 활성화되어 있다면 반드시 앱 암호를 사용해야 합니다. 앱 암호 생성 방법은 다음과 같습니다.

  1. Microsoft 계정 보안 기본 사항 페이지에 접속하여 로그인합니다. (https://account.microsoft.com/security)
  2. 추가 보안 옵션(Additional security options) 또는 보안 대시보드(Security dashboard) 섹션을 찾습니다.
  3. 앱 암호(App passwords) 섹션에서 새 앱 암호 만들기(Create a new app password)를 클릭합니다.
  4. 생성된 16자리의 앱 암호를 복사하여 Python 코드의 outlook_password 변수에 사용합니다.

코드 예시 (앱 암호 적용)

기존 코드에서 outlook_password 변수에 일반 비밀번호 대신 새로 생성한 앱 암호를 할당하면 됩니다.

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


outlook_email = "your_outlook_email@outlook.com"
# 여기에 일반 비밀번호 대신 "생성한 앱 암호"를 입력합니다.
outlook_password = "your_generated_app_password" 
to_email = "recipient@gmail.com"

msg = MIMEMultipart()
msg["From"] = outlook_email
msg["To"] = to_email
msg["Subject"] = "Test Email from Python"

body = "Hello, this is a test email sent using Python and Outlook SMTP."
msg.attach(MIMEText(body, "plain"))

try:
    server = smtplib.SMTP("smtp.office365.com", 587)
    server.starttls()
    server.login(outlook_email, outlook_password) # 앱 암호로 로그인 시도
    server.sendmail(outlook_email, to_email, msg.as_string())
    print("Email sent successfully!")
    server.quit()
except Exception as e:
    print("Error:", e)

위의 두 가지 해결 방법 중 하나 또는 둘 다 적용하면 대부분의 “550 5.7.1 Client does not have permission” 에러를 해결할 수 있습니다.

4. 향후 예방을 위한 팁

미래에 동일한 에러를 방지하고 안정적인 이메일 전송 시스템을 구축하기 위한 몇 가지 팁을 드립니다.

4.1. 공식 문서 참조 및 보안 설정 정기 확인

Microsoft 365 또는 Outlook.com의 SMTP 설정 및 보안 정책은 수시로 변경될 수 있습니다. 항상 최신 공식 문서를 참조하여 계정 설정을 확인하는 습관을 들이세요.

4.2. 환경 변수 활용 및 보안에 유의

코드에 비밀번호를 직접 하드코딩하는 대신, 환경 변수(Environment Variables)를 사용하여 민감한 정보를 관리하는 것이 보안상 매우 중요합니다. 예를 들어, os.environ.get("OUTLOOK_APP_PASSWORD")와 같이 사용하세요.

4.3. 테스트 계정 활용

실제 업무용 계정으로 테스트하기 전에, 별도의 테스트용 Outlook 계정을 만들어서 SMTP 전송 기능을 검증하는 것이 좋습니다. 이는 잠재적인 보안 위험을 줄이고 본계정의 설정을 훼손할 가능성을 낮춥니다.

4.4. 상세 로깅 활성화

smtplib를 사용할 때 server.set_debuglevel(1)을 호출하면 SMTP 서버와의 통신 내역을 자세히 볼 수 있습니다. 에러 발생 시 더 정확한 원인을 파악하는 데 큰 도움이 됩니다.

# ... (이전 코드)
try:
    server = smtplib.SMTP("smtp.office365.com", 587)
    server.set_debuglevel(1)  # 디버그 로깅 활성화
    server.starttls()
    server.login(outlook_email, outlook_password)
    server.sendmail(outlook_email, to_email, msg.as_string())
    print("Email sent successfully!")
    server.quit()
except Exception as e:
    print("Error:", e)

4.5. OAuth 2.0 기반 API 사용 고려

장기적인 관점에서, Microsoft Graph API와 같이 OAuth 2.0 기반의 인증 방식을 사용하는 것이 smtplib를 통한 직접 SMTP 인증보다 훨씬 안전하고 권장됩니다. 이는 사용자의 자격 증명을 직접 다루지 않고 토큰 기반으로 인증을 수행하여 보안을 강화합니다. 물론 초기 설정 복잡성이 높지만, 엔터프라이즈 환경에서는 표준적인 접근 방식입니다.

이 문서를 통해 Python smtplib로 Outlook 이메일 전송 시 발생하는 “550 5.7.1 Client does not have permission” 에러를 성공적으로 해결하고, 더 나아가 안전하고 효율적인 이메일 전송 방법을 구축하는 데 도움이 되기를 바랍니다. 궁금한 점이 있다면 언제든지 댓글로 문의해주세요!

댓글 남기기