About this Project
メールし、設定した条件のメールであれば、添付ファイルのPDFをパスワードを解除してGoogleドライブに保存する、というプロジェクトです。
System Configuration & Workflow
Google Apps Script (GAS) ではなく Python を採用することで、仕様変更にも柔軟な対応を可能としています。
- iaas: Google Compute Engine (GCE) の無料枠(e2-micro)
- 言語: Python
- 対象メール: 特定の送信元からの未読メール
- 処理内容: 添付PDFのパスワード保護を自動解除
- 保存先: Googleドライブの指定フォルダ
- 後処理: 処理済みラベル付与と既読化
GCE の e2-micro インスタンスを利用することで、実質無料で常時運用が可能です。※1
- Gmail API: 特定の送信元から届く未読メールを検索・取得。
- Python (pypdf): メモリ上で安全にPDFのパスワードを解除。
- Google Drive API: 指定したフォルダへ自動的に保存。
※1 以前の無料枠対象だった f1-micro と間違えないようご注意ください。e2-micro が現在の無料枠対象です。
Setup
1. GCP プロジェクトの設定
- Gmail API と Google Drive API を有効化。
- OAuth 同意画面を設定し、デスクトップアプリとして「OAuth クライアント ID」を作成。
credentials.jsonを取得。
2. インストールと配置
git clone <your-repo-url>
cd unlockpdf
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Usage
初回実行(認証)
初回実行時はブラウザが立ち上がり、Googleアカウントへのログインが求められます。認証が完了すると、作業ディレクトリに token.json が生成されます。
python unlock_and_save.py
サービス化 (systemd)
24時間365日、常時稼働させるために Linux の systemd を使用してバックグラウンドプロセスとして登録します。これにより、プログラムの異常終了時やサーバー再起動時にも自動で復帰します。
# /etc/systemd/system/unlockpdf.service
[Service]
ExecStart=/path/to/venv/bin/python /path/to/unlock_and_save.py
Restart=always
User=your-user-name
Deployment (Google Compute Engine)
コストを最適化(最小化)するため、GCE の無料枠(e2-micro)での運用します。
- インスタンス作成: 無料枠対象リージョン(us-west1, us-central1 など)で
e2-microを作成。
(⚠️私は f1-microで 作成してしまい、課金が発生してしまいました。料金計算は数時間遅れるため、停止後もしばらくは料金が 増加します)
- ファイルの転送:
unlock_and_save.py,credentials.json,token.jsonをアップロード。※ サーバーはGUIがないため、ローカル環境で生成した
token.jsonを転送する必要があります。 - 常時稼働の設定:
systemdユニットファイルを作成し、サービスを有効化(enable/start)します。
Security Considerations
重要:認証情報の保護
以下の秘匿情報は、絶対に GitHub 等の公開リポジトリに含めないでください。環境変数の利用を強く推奨します。
credentials.json(アプリの鍵)token.json(アカウントのアクセス権)PDF_PASSWORD(生パスワード)
誤って公開してしまった場合は、速やかに該当のクレデンシャルを無効化し、新しいものを発行してください。
Video Demo
Development Environment
- Google Compute Engine
- Python 3.x
- Gmail & Drive API
- pypdf
Precautions & Resources
Google Cloud Platformの料金にご注意ください。無料枠(e2-micro)の範囲外で運用すると課金が発生します。
資料はGitHubで公開しています。個人の学習や小規模なプロジェクトでの再利用を歓迎します。
View on GitHubBest Practices for 24/7 Operation
1. プロセス管理 (systemd)
OS起動時やクラッシュ時に自動再起動させるため、systemd でサービス化するのが最も堅牢です。
[Service]
Restart=always
RestartSec=5
ExecStart=/path/to/venv/bin/python main.py
2. Pythonコードの堅牢化
- 例外処理: メインループを
try-exceptで囲み、一時的なエラーで停止しないようにします。 - ロギング:
loggingライブラリを使用し、Google Cloud Logging で遠隔から状態を確認可能にします。
3. インフラの安定化
- メモリ監視: e2-micro はメモリが少なめ(1GB)なため、OOM Killerによる停止に注意が必要です。
- 静的IP: 通信を安定させるため、静的外部IPアドレスの予約を推奨します。
- 自動更新: GCEのOS構成管理機能でセキュリティパッチ適用を自動化します。
4. コンテナ化の検討
将来的な環境移行やスケーリングを見据え、Dockerコンテナ化してデプロイすることで、依存関係のトラブルを最小限に抑えられます。