[python] 네이버 메일 송신/수신 – POP3/SMTP

이번 글에서는 POP3/SMTP에 대해 알아보겠습니다.
IMAP/SMTP에 대한 글은 여기를 참고하시길 바랍니다.

준비사항

네이버 메일에 로그인 한 뒤 ‘환경설정’ -> ‘POP3/IMAP 설정’ -> ‘POP3/SMTP 설정’ 에서 POP3/SMTP을 사용함으로 체크하셔야 합니다.

그리고 아래에 보시면 POP3/SMTP 설정을 위한 정보들이 있습니다. 그 정보들을 잘 기억해둡니다.

메일 송신

SMTP를 파이썬에서 사용하기 위해서는 smtplib와 email 라이브러리가 있어야 합니다.
아래 코드는 네이버메일에서 지메일로 메일을 송신하는 코드입니다.

# POP3/SMTP - 송신
import getpass
import smtplib
from email.mime.text import MIMEText

if __name__ == "__main__":
    smtp_name = "smtp.naver.com"
    smtp_port = 465
    send_email = "3001ssw@naver.com"
    send_password = getpass.getpass("비밀번호: ")    
    recv_email = "3001ssw@gmail.com"
    
    text = """네이버에서 지메일로 메일 전송"""
    msg = MIMEText(text)
    msg["Subject"] = "메일제목"
    msg["From"] = send_email
    msg["To"] = recv_email
    print(msg.as_string())
    
    session = smtplib.SMTP_SSL(smtp_name, smtp_port)
    session.login(send_email, send_password) # 로그인
    
    session.sendmail(send_email, recv_email, msg.as_string()) # 메일 전송
    session.quit()

코드를 실행한 뒤 화인해보면 네이버메일로 작성한 메일이 수신된 것을 확인할 수 있습니다.

메일 수신

메일 수신 하는 것을 해보겠습니다. 우선 지메일에서 네이버메일로 메일 하나 보내두겠습니다.

그 다음 아래와 같이 코드를 입력합니다.

# POP3/SMTP - 수신
from getpass import getpass
import poplib
poplib._MAXLINE=20480

if __name__ == "__main__":
    server = 'pop.naver.com'
    port = 995
    username = '3001ssw@naver.com'
    password = getpass()

    # POP3 접속
    session = poplib.POP3_SSL(server, port)
    session.user(username)
    session.pass_(password)
    
    data = session.stat()
    
    mail_count = data[0] # 메일 전체 개수
    # print("mail count:", mail_count) # 전체 메일 개수
    
    data_byte = session.retr(mail_count) # 마지막 메일에 대한 raw 데이터 얻기
    raw_email = b'\n'.join(data_byte[1]) # 수신 메일에 대한 raw 데이터
    
    #메시지 처리(email 모듈 활용)
    import email
    from email.header import decode_header, make_header
    email_msg = email.message_from_bytes(raw_email)
    mail_from = make_header(decode_header(email_msg.get('From'))) # From
    mail_to = make_header(decode_header(email_msg.get('To'))) # To
    mail_date = make_header(decode_header(email_msg.get('Date'))) # Date
    mail_subject = make_header(decode_header(email_msg.get('Subject'))) # Subject
    
    # Content
    mail_content = None
    # if email_msg.is_multipart(): # 어짜피 part 가져와야 decode 가능한데 의미가 있나 싶음
    for part in email_msg.walk():
        charset = part.get_content_charset()
        ctype = part.get_content_type()
        
        if ctype == 'text/plain':
            mail_content = part.get_payload(decode=True)  # decode
            break
        elif ctype == 'text/html':
            # Content-Disposition는 http response body의 컨텐츠 성향?기질?인데, attachment는 파일이 첨부되어있는것
            cdispo = str(part.get('Content-Disposition'))
            if 'attachment' not in cdispo:
                mail_content = part.get_payload(decode=True)
            else:
                mail_content = ""
            break
        else:
            mail_content = ""
    
    if type(mail_content) is bytes and charset is not None:
        mail_content = mail_content.decode(charset)
        if ctype == 'text/html':
                from bs4 import BeautifulSoup
                soup = BeautifulSoup(mail_content, 'html.parser')
                mail_content = soup.get_text()

    # 출력
    print(str(mail_from))
    print(str(mail_to))
    print(str(mail_date))
    print(str(mail_subject))
    print(str(mail_content))

실행하면 출력창에 메일이 수신된 것을 확인할 수 있습니다.

이상으로 POP3/SMTP에 대해 알아보았습니다.