IT's 2 EG

[Python] imaplib을 통한 Gmail 읽기 본문

프로그래밍 노트/Python

[Python] imaplib을 통한 Gmail 읽기

엠씨비기 2020. 3. 1. 12:46

1. IMAP 이란?

IMAP(Internet Message Access Protocol)은 응용 계층 인터넷 프로토콜 중 하나로, 원격 서버로부터 TCP/IP를 통해 이메일을 가져오는데 사용됩니다.

IMAP은 온라인 모드와 오프라인 모두를 모두 지원하므로 POP3를 사용할 때와 달리 이메일 메시지를 서버에 남겨 두었다가 나중에 지울 수 있습니다.

2. imap을 통한 Gmail 수신 소스코드

import os
import email
import imaplib
import configparser
 
 
# 문자열의 인코딩 정보 추출 후, 문자열, 인코딩 얻기
def find_encoding_info(txt):
    info = email.header.decode_header(txt)
    s, encoding = info[0]
    return s, encoding
 
# Email 설정정보 불러오기
config = configparser.ConfigParser()
config.read('config.ini')
 
# gmail imap 세션 생성
session = imaplib.IMAP4_SSL('imap.gmail.com')
 
# 로그인
session.login(config['Gmail']['ID'], config['Gmail']['Password'])
 
# 받은편지함
session.select('Inbox')
 
# 받은 편지함 내 모든 메일 검색
result, data = session.search(None, 'ALL')
 
# 여러 메일 읽기
all_email = data[0].split()
 
for mail in all_email:
    result, data = session.fetch(mail, '(RFC822)')
    raw_email = data[0][1]
    raw_email_string = raw_email.decode('utf-8')
    email_message = email.message_from_string(raw_email_string)
    
    # 메일 정보
    print('From: ', email_message['From'])
    print('Sender: ', email_message['Sender'])
    print('To: ', email_message['To'])
    print('Date: ', email_message['Date'])
 
    subject, encode = find_encoding_info(email_message['Subject'])
    print('Subject', subject)
 
    message = ''
 
    print('[Message]')
    #메일 본문 확인
    if email_message.is_multipart():
        for part in email_message.get_payload():
            if part.get_content_type() == 'text/plain':
                bytes = part.get_payload(decode=True)
                encode = part.get_content_charset()
                message = message + str(bytes, encode)
    else:
        if email_message.get_content_type() == 'text/plain':
            bytes = email_message.get_payload(decode=True)
            encode = email_message.get_content_charset()
            message = str(bytes, encode)
    print(message)
    
    #첨부파일 존재 시 다운로드
    for part in email_message.walk():
        if part.get_content_maintype() == 'multipart':
            continue
        if part.get('Content-Disposition') is None:
            continue
        file_name = part.get_filename()
 
        if bool(file_name):
            file_path = os.path.join('C:/downloads/', file_name)
            if not os.path.isfile(file_path):
                fp = open(file_path, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
    	else:
        	continue
 
session.close()
session.logout()

'프로그래밍 노트 > Python' 카테고리의 다른 글

[Python] smtplib를 통한 Gmail 발송  (0) 2020.02.23
[Python] ConfigParser 사용하기  (0) 2020.02.16
Comments