파이썬으로 Gmail API 사용하기 (코드 예제)

보통 이메일 자동화를 할 때 SMTP 서버를 활용한다. 이게 가장 간편하기 때문에. 그래서 이미 SMTP를 활용한 이메일 자동화 파이썬 코드를 남긴 적이 있었다. (해당 글: 파이썬 이메일 대량 발송 자동화 (코드 예제)) 그런데 SMTP 사용하면 발송할 때 제한도 있고 해서, 이번에는 구글에서 공식적으로 제공하는 Gmail API를 사용해서 메일을 보내는 방법을 테스트 해봤다.

공식 문서에 있는 설명 그대로 따라했는데, 크게 “프로젝트 생성 및 사용자 인증”과 “파이썬 코드 작성”으로 단계를 구분할 수 있다.

프로젝트 생성 및 사용자 인증 정보 생성

일단 console.cloud.google.com에 접속해서 프로젝트를 생성하고, [API 및 서비스] 메뉴에서 Gmail API를 찾아 활성화해준다. 프로젝트 내에서 해당 API 기능들을 사용하겠다고 등록하는 정도의 절차라 이해하면 된다.

그 다음 [API 및 서비스] 하위 메뉴 [사용자 인증 정보]로 들어가서 인증 정보를 만들어야 한다. 인증정보 만드는 방법은 현재 총 세 가지가 있는데,

  1. API 키
  2. Outh 클라이언트 ID
  3. 서비스 계정

나는 여기서 Outh 클라이언트 ID를 생성했다. 본인한테 맞는 인증방법을 사용하면 된다. ID를 생성하려고 하면 애플리케이션 종류를 선택하는데, 나 혼자 테스트 용도로 사용하는 거라 ‘데스크톱 앱’을 골랐다.

클라이언트 ID를 생성하고 나면 JSON 파일을 하나 다운 받을 수 있다. 이걸 내 파이썬 스크립트가 담길 폴더 안에 credentials.json라고 잘 저장해두자.

이제 필요한 파이썬 라이브러리를 설치해두자.

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

이렇게 준비 끝.

Gmail API 메일 발송 파이썬 코드 예제

사실 코드 샘플이 이미 API 공식 문서에 나와 있는데, 이대로 파이썬 3 버전에서 돌리면 안 돌아간다. 에러가 나더라. 그래서 구글링을 통해 원인을 찾아서 코드를 최대한 쉽게 수정했다.

크게 사용자 인증, 메시지 생성, 메시지 발송. 이렇게 세 단계로 나눠서 함수를 생성하고 이를 이어서 실행하는 구조.

import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from googleapiclient import errors
from email.message import EmailMessage
import base64

def gmail_authenticate():
    SCOPES = ['https://mail.google.com/']
    creds = None
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        with open('token.json', 'w') as token:
            token.write(creds.to_json())
    return build('gmail', 'v1', credentials=creds)

def create_message(sender, to, subject, message_text):
    message = EmailMessage()
    message["From"] = sender
    message["To"] = to.split(",")
    message["Subject"] = subject
    message.set_content(message_text)
    return {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode('utf8')}

def send_message(service, user_id, message):
    try:
        message = service.users().messages().send(userId=user_id, body=message).execute()
        print('Message Id: %s' % message['id'])
        return message
    except errors.HttpError as error:
        print('An error occurred: %s' % error)

def main():
    service = gmail_authenticate()
    message = create_message("보내는사람", "받는사람", "제목", "내용")
    send_message(service, "me", message)

main()

처음에 실행하면 웹 브라우저 창이 뜨면서 구글 계정에 로그인 한 후, 해당 애플리케이션이 내 이메일에 대한 권한을 갖도록 하겠냐고 묻는다. 이렇게 한 번 인증을 해주면 내 폴더 안에 token.json 라는 파일이 별도로 생겨서, 이후에는 이 토큰이 있기 때문에 권한을 주겠냐고 묻지 않는다.

어쨌든 메모차 남기는 포스팅.

댓글 남기기

추천 글