파이썬에서 Gmail API로 메일 보내기

정기적으로 메일로 어떤 작업의 로그를 정기적으로 보내야 하는 일이 생겼다. 마침 구글 계정과 관련이 있어서, Gmail을 이용하기로 했다.

Gmail로 메일을 보내는 방법은 두 가지가 있을 것이다. 하나는 Gmail SMTP 서버를 이용해서 파이썬 내의 SMTP 관련 메서드를 이용하는 것이고, 두 번째는 Gmail API를 이용하는 것이다. 나는 후자를 이용해보기로 하였다.

기본 설정은 Quickstart 문서가 잘 되어 있기 때문에 그대로 참고하면 된다. https://developers.google.com/gmail/api/quickstart/python
이 문서의 service = build(…) 부분까지 따라하면 된다.

문제는 그 다음으로 보내는 부분이다. 우선 https://developers.google.com/gmail/api/guides/sending#python 문서를 따라해봤다. 초안을 먼저 작성하고 그 초안을 보내기와 전송 기능에 보낼 메시지를 바로 집어넣는 두 가지 방법이 있는데, 나는 별 이유 없이 후자를 택했다.

그런데 이 문서를 따라하는 데에는 몇 가지 문제가 있다. 우선 Creating messages에서 문제가 생긴다.

%...%
message = MIMEText(message_text)
%...%
%...%
return {'raw': base64.urlsafe_b64encode(message.as_string())}

그냥 따라하면 MIMEText와 base64가 뭔지 모르겠다고 한다. 이건

import base64
from email.mime.text import MIMEText

를 해주면 해결된다.

다음 문제는 마지막줄인 return {‘raw’: base64.urlsafe_b64encode(message.as_string())} 에서 생긴다. 찾아보고 추측한 결론은 파이썬2에서 파이썬3으로 버전업되면서 b64encode 함수의 입력이 바뀌었다는 것이다. 이전에는 str을 입력받았다면, 지금은 바이트들을 입력받도록 된 것 같다. 따라서 as_string()이 아니라 as_bytes()가 호출되어야 한다.

문제는 여기서 그치지 않는다. 이렇게 만들어진 메시지를 보내는 데에서 또 문제가 있다. 아래쪽에 Sending messages 단락을 보면 다음 부분이 있다.

message = (service.users().messages().send(userId=user_id, body=message).execute())

(위에서 user_id에는 대충 ‘me’를 쓰니까 되더라.)
이 부분을 실행하면 bytes-like 객체는 JSON 직렬화가 불가능하다는 뭔 소린가 싶은 에러가 생긴다. 찾아보니 바이트로 표현된 raw message를 파이썬 함수가 제대로 다루질 못하는 것 같고, 해결책은 이 바이너리 메시지를 utf-8로 디코드해주는 것이다. 따라서 body=message를 body=message.decode(“utf-8”)로 수정한다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다