Python

[Python] smtplib.SMTPNotSupportedError: STARTTLS extension not supported by server.

비번변경 2022. 2. 27. 16:31

현상

Python 코드로 메일을 전송하기 위해 아래와 같은 함수를 선언하여 사용하려고 한다.

메일 전송을 위한 smtp 서버를 선언하고, 로그인 정보를 이용하여 서버에 접근한 뒤 메일 전송까지 완료하는 함수이다.

    def send(self):
        recipients_list = self.recipient + self.email_cc
        server = smtplib.SMTP(self.email_server, self.email_server_port)
        server.starttls()
        server.ehlo()
        server.login(self.sender, self.passwd)
        server.sendmail(self.sender, recipients_list, self.msg.as_string())
        server.quit()

하지만 실제로 함수 호출 시에는 다음과 같이 smtplib.SMTPNotSupportedError 에러가 발생했다.

Traceback (most recent call last):
  File "send_mail_test.py", line 41, in <module>
    server.starttls()
  File "/usr/lib/python3.6/smtplib.py", line 752, in starttls
    "STARTTLS extension not supported by server.")
smtplib.SMTPNotSupportedError: STARTTLS extension not supported by server.

 

원인

구글링 해보니 이런저런 답변이 있었지만 이 글에서는 메일 서버에서 TLS 인증을 지원하지 않는 것이 원인이었다. 회사 메일 서버를 사용한 것이 원인인 듯하며, 일반적인 google, naver 등의 메일 서버에서는 아마 TLS 인증이 필요할 것 같다.

코드에서 서버 인증 관련 코드를 주석 처리하면 문제없이 메일을 발송할 수 있다.

    def send(self):
        recipients_list = self.recipient + self.email_cc
        server = smtplib.SMTP(self.email_server, self.email_server_port)
        # server.starttls()
        server.ehlo()
        # server.login(self.sender, self.passwd)
        server.sendmail(self.sender, recipients_list, self.msg.as_string())
        server.quit()

 

wrapping

인증 필요 여부를 매개변수로 전달받으면, 아래와 같은 모양새로 코드를 정리할 수 있을 것 같다.

    def send(self, login=False):
        recipients_list = self.recipient + self.email_cc
        server = smtplib.SMTP(self.email_server, self.email_server_port)
        if login:
            server.starttls()
            server.ehlo()
            server.login(self.sender, self.passwd)
        server.ehlo()
        server.sendmail(self.sender, recipients_list, self.msg.as_string())
        server.quit()

 


참고 문서

https://stackoverflow.com/questions/6355456/starttls-extension-not-supported-by-server