Python으로 SMTP 통신 시도

8614 단어 SMTPPythonPython3
Python에서 SMTP 통신을 구현할 수 있는 기회가 있으므로 구현 방법을 적어 둡니다.
여러 가지 실현 방법을 조사한 결과 표준 라이브러리의 전통 API에서 실현된 정보가 많이 나왔지만 현재 추천하는 API 방법은 잘 찾지 못했다.웹 프레임워크의 Django도 기존 API를 사용하고 주요 라이브러리와 프레임워크의 코드도 참고할 수 없습니다.
이에 따라 Python의 smtplibemail 표준 라이브러리를 중심으로 인코딩하여 설치했다.

환경

  • OS: MacOS Catalina
  • Python: 3.7
  • Library: smtplib, email (Python standard libraries)
  • 구현 내용

  • SMTP 서버와 연결
  • SMTP Auth
  • 우편물 발송
  • 여러 목적지로 보낼 때 실패한 목적지를 로그로 출력
  • 소스 코드

    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_messagesendmail 에 문자열을 직접 대입할 수 있습니다.하지만 협의의 규격을 이해하지 못하면 어려워 추천하지 않는다.가능한 한 전자 우편 메시지를 사용하세요.

    끝내다


    이 기사는 좀 더 일찍 공개하려고 했는데 중간에 잊어버려서 블로그를 다 썼다고요?(웃음) 이렇게 됐어요.
    좋은 해 되세요

    참고 자료

  • smtplib--SMTP 프로토콜 클라이언트
  • Reply Codes by Function Groups
  • 좋은 웹페이지 즐겨찾기