안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
지난 시간에 파이썬 코드를 이용해서 Gmail에 메일을 보내는 방법에 대해서 공부해 보았다면, 이번 시간에는 받은 메일을 읽는 방법을 공부해보겠습니다.
이번 시간 역시 Gmail을 파이썬으로 사용하기 위해서는 '앱 비밀번호'가 필요합니다.
만약 구글에서 '2단계 인증'과 '앱 비밀번호' 설정을 함께 진행하지 않으셨다면 지난 글을 보시고 설정을 마치신 후에 이번 강의를 따라와 주세요!
2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기
1. imaplib 모듈 불러오기
가장 먼저 해줄 일은 imaplib 모듈을 import 해주는 것입니다. imaplib 역시 smtplib 모듈과 같이 파이썬 내장 라이브러리에 포함된 모듈로 별도의 설치가 필요 없답니다.
import imaplib
2. imap 객체 생성
다음으로는 Gmail 메일의 imap 서버의 url 정보를 입력하고 server라는 이름의 변수에 담아줍니다.
imap = imaplib.IMAP4_SSL('imap.gmail.com')
3. imap 서버에 로그인
이제 메일 정보를 입력해줍시다. 여기서 지난 시간에 발급받은 "앱 비밀번호"가 필요해요. 만약 error: b'[ALERT] Application-specific password required 라는 오류가 출력된다면 그건 평소 사용하시던 비밀번호를 입력하셨기 때문일거예요.
# imap.login('메일 주소', '비밀번호')
imap.login('xxxxx@gmail.com', '지난 시간 받았던 16자리 앱 비밀번호')
4. 사서함 선택
전체편지함을 선택하기 위해서는 아래의 코드가 필요합니다. 사서함을 선택하는 코드라고 하는데, 만약 사서함을 여러개로 분류해서 사용한다면 해당 사서함의 이름을 'INBOX' 대신 입력하면 되지 않을까 생각됩니다. (실제로 해보진 않았답니다!)
# 사서함 선택, 반환 데이터는 mailbox에 있는 메시지 수
imap.select("INBOX")
5. 이메일 선택
사서함에서 가장 최신에 받은 메일을 참조하기 위해서는 아래와 같은 코드를 실행해줍니다. 이때 uid라는 함수를 사용해서 각 메일에 고유의 번호를 부여해서 인덱싱 할 수 있습니다. 세부적으로 코드가 어떻게 작동하는지 알고 싶으신 분들은 코드를 한줄 한줄 실행하면서 print( ) 함수로 출력해 보시는 걸 추천드립니다.
# 사서함의 모든 메일의 uid 정보 가져오기
# 만약 특정 발신 메일만 선택하고 싶다면 'ALL' 대신에 '(FROM "xxxxx@naver.com")' 입력
status, messages = imap.uid('search', None, 'ALL')
messages = messages[0].split()
# 0이 가장 마지막 메일, -1이 가장 최신 메일
recent_email = messages[-1]
저는 저의 네이버 메일을 이용해서 아래와 같이 '코딩유치원 화이팅!'이라는 제목으로 메일을 보냈고, 이 메일이 최신 메일인 상태입니다.
6. 선택한 메일의 내용 가져오기
선택한 메일(여기서는 가장 최신의 메일)의 내용을 사람이 읽을 수 있는 형태로 바꾸어 줍니다. decode하기 전의 내용이 궁금하시다면 raw를 print( ) 함수로 출력해보세요.
# fetch 명령어로 메일 가져오기
res, msg = imap.uid('fetch', recent_email, "(RFC822)")
# 사람이 읽을 수 있는 없는 상태의 이메일
raw = msg[0][1]
# 사람이 읽을 수 있는 형태로 변환
raw_readable = msg[0][1].decode('utf-8')
7. 선택한 메일의 내용 파싱하기
파싱이란 복잡하게 흩어진 정보에서 원하는 정보만 추출하는 것을 말합니다. 이때는 지난 시간에 메일을 보낼 때 사용했던 email 모듈을 여기서도 사용합니다. 메일 내용을 확인 하는 부분이 조금 복잡한데 이에 대한 내용은 여기서는 자세히 다루지 않겠습니다.
궁금 하신 분들은 글 마지막의 점프 투 파이썬 - 라이브러리 예제 편 (POP3) 링크를 참조하시면 설명이 잘 되어 있습니다.
import email
# raw_readable에서 원하는 부분만 파싱하기 위해 email 모듈을 이용해 변환
email_message = email.message_from_string(raw_readable)
from email.header import decode_header, make_header
# 보낸사람
fr = make_header(decode_header(email_message.get('From')))
print(fr)
# 메일 제목
subject = make_header(decode_header(email_message.get('Subject')))
print(subject)
# 메일 내용
if email_message.is_multipart():
for part in email_message.walk():
ctype = part.get_content_type()
cdispo = str(part.get('Content-Disposition'))
if ctype == 'text/plain' and 'attachment' not in cdispo:
body = part.get_payload(decode=True) # decode
break
else:
body = email_message.get_payload(decode=True)
body = body.decode('utf-8')
print(body)
<최종 실행 결과>
<실제 메일>
오늘 준비한 내용은 여기까지입니다.
감사합니다.
<참고 자료>
1. imaplib 공식 문서
https://docs.python.org/ko/3/library/imaplib.html
2. 점프 투 파이썬 - 라이브러리 예제 편 (imaplib)
3. 점프 투 파이썬 - 라이브러리 예제 편 (pop3)
'파이썬 패키지 > 이메일' 카테고리의 다른 글
[python/smtplib/email] 파이썬으로 여러명에게 첨부파일 포함된 메일 보내기(ft. 이론상 구글, 네이버, 아웃룩 모두 가능) (0) | 2022.06.16 |
---|---|
[#shorts] 파이썬으로 네이버 메일 보내기 위한 초간단 설정 (0) | 2022.06.15 |
[python/smtplib] 파이썬으로 구글 Gmail 보내기 2편. smtplib와 email 모듈 (0) | 2022.03.23 |
[python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기 (1) | 2022.03.17 |