2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonでGmail APIを利用し添付ファイル付きメールを自動送信するには

Posted at

今回はPythonとGmail APIを利用して添付ファイル付きのメールを自動送信する方法について書いていきます。

#PythonコードでGmailを送信する
添付ファイルをつけてメールを送信するコードを書いていきます。添付するファイルはドキュメントディレクトリ配下の「こんにちは.txt」になります。添付するファイルは事前に作成しておいてください。

コードの完成形は下記のとおりです。

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 email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from apiclient import errors
from os.path import basename

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

# メールの内容を作成
msg = MIMEMultipart()

#  メール本文の作成
def create_message(sender, to_email, subject, message_text):
    #メール送信先
    msg['to'] = to_email
    # メール送信元
    msg['from'] = sender
    # メールのタイトル(件名)
    msg['subject'] = subject
    # ファイルを添付
    msg.attach(MIMEText(message_text))
    
    encode_message = base64.urlsafe_b64encode(msg.as_bytes())
    return {'raw': encode_message.decode()}

#  メール送信の実行
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():
    #  アクセストークンの取得
    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)
    #  メール本文の作成
    sender = '*****@gmail.com' # 送信者のアドレス
    to_email = '*****@gmail.com' # 受信者のアドレス
    subject = 'メール送信自動化テスト'
    message_text = 'メール送信の自動化テストをしています。'
    
    # ファイルを添付
    path = "Documents/こんにちは.txt"
    with open(path, "rb") as f:
        part = MIMEApplication(
            f.read(),
            Name=basename(path)
        )
    part['Content-Disposition'] = 'attachment; filename="%s"' % basename(path)
    msg.attach(part)
    
        
    message = create_message(sender, to_email, subject, message_text)
    #  Gmail APIを呼び出してメール送信
    send_message(service, 'me', message)

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

プログラムの実行

 上記のプログラムを実行すると、初回はGoogleアカウントの選択画面が出てきます。なので、メール送信を実行するアカウントを選択してください。

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

選択内容の確認画面が出てくるので、同様に許可をクリック。

ユーザーから認証されると「The authentication flow has completed, you may close this window.」というメッセージがブラウザに表示されます。

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

#まとめ
メール送信を自動化する方法を解説しました。今回は1通のメール送信でしたが、拡張すれば複数のメールを一斉送信することもできます。普段の業務で毎回似たようなメール送信を行っている方はぜひ参考にしてみてください。

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?