前回より、予定一覧を取得してカウントダウンするプログラムを作っている。今回は、カレンダーから取得したイベント一覧から重要なイベントだけを抜き出して、イベントまでの日数をメールで通知するプログラムを作ってみよう。

  • 重要なイベントを取得してメールする

    重要なイベントを取得してメールする

SMTPを利用してメールを送信しよう

前回、Googleカレンダーからイベント一覧を取得する方法を確認した。今回は、イベント一覧を元にして、イベントまでの日数をカウントダウンして、メールを送信するプログラムを作ってみよう。

なお、Gmail経由でメールを送信するには、Gmail APIを使う方法と、SMTPを使う方法と2種類ある。安全なのはGmail APIを使うだが、それなりに設定が大変なので、ここではSMTPを使う方法を紹介する。

なお、Gmailは年々セキュリティが厳しくなっており、SMTP経由でメール送信するには、2段階認証を設定した上で、アプリパスワードを取得しないと利用できないようになっている。

まずは、こちら(https://myaccount.google.com/)のGoogleアカウントの設定で、セキュリティで2段階認証プロセスを有効にする。そして、こちら(https://myaccount.google.com/apppasswords)のアプリパスワードの設定から、専用のパスワードを設定しよう。

アプリパスワードの設定だが、アプリ名を入力して、「作成」ボタンを押すと、アプリパスワードが生成されるのでコピーして覚えておこう。

  • アプリパスワードを作成しよう

    アプリパスワードを作成しよう

重要なイベントに★マークをつけよう

今回のプログラムでは、イベント名に「★」がついているものだけをピックアップして送信するようにしている。そのため、Googleカレンダーのカウントダウンしたい重要イベントのイベント名を「資格試験★」のようにしておこう。

  • 重要なイベントに★マークをつけておこう

    重要なイベントに★マークをつけておこう

Gmailを利用してメール送信しよう

前回、Googleカレンダーを使うために、既に認証情報をダウンロードした。今回も同じ認証情報を使う。「credentials.json」をプログラムと同じフォルダに配置しよう。

今回のプログラムは少し長くなってしまった。そこで、プログラム全体をこちらにアップした。「countdown_email.py」という名前で保存しよう。そして、以下の解説を見て、設定を変更しよう。

それでは、少しずつプログラムを確認していこう。以下の部分はいろいろな設定を記述している部分だ。この部分を書き換える必要がある。

import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email import encoders
from googleapiclient.discovery import build
from google.auth import load_credentials_from_file

# クレデンシャルファイルのパスを指定
CREDENTIALS_PATH = 'credentials.json'
# カレンダーIDを指定 --- (*1)
CALENDAR_ID = '****@group.calendar.google.com'
# 誰にメールを送信するか指定 --- (*2)
EMAIL_ADDRESS = "***@gmail.com"
# SMTPサーバーの設定 --- (*3)
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
SMTP_PASSWORD = '***'
SUBJECT =  'イベントまでの日数'

まず、(*1)のカレンダーID、(*2)のGmailのメールアドレス、(*3)のSMTP_PASSWORDには、本稿の冒頭で取得したアプリパスワードを書き換えよう。

続けて、Googleカレンダーから一覧を取得する部分を見ていこう。

# Google Calendar APIクライアントの作成 --- (*4)
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
credentials = load_credentials_from_file(CREDENTIALS_PATH, SCOPES)[0]
service = build('calendar', 'v3', credentials=credentials)

# イベントの開始日を指定 --- (*5)
now = datetime.datetime.utcnow()
start_date = now.isoformat() + 'Z'
# イベントの終了日を指定(ここでは30日後まで
end_date = (now + datetime.timedelta(days=30)).isoformat() + 'Z'
# イベントの一覧を取得 --- (*6)
events_result = service.events().list(
    calendarId=CALENDAR_ID,
    timeMin=start_date,
    timeMax=end_date,
    singleEvents=True,
    maxResults=30, # 最大30件のイベントを取得
    orderBy='startTime'
).execute()
events = events_result.get('items', [])

# イベントを表示 --- (*7)
body = "1ヶ月以内に重要なイベントは見つかりませんでした。"
if events:
    body2 = ""
    for event in events:
        # イベントの開始時間を取得 --- (*8)
        target_date = event['start'].get('dateTime', event['start'].get('date'))
        # そのイベントまで何日あるか調べて表示
        target_td = datetime.datetime.strptime(target_date, '%Y-%m-%d')
        days = (target_td - now).days
        title = f'{days:2}日 - {event["summary"]}\n'
        if '★' in title: # ★のついた重要なイベントを選別する  --- (*9)
            body2 += title
    if body2 != "":
        body = body2
print("メッセージ本文:\n", body)

(*4)ではGoogleカレンダーのAPIにアクセスするためのクライアントを作成する。(*5)ではカレンダーの開始日、終了日を指定する。(*6)ではイベントの一覧を取得する。

(*7)ではイベントの内容を取得する。それで、(*8)ではイベントまで何日あるかを調べる。(*9)では取得したイベントの中に「★」がついているかを調べる。

続いて、メールの送信部分を確認しよう。

# メールの送信設定 --- (*10)
msg = MIMEMultipart()
msg["From"] = EMAIL_ADDRESS
msg["To"] = EMAIL_ADDRESS
msg["Subject"] = SUBJECT
msg["date"] = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
msg.attach(MIMEText(body.encode("utf-8"), "plain", "utf-8"))
# SMTPの設定とメール送信 --- (*11)
server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
server.starttls()
server.login(EMAIL_ADDRESS, SMTP_PASSWORD)
server.sendmail(
    from_addr=EMAIL_ADDRESS, 
    to_addrs=EMAIL_ADDRESS, 
    msg=msg.as_string())
server.quit()

そして(*10)ではメールの送信設定を行って、(*11)ではメールを送信する。なお、(*10)でmsg["From"]には送信元のメールアドレスを、msg["To"]に送信先のメールアドレスを指定する。

プログラムを実行しよう

上記の細切れのプログラムを「countdown_email.py」に保存しよう。そして、プログラムを実行するには、ターミナルから以下のコマンドを実行しよう。

# Windowsの場合
python countdown_email.py
# macOSの場合
python3 countdown_email.py

正しくプログラムが実行できると、カレンダーに登録した重要なイベントまでの日数がメールされる。

  • イベントまでの日数がメールされたところ

    イベントまでの日数がメールされたところ

まとめ - カレンダーを元にイベントまでの日数をメールする

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら