CS/Python

5. 파이썬으로 메일 관리

bonggang 2019. 9. 17. 16:54

메일 전송


파이썬을 이용하면 인터넷을 켜고 로그인 후 메일에 접속하는 작업을 거치지 않고 메일 전송이 가능하다.

먼저 이메일을 전송하기 위해서는 SMTP(Simple Mail Transfer Protocol)프로토콜을 사용한다.

이것을 위해 우리는 smtplib를 사용한다.

import smtplib

다음으로 사용하는 이메일 계정의 smtp 서버 도메인 이름을 입력해야한다.

지금 나는 gmail을 사용할 것이기 때문에 도메인 네임 smtp.gmail.com과 포트 587을 사용한다.

#create session
google_server = smtplib.SMTP('smtp.gmail.com',587)

gmail은 보안상의 이유로 SMTP연결을 TLS(전송 계층 보안) mode로 설정해주어야한다.

#set tls mode
google_server.starttls()

다음으로는 지메일 계정에 로그인을 한다.

google_server.login('지메일 id', '비밀번호')

로그인을 할 때 에러가 발생할 수 있는데 이것은 보안수준이 낮은 앱 허용을 해주면 해결된다.

(https://myaccount.google.com/lesssecureapps)

 

import smtplib #using SMTP lib
from email.message import EmailMessage

google_server = smtplib.SMTP('smtp.gmail.com', 587)
google_server.starttls()
google_server.login('이메일', '비밀번호')

msg = EmailMessage()
msg['Subject'] = "제목"
msg.set_content("내용")
msg['From'] = '보내는 사람 이메일'
msg['To'] = '받는 사람 이메일'

google_server.send_message(msg)

 

 

메일 수신


수신된 메일을 관리하기 위해서는 imaplib를 사용한다.

import imaplib
import email

다음으로 이메일 계정 및 비밀번호를 등록해준다.

user = '계정'
password = '비밀번호'

google_server = imaplib.IMAP4_SSL('imap.gmail.com')
google_server.login(user, password)
google_server.select('INBOX')
msgs = get_emails(search("from", '보낸사람 메일', google_server))

get_emails() 함수는 다음과 같다.

def get_body(msg):
    if msg.is_multipart():
        return get_body(msg.get_payload(0))
    else:
        return msg.get_payload(None, True)


def search(key, value, google_server):
    #result, data = google_server.search(None, '(SENTSINCE {})'.format(date)) #날짜로 검색
    result, data = google_server.search(None,key,'"{}"'.format(value))
    return data


def get_emails(result_bytes):
    msgs = []
    for num in result_bytes[0].split():
        typ, data = google_server.fetch(num, '(RFC822)')
        msgs.append(data)
    return msgs

 

전체 코드

import imaplib, email
import datetime
import os

user = '내 계정'
password = '비밀번호'

date = (datetime.date.today() - datetime.timedelta(14)).strftime("%d-%b-%Y")

def get_body(msg):
    if msg.is_multipart():
        return get_body(msg.get_payload(0))
    else:
        return msg.get_payload(None, True)

def search(key, value, google_server):
    result, data = google_server.search(None, '(SENTSINCE {})'.format(date))
    return data

def get_emails(result_bytes):
    msgs = []
    for num in result_bytes[0].split():
        typ, data = google_server.fetch(num, '(RFC822)')
        msgs.append(data)
    return msgs

google_server = imaplib.IMAP4_SSL('imap.gmail.com')
google_server.login(user, password)
google_server.select('INBOX')
msgs = get_emails(search("from", '보내는 사람 메일', google_server))

for msg in msgs:
	print(get_body(email.message_from_bytes(msg[0][1])).decode('utf-8'))