外注先(マルニ額縁画材店)からの出荷通知メールをGmailから検知し、Shopifyの対象注文に出荷処理(追跡番号登録・Fulfillment)を行います。
1. システム全体概要
本システムは、Gmail API、Shopify GraphQL API、および楽天RMS APIを連携させ、ECストア運営における納期連絡や出荷通知の作成を自動化する業務支援ツールです。
以下の4つの自立した機能モジュールで構成されており、各ストアのデータ一貫性を保ちながら手作業を最小化します。
自動実行の運用ルール: 現在、各種スクリプトはCron等で定期実行が設定されるとともに、本ダッシュボードから手動によるオンデマンド実行も可能となっています。
2. 出荷通知自動処理 (gmail_shipping_notification_final.py)
外注先(マルニ額縁画材店)からの出荷通知メールをトリガーに、Shopifyの注文に配送会社および追跡番号を付与して出荷処理(Fulfillment)を自動化するスクリプトです。
A. 監視ルール
- Gmailラベル:
04.マルニ/02.マルニ_出荷通知 - 検索範囲: 過去72時間以内の受信メール
B. 抽出・特定ロジック
-
注文番号抽出: 件名から最優先で
ご注文番号[::]\s*(\d+)の正規表現パターンで抽出します。見つからない場合は、本文のフォールバックパターンから10桁前後の数値を抽出。 -
配送業者および追跡番号特定: メール本文のURLまたはドメインで判定し、対応する正規表現で追跡番号を切り出します。
■ ヤマト運輸: url_patterns: kuronekoyamato.co.jp, tracking_pattern: \d{10,12} ■ 佐川急便: url_patterns: sagawa.co.jp, tracking_pattern: \d{10,12} ■ 日本郵便: url_patterns: japanpost.jp, tracking_pattern: \d{13} ■ 西濃運輸: url_patterns: seino.co.jp, tracking_pattern: \d{10,12}
C. Shopify連携ロジック
- 対象ストア:
PHOTOPRI,artgraph - 照合方法: Shopify注文の「タグ」に、上記で抽出した外注先の注文番号が含まれるものをGraphQLクエリで検索(
tag:注文番号)。 -
Fulfillment処理: 対象注文の中の未出荷のFulfillment Order(statusが
OPENもしくはIN_PROGRESS)を検知。残余出荷可能数量(remainingQuantity> 0)が存在する商品に対して、Fulfillment作成API(fulfillmentCreateV2)を叩いて出荷を確定させます。顧客への自動出荷完了通知メール(Shopify標準)も同時に送信されます。
3. 出荷予定日通知 (shipping_date_notification.py)
外注先から届いた納期連絡を解析し、Shopifyの顧客宛に「出荷予定日」と「到着予定日」を通知するメールの下書きを自動作成します。
A. 監視ルール
- Gmailラベル:
04.マルニ/04.納期連絡 - 重複防止: SQLite(
processed_shipping_dates.db)のprocessed_emailsテーブルで処理したメールIDを管理し、重複下書きの作成を防ぎます。
B. 日付抽出ルール
- 出荷日抽出: 本文中の
出荷日\s*\n\s*\*+\s*\n\s*(\d{4}/\d{1,2}/\d{1,2})などの表現をキャプチャ。 - 到着日抽出: 本文中の
到着日\s*\n\s*\*+\s*\n\s*(\d{4}/\d{1,2}/\d{1,2})などの表現をキャプチャ。
C. 到着予定日の算出アルゴリズム
- パターン①(到着日あり): 抽出された到着日とその翌日を表示。(例:
2026/06/20 〜 2026/06/21) - パターン②(出荷日のみ): 抽出された出荷日の翌日と翌々日を表示。(例:
2026/06/19 〜 2026/06/20) - パターン③(日付なし):
未定と判定します。
D. 下書き作成と送信元・形式
- 対象ストア:
PHOTOPRI,e1大判プリント,artgraph,うちの子グッズQoo - メール送信元表示名: 各ブランドの専用名および専用アドレスを使用。
- メール形式:
PHOTOPRIとartgraphはHTML形式(返品ポリシーリンクを含む)、e1とQooはプレーンテキスト。
4. うちの子グッズQoo 製作進行通知 (qoo_production_progress_notification.py)
うちの子グッズQooにおいて、特定の製作進行用タグが付与された注文を対象に、顧客へ製作状況を案内するメールの下書きを自動作成します。
A. タグの検知・フィルタリングルール
- 対象期間: 過去60日間の注文
- ターゲットタグ:
^\d+日$の正規表現にマッチするタグ(例:1日,15日,28日など)。 - 未出荷チェック: 注文に関連付けられたFulfillment Orderに、ステータスが
OPENまたはIN_PROGRESSである商品が含まれていること。
B. メール作成とShopify処理
- Gmail下書き: 顧客の名前、注文番号、公式LINEへのリンクなどを埋め込んだ「制作進行のお知らせ」HTMLメールをGmailの下書きへ保存。
- Shopifyでの処理: 下書き作成完了後、Shopify側の注文に「
製作進行メール」タグを追加付与します。 - 重複防止: SQLite(
qoo_progress_processed.db)に処理済みの注文IDを記録し、同一注文に重複して処理を行わないようにします。
5. 出荷予定・カテゴリ別集計 (shipping_workload_by_date_category.py)
未出荷の注文を解析して将来の出荷日ごとに分類し、印刷サイズや加工の有無による負荷状況をCSVおよびGoogleスプレッドシートに出力します。
A. 出荷予定日の決定アルゴリズム
-
Shopify注文: 注文タグにある「DD日」形式のタグ(例:
2日)を読み込みます。- PHOTOPRI特殊商品: 商品タイトルに「木製パネル加工」「アルミ製」「木製」が含まれる場合、注文日の翌日以降で最初に訪れるその日(DD日)を出荷予定日とします(月末越えに対応)。
- 通常商品: スクリプト実行日の当日以降で最初に訪れるその日(DD日)を出荷予定日とします。
-
楽天RMS注文: 注文確定日の翌日から起算し、土曜・日曜・祝日(日本の祝日は
jpholidayで判定)を除いた 「10営業日後」 を出荷予定日と決定します。
B. サイズ・加工の分類ロジック
- サイズ判定(大物 / 小物): バリアントオプションやバリアントタイトル、商品名からサイズ(例: A3、B2等)を正規化。サイズ名の短辺を抽出し、短辺が420mm以下なら「小物印刷」、420mmを超えれば「大物印刷」に分類します。
-
加工判定: 以下の文字列パターンに基づいて、加工商品の個数をカウントします。
- キャンバス張り: 商品名に
Canvas.またはキャンバス木枠張りが含まれる場合。 - 額装: 楽天注文でバリアントに
ウッドが含まれる、またはPoster.かつバリアントにウッドが含まれる場合。 - スチレンパネル: 商品名に
スチレンパネル加工が含まれる場合。
- キャンバス張り: 商品名に
C. スプレッドシート出力
- CSV出力:
shipping_workload_by_date_category.csvに集計データを出力。 - Googleスプレッドシート同期: 出荷予定日ごとの注文件数、各カテゴリの印刷枚数をGoogleスプレッドシート(納期一覧)のP列(16列目)から自動的に上書き同期します。
6. Gmail API認証・トークンの管理
Gmail APIへのアクセスにはOAuth 2.0を使用しており、認証情報はローカルで生成したトークン(token.pickle)として本番環境に適用されます。
A. 認証情報とアカウント
- OAuthクライアント情報:
credentials.json(GCPプロジェクトから発行される設定ファイル) - 認証トークン:
token.pickle(認証の成功後に生成されるセッション情報およびリフレッシュトークン) - 接続対象Googleアカウント:
photopri.staff@gmail.com(正しい業務アカウント)
B. 再認証・トークン再発行手順
トークンが失効した場合、または誤ったGoogleアカウントで認証してしまい再発行が必要な場合は、以下の手順で再認証を行います。
-
古いトークンの削除:
ローカル環境の
final_version/token.pickleを削除します。 -
認証スクリプトの起動:
ローカル環境で
final_version/temp/auth_only.pyを実行します。Shopifyへのアクセスを行わずに安全に認証のみを起動できます。.venv/bin/python final_version/temp/auth_only.py -
ブラウザでの認証許可:
起動したブラウザで
photopri.staff@gmail.comを選択し、アプリへのGmail読み取り権限(Read-only)を許可します。完了画面が表示されたらブラウザを閉じます。 -
本番サーバーへの転送と適用:
ローカルで生成された新しい
token.pickleを本番サーバーへアップロードします。rsync -avz -e "ssh -i 'SSH_KEY'" final_version/token.pickle root@IP:/var/www/gmail-shipping-notification/final_version/token.pickle -
プロセスの再起動:
本番サーバー上でPM2プロセスを再起動します。
pm2 restart gmail-shipping-notification
| 実行日時 | ジョブID | ステータス | 処理結果 | 詳細 |
|---|---|---|---|---|
| ログを取得しています... | ||||