皆さん、こんにちは!今回は、私が個人的に進めているプロジェクトの記録として、Gmail で受信した Garoon のスケジュール通知メールを Google Calendar に自動で登録・削除するプログラムの作成についてご紹介したいと思います。
背景
普段、業務では Garoon というグループウェアを利用しています。スケジュール管理も Garoon で行っているのですが、個人的には Google Calendar をメインで使いたいという思いがありました。Garoon からもスケジュール通知メールが Gmail に届くため、これを活用して Google Calendar に自動で予定を同期できないかと考えたのがきっかけです。
開発の道のり
1. Gmail からメールを取得する
まず最初に取り組んだのは、Gmail から Garoon のスケジュール通知メールを取得する方法です。Python の imaplib
と email
ライブラリを利用することで、Gmail IMAP サーバーに接続し、特定の送信者からの未読メールを検索・取得することができました。
Python
import imaplib
import email
from email.header import decode_header
GMAIL_HOST = 'imap.gmail.com'
GMAIL_PORT = 993
GMAIL_USER = 'your_gmail_address@gmail.com' # 実際のメールアドレスに置き換えてください
GMAIL_PASSWORD = 'your_gmail_password' # 実際のパスワードに置き換えてください
GAROON_SENDER = 'garoon_notification@example.com' # 実際の送信者はに置き換えてください
mail = imaplib.IMAP4_SSL(GMAIL_HOST, GMAIL_PORT)
mail.login(GMAIL_USER, GMAIL_PASSWORD)
mail.select('inbox')
status, email_ids = mail.search(None, f'(UNSEEN FROM "{GAROON_SENDER}")')
# ... (メール取得と解析の処理)
2. Garoon のメール内容を解析する
次に、取得したメールの本文からスケジュール情報(開始日時、終了日時、タイトルなど)を抽出する必要があります。Garoon のメールフォーマット形式に対応するために garoon_mail_parser
というライブラリを作成しました。テスト用のメールアドレスを使えるように送信元を新と旧のメールアドレスを設定できるようにしています。
Python
from garoon_mail_parser import parse_garoon_mail_old, parse_garoon_mail_new
def parse_mail_body(sender_email, body):
parsed_info = {}
if sender_email == 'old_garoon@example.com': # 送信元アドレス(テスト用)に置き換えてください
parsed_info = parse_garoon_mail_old(body)
elif sender_email == 'new_garoon@example.com': # 送信元アドレス(本番用)に置き換えてください
parsed_info = parse_garoon_mail_new(body)
return parsed_info
# ... (メール取得後)
parsed_info = parse_mail_body(sender_email, body)
start_time = parsed_info.get('start_time')
end_time = parsed_info.get('end_time')
subject = decode_subject(msg)
3. Google Calendar を操作する
抽出したスケジュール情報を Google Calendar に登録するために、Google Calendar API を利用しました。google-api-python-client
などのライブラリを使うことで、OAuth 2.0 認証を行い、API を呼び出すことができます。
Python
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_httplib2 import AuthorizedHttp
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
SCOPES = ['https://www.googleapis.com/auth/calendar.events']
# ... (認証処理)
service = build('calendar', 'v3', credentials=creds)
def create_calendar_event(service, event_title, start_time_iso, end_time_iso):
# Google Calendar にイベントを作成する処理
pass
def delete_calendar_event(service, event_id):
# Google Calendar からイベントを削除する処理
pass
if start_time and end_time:
if "[削除]" in subject:
# 削除処理
pass
else:
# 登録処理
create_calendar_event(service, subject, start_time, end_time)
4. スケジュールの削除に対応する
Garoon のスケジュールが削除された際の通知メールに対応するために、メールの件名に “[削除]” というキーワードが含まれている場合に、Google Calendar から該当するイベントを検索し、削除する機能も実装しました。
Python
def find_event_by_time_and_title(service, start_time_iso, title):
# 指定された条件に合致するイベントを検索する処理
pass
if "[削除]" in subject:
event_id_to_delete = find_event_by_time_and_title(service, start_time, subject.replace("[削除]", "").strip())
if event_id_to_delete:
delete_calendar_event(service, event_id_to_delete)
5. 自動実行環境の検討と cron の採用
最終的に、このプログラムを自動的に実行するために、macOS の標準的なジョブスケジューラである cron
を利用することにしました。crontab -e
コマンドで実行スケジュールを設定することで、定期的に Gmail をチェックし、Google Calendar を更新することができます。
コード スニペット
0 8,12,18 * * * /Library/Developer/CommandLineTools/usr/bin/python3 /Users/your_user/path/to/your/script/main.py >> /tmp/gmail_to_gcal.log 2>&1
(/Library/Developer/CommandLineTools/usr/bin/python3
は Python 3 のパス、/Users/your_user/path/to/your/script/main.py
はスクリプトのパスに置き換えてください)
今後の展望(Cloud への移行)
現時点ではローカル環境での実行を想定していますが、将来的にはクラウド環境での実行も検討したいと考えています。特に、Google Cloud Platform (GCP) は Google サービスとの連携がスムーズであるため、有力な候補です。GCP の Cloud Functions や Cloud Run などを利用すれば、サーバーレスでより安定した自動実行環境を構築できるのではないかと期待しています。
まとめ
今回のブログ記事では、Gmail で受信した Garoon のスケジュール通知メールを解析し、Google Calendar に自動で登録・削除するプログラムの作成過程をご紹介しました。まだ改善の余地はありますが、自動化によって日々のスケジュール管理がより便利になることを目指して、今後も開発を続けていきたいと思います。
追記
クラウド移行してみました
コメント