Python으로 SMTP 통신 시도
여러 가지 실현 방법을 조사한 결과 표준 라이브러리의 전통 API에서 실현된 정보가 많이 나왔지만 현재 추천하는 API 방법은 잘 찾지 못했다.웹 프레임워크의 Django도 기존 API를 사용하고 주요 라이브러리와 프레임워크의 코드도 참고할 수 없습니다.
이에 따라 Python의
smtplib
및 email
표준 라이브러리를 중심으로 인코딩하여 설치했다.환경
구현 내용
소스 코드 import smtplib
from email.message import EmailMessage
class MailClient:
def __init__(self, mail_data: Dict[str, Any] = {}) -> None:
"""
Args:
mail_data(Dict[]): Defaults to {}.
"""
self._mail_data = mail_data
def request(self) -> bool:
"""
Returns:
bool
"""
with smtplib.SMTP(host=SMTP_HOST, port=int(SMTP_PORT)) as smtp:
smtp.login(SMTP_USER, SMTP_PASSWORD)
errors = smtp.send_message(self.message())
if isinstance(errors, dict) and len(errors) > 0:
logger.warn(
f'''Failed to send to all recipients.
Details: {errors}'''
)
return True
def message(self) -> EmailMessage:
msg = EmailMessage()
msg['From'] = self._mail_data['from_address']
msg['To'] = self._mail_data['to_address']
msg['Subject'] = self._mail_data['subject']
msg.set_default_type('text/plain')
msg.set_content(self._mail_data['message'])
bcc = self._mail_data.get('bcc')
if bcc:
msg['Bcc'] = convert_to_str(bcc)
cc = self._mail_data.get('cc')
if cc:
msg['Cc'] = convert_to_str(cc)
return msg
해설
request 방법
smtplib.SMTP
SMTP 서버에 접속을 시작합니다.TLS를 사용하는 경우 smtplib.SMTP_SSL
를 사용하거나 먼저 명문 연결 starttls()
을 사용한 다음 TLS 연결을 사용합니다.
연결이 성공적으로 설정된 경우 login()
를 사용하여 인증합니다.그리고 send_message
데이터를 보냅니다.실제로 데이터 전송을 담당하는 사람은 sendmail 이다.이 함수에서 SMTP 명령을 실행하여 메일을 보냅니다.
오류 처리였지만 이번에는 간단하게 이상이 생기면raise를 할 수 있어서try-except를 쓰지 않았습니다.그러나 여러 수신자에게 보낼 때 실패하더라도 로그로 보존됩니다.이 정보는 send_message
의 반환값으로 errors
변수에 저장됩니다.errors의 유형은 Dict 가운데 키가 대상 주소이고 값은 STMP 응답 코드와 해당 메시지를 포함하는 메타그룹입니다.send_메시지/sendmail이 값을 되돌려주는지 상세한 상황을 알고 싶은 사람여기은 원본 코드가 있으니 읽어 보세요.
메시지 방법
이번에는 이메일 모듈의 이메일 메시지를 사용하여 메일 데이터를 만들지만 send_message
및 sendmail
에 문자열을 직접 대입할 수 있습니다.하지만 협의의 규격을 이해하지 못하면 어려워 추천하지 않는다.가능한 한 전자 우편 메시지를 사용하세요.
끝내다
이 기사는 좀 더 일찍 공개하려고 했는데 중간에 잊어버려서 블로그를 다 썼다고요?(웃음) 이렇게 됐어요.
좋은 해 되세요
참고 자료
import smtplib
from email.message import EmailMessage
class MailClient:
def __init__(self, mail_data: Dict[str, Any] = {}) -> None:
"""
Args:
mail_data(Dict[]): Defaults to {}.
"""
self._mail_data = mail_data
def request(self) -> bool:
"""
Returns:
bool
"""
with smtplib.SMTP(host=SMTP_HOST, port=int(SMTP_PORT)) as smtp:
smtp.login(SMTP_USER, SMTP_PASSWORD)
errors = smtp.send_message(self.message())
if isinstance(errors, dict) and len(errors) > 0:
logger.warn(
f'''Failed to send to all recipients.
Details: {errors}'''
)
return True
def message(self) -> EmailMessage:
msg = EmailMessage()
msg['From'] = self._mail_data['from_address']
msg['To'] = self._mail_data['to_address']
msg['Subject'] = self._mail_data['subject']
msg.set_default_type('text/plain')
msg.set_content(self._mail_data['message'])
bcc = self._mail_data.get('bcc')
if bcc:
msg['Bcc'] = convert_to_str(bcc)
cc = self._mail_data.get('cc')
if cc:
msg['Cc'] = convert_to_str(cc)
return msg
이 기사는 좀 더 일찍 공개하려고 했는데 중간에 잊어버려서 블로그를 다 썼다고요?(웃음) 이렇게 됐어요.
좋은 해 되세요
참고 자료
Reference
이 문제에 관하여(Python으로 SMTP 통신 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/homines22/items/e5c6925416d13e83ae41텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)