PR

Gmail の Garoon スケジュールを Google Calendar に自動登録・削除するまでの道

壁に掛けられたカレンダー。GaroonとGoogle Calendarの連携をイメージ 技術・IT
GaroonとGoogle Calendarのスケジュール自動連携で、煩雑な手作業から解放!

皆さん、こんにちは!今回は、私が個人的に進めているプロジェクトの記録として、Gmail で受信した Garoon のスケジュール通知メールを Google Calendar に自動で登録・削除するプログラムの作成についてご紹介したいと思います。

背景

普段、業務では Garoon というグループウェアを利用しています。スケジュール管理も Garoon で行っているのですが、個人的には Google Calendar をメインで使いたいという思いがありました。Garoon からもスケジュール通知メールが Gmail に届くため、これを活用して Google Calendar に自動で予定を同期できないかと考えたのがきっかけです。

開発の道のり

1. Gmail からメールを取得する

まず最初に取り組んだのは、Gmail から Garoon のスケジュール通知メールを取得する方法です。Python の imaplibemail ライブラリを利用することで、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 に自動で登録・削除するプログラムの作成過程をご紹介しました。まだ改善の余地はありますが、自動化によって日々のスケジュール管理がより便利になることを目指して、今後も開発を続けていきたいと思います。

追記

クラウド移行してみました

コメント

タイトルとURLをコピーしました