Gmail APIとPythonを使ってメール送信を自動化する方法

Gmail APIとPythonを使ってメール送信を自動化する方法

こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。

今回はGmail APIとPythonを使ってメール送信を自動化する方法を解説します。メール送信を自動化すれば作業時間を削減できるだけでなく、送信ミスも防げます!

定期的にメールを送信する作業がある方にオススメです!また、本記事では1通のメール送信を自動化していますが、改良すれば数十通、数百通といった大量のメールを一括して送信することもできるので、複数のメール送信を自動化したい方も参考にしてください。

Gmail APIとは

Gmail APIとは、Gmailの機能をプログラムで操作できるようにしたものです。複数のプログラミング言語に対応していますが、今回はPythonを使った実装例を紹介します。

さまざまな用途に使えますが、主に以下のような使い道があります。

  • メール送信の自動化
  • 条件に一致したメールの読み取り
  • メールに張り付けられたラベルの変更
  • 他のメールプロバイダとの統合
  • フィルタの一括作成

公式リファレンスは英語ですが、Gmail APIの使い方が記されています。今回はメール送信の自動化について解説しますが、他の機能も使ってみたいという方はリファレンスをご覧ください。

https://developers.google.com/gmail/api/v1/reference/

Gmail APIの利用制限

Gmail APIには利用制限があります。1日に使えるポイントと1秒間で使えるポイントが制限されています。メールを送ったり、下書きを作成したり、Gmail APIの機能ごとに消費するポイントが決められています。

ルール制限
利用可能ポイント(1日当たり)1,000,000,000ポイント
利用制限(1秒当たり)250ポイント

ちなみにメール送信で消費するポイントは100ポイントです。1日当たりで計算すれば一千万通、一秒当たり2通程度メールを送れる計算になります。機能ごとの消費ポイントはこちらから確認できます。

https://developers.google.com/gmail/api/v1/reference/quota

メール送信自動化プログラムの作成方法

メール送信自動化プログラムの完成系は下記動画のようになります。ワンクリックでメールを自動送信することが可能です。

Google Cloud PlatformでGmail APIを有効化

Gmail APIを使うにはGoogle Cloud Platform(GCP)でAPIを有効化する必要があります。GCPとはGoogleがクラウド上で展開するサービスの総称です。Googleアカウントごとに利用しているサービスを管理しています。

GCPにはこちら(https://console.cloud.google.com/?hl=ja)からアクセスしてください。アクセス後、サイドバーの「APIとサービス」からダッシュボードをクリックします。

APIの管理画面が開きました。個々のAPIはプロジェクト単位で管理されるため、メール送信自動化用のプロジェクトを新しく作ります。

ダッシュボードの「プロジェクトの選択」をクリック。

新しいプロジェクトをクリック。

プロジェクト名を入力する必要があるので、わかりやすい名前を付けましょう。入力後、作成ボタンをクリックします。

これでプロジェクトができました。このプロジェクトでGmail APIを管理します。

早速Gmail APIを有効化していきましょう!検索窓に「gmail」と打ってみるとGmail APIと表示されるのでクリック。

Gmail APIの「有効にする」ボタンをクリック。

これでGmail APIが有効になりました。

ユーザーから許可を得るための認証情報を作成

続けて、このメール送信自動化プログラムを使うユーザーからGmailの利用許可をもらうための設定をしていきます。ユーザーから許可をもらって初めてプログラムからメールを送信できるようになります。

ユーザーから許可をもらわずにプログラム単体でメールを勝手に送信できら悪用されてしまいます。だからこそ、メール送信自動化プログラムを実行したときにユーザーから許可をもらう設定が必要なのです。

サイドバーの「APIとサービス」から認証情報をクリック。

いくつかタブがありますが、OAuth同意画面タブをクリックしてください。ここでは、ユーザーから許可をもらう認証画面に表示するアプリケーション名を入力します。入力後、末尾の保存ボタンをクリックします。

続けてクライアントIDクライアントシークレットを取得します。これらを取得することで、これから作るメール送信自動化プログラムがGCPでGmail APIを有効化済みであることの証明になります。

認証情報タブをクリックし、「認証情報を作成」ボタンからOAuthクライアントIDをクリック。

今回はPythonスクリプトを直接実行するのでその他を選択し、名前を入力してください。

OAuthクライアントのクライアントIDとクライアントシークレットが作成されました。

このクライアントIDとクライアントシークレットが格納されたJSONファイルをダウンロードします。

これでGmail APIを利用する準備が整いました。

メール送信を自動化するプログラムを作る

メール送信を自動化するプログラムでは以下の処理を順番に行っています。

  1. アクセストークンの取得
  2. メール本文作成
  3. メール送信の実行

これらの処理を一つひとつPythonで記述していきます。

最初に必要なライブラリをpipでインストールしておきます。pipとはPythonのパッケージ管理ツールで外部ライブラリを簡単に読み込んで使用できます。Windowsの場合はコマンドプロンプト、Macの場合はターミナルを開いて下記コマンドを実行します。

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

ライブラリのインストールが完了したらコードを書きましょう。コードの完成系は下記のとおりです。

import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import base64
from email.mime.text import MIMEText
from apiclient import errors

# 1. Gmail APIのスコープを設定
SCOPES = ['https://www.googleapis.com/auth/gmail.send']

# 2. メール本文の作成
def create_message(sender, to, subject, message_text):
    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject

    encode_message = base64.urlsafe_b64encode(message.as_bytes())

    return {'raw': encode_message.decode()}

# 3. メール送信の実行
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)

# 4. メインとなる処理
def main():
    # 5. アクセストークンの取得
    creds = None

    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    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()

        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)

    # 6. メール本文の作成
    sender = 'example@gmail.com'
    to = 'example@gmail.com'
    subject = 'メール送信自動化テスト'
    message_text = 'メール送信の自動化テストをしています。'

    message = create_message(sender, to, subject, message_text)

    # 7. Gmail APIを呼び出してメール送信
    send_message(service, 'me', message)

# 8. プログラム実行!
if __name__ == '__main__':
    main()

一つひとつプログラムを見ていきましょう。まず、プログラム実行の起点が⑧です。If文で下記のように条件分岐していますね。

if __name__ == '__main__':

__name__属性が’__main__’という文字列と一致するとき処理を実行します。コマンドラインで直接プログラムが実行されると__name__属性に’__main__’が入ります。つまり、コマンドラインからこのPythonプログラムが直接実行された場合に限り、以降の処理を実行するという意味になります。

次に④メイン関数の中身を見てみます。

creds = None

if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)

⑤アクセストークンを取得する処理の最初のIf文です。アクセストークンを格納しているtoken.pickleというファイルを探し、トークンを取り出しています。

続けて2つめのif文です。

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()

    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

token.pickleがなくてトークンを取得できない、あるいはトークンの有効期限が切れている場合の処理です。有効期限が切れているだけであれば、リフレッシュして新たなトークンを取得しています。

トークンがそもそもなければ、先ほどGCPからダウンロードしたクライアントIDとクライアントシークレットを含むクレデンシャルを使って、ユーザーに認証画面を表示しています。認証完了後、トークンを取得しています。

アクセストークンを取得できたら下記のようにGmail APIを利用するためサービスを作ります。

service = build('gmail', 'v1', credentials=creds)

サービスを作ったあとはメール本文を作ります。②メール本文の作成には送信元メールアドレス、送付先メールアドレス、件名、本文が必要です。4つの情報をcreate_message関数に渡しています。

# 6. メール本文の作成
sender = 'example@gmail.com'
to = 'example@gmail.com'
subject = 'メール送信自動化テスト'
message_text = 'メール送信の自動化テストをしています。'

message = create_message(sender, to, subject, message_text)

最後に③メール送信の実行を見ていきましょう。先ほど作ったサービスとメール本文が必要です。User IDは’me’を指定することで認証したユーザーを指定できます。

# 7. Gmail APIを呼び出してメール送信
send_message(service, 'me', message)

プログラムの実行方法

Pythonファイルがあるディレクトリまで移動し、プログラムを試してみましょう。コマンドプロンプトあるいはターミナルを開いて下記コマンドを実行してください。今回はファイル名をmain.pyとしていますが、各自作ったファイル名に置き換えてください。

cd Pythonファイルがあるディレクトリのパス
python main.py

初回はメール送信を実行するGoogleアカウントを選択します。

アカウントを選ぶとGmailの利用権限の付与を許可するダイアログが表示されます。許可をクリックします。

こちらも同様に許可をクリック。

ユーザーから認証されると下記メッセージがブラウザに表示されます。

以上でメール送信が完了です。メールが届いているか確認してみてください。

まとめ

メール送信を自動化する方法を解説しました。Gmail APIを利用する準備やPythonのコーディングをする必要がありますが、コード数も短く、それほど難しくはありません。

今回は1通のメール送信でしたが、改良すれば複数のメールを一括で送信することも可能です。メールがルーチンワークになっている方はぜひお試しください!