현상
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