なぜ私はClaude Codeに頼もうと思ったのか
私はBtoB製造業の営業担当で、1日平均120〜150件のメールを受信します。取引先からの発注・見積依頼・クレーム・社内連絡・メルマガが混在した受信トレイを毎朝手作業で整理するのが日課でした。
「Outlookにルールを設定すれば自動振り分けできるよ」とは知っていましたが、差出人や件名のキーワードが複雑すぎて、標準のルール機能では対応できない分類がたくさんありました。とくに「件名に価格・見積が含まれる+差出人が@重要取引先.co.jpのもの」だけを専用フォルダに入れたいような複合条件は、Outlookの標準ルールでは限界がありました。
そこで試したのが Claude Code です。Claude Code はAnthropicが開発したAIコーディングアシスタントで、ターミナル(コマンドプロンプト)から自然言語で指示するだけでPythonなどのコードを生成・実行してくれます。「Outlookを自動化したい」と話しかけるだけで、win32com(Outlook COM自動化)を使った完全なPythonスクリプトを書いてくれます。
この記事で公開するClaude Codeの活用シナリオ6つ:
① メールの自動振り分け(差出人・件名による)
② 特定パターンへの自動返信(テンプレート付き)
③ 条件に一致するメールの自動転送
④ メール本文からデータを抽出してExcel保存
⑤ CSVから一括メール送信(個別文面付き)
⑥ 時間指定メール送信スケジューラー
事前準備として、以下のライブラリをインストールしておきます。Claude Code にインストール方法も聞けば教えてくれます。
# ターミナルで実行(Claude Codeが教えてくれたコマンド)
pip install pywin32 openpyxl pandas schedule
シナリオ①:差出人・件名で自動振り分け
最初に Claude Code に試みたのは、受信メールを差出人ドメインと件名キーワードの組み合わせで自動的にフォルダに振り分けるスクリプトです。Outlookの標準ルールでは設定できなかった複合条件を、Pythonで完全にカスタマイズできるのが魅力です。
条件:
– 差出人が @important-client.co.jp ドメインで件名に「見積」「発注」が含まれる → 「重要取引先」フォルダ
– 差出人が社内(@mycompany.co.jp)のメール → 「社内連絡」フォルダ
– 件名に「メルマガ」「配信停止」「unsubscribe」が含まれる → 「メルマガ」フォルダ
– それ以外は「未分類」フォルダ
フォルダが存在しない場合は自動作成してください。
スクリプトは毎分自動実行できるようにしてください。
import win32com.client import pythoncom import time import re from datetime import datetime def get_or_create_folder(inbox, folder_name: str): """指定名のフォルダを取得または作成する""" for folder in inbox.Parent.Folders: if folder.Name == folder_name: return folder # フォルダが存在しない場合は作成 new_folder = inbox.Parent.Folders.Add(folder_name) print(f"[{datetime.now():%H:%M:%S}] フォルダ作成: {folder_name}") return new_folder def classify_email(subject: str, sender_addr: str) -> str: """メールの分類ルールを返す""" subject_lower = subject.lower() sender_lower = sender_addr.lower() # ルール1: 重要取引先(複合条件) if "@important-client.co.jp" in sender_lower: if re.search(r"見積|発注", subject): return "重要取引先" # ルール2: 社内連絡 if "@mycompany.co.jp" in sender_lower: return "社内連絡" # ルール3: メルマガ if re.search(r"メルマガ|配信停止|unsubscribe", subject_lower): return "メルマガ" return "未分類" def auto_sort_inbox(): """受信トレイのメールを自動振り分けするメイン処理""" pythoncom.CoInitialize() try: outlook = win32com.client.Dispatch("Outlook.Application") namespace = outlook.GetNamespace("MAPI") inbox = namespace.GetDefaultFolder(6) # 6 = olFolderInbox # 対象フォルダの準備 target_folders = { name: get_or_create_folder(inbox, name) for name in ["重要取引先", "社内連絡", "メルマガ", "未分類"] } moved_count = {name: 0 for name in target_folders} messages = list(inbox.Items) # リストに変換(移動中のイテレータ崩壊を防ぐ) for msg in messages: try: subject = msg.Subject or "" sender = msg.SenderEmailAddress or "" dest_name = classify_email(subject, sender) msg.Move(target_folders[dest_name]) moved_count[dest_name] += 1 except Exception as e: print(f" スキップ(エラー): {e}") total = sum(moved_count.values()) print(f"[{datetime.now():%H:%M:%S}] 振り分け完了: 計{total}件") for name, cnt in moved_count.items(): if cnt > 0: print(f" → {name}: {cnt}件") finally: pythoncom.CoUninitialize() if __name__ == "__main__": print("Outlook自動振り分けスクリプト起動(毎60秒実行)") while True: auto_sort_inbox() time.sleep(60)

▶ 実行結果
Outlook自動振り分けスクリプト起動(毎60秒実行)
[09:01:03] フォルダ作成: 重要取引先
[09:01:03] フォルダ作成: 社内連絡
[09:01:03] フォルダ作成: メルマガ
[09:01:03] フォルダ作成: 未分類
[09:01:05] 振り分け完了: 計127件
→ 重要取引先: 14件
→ 社内連絡: 38件
→ メルマガ: 42件
→ 未分類: 33件
[09:02:05] 振り分け完了: 計3件(新着)
→ 重要取引先: 2件
→ 社内連絡: 1件
Claude Code が生成したコードを実行すると、127件の未整理メールが1分以内にすべてフォルダへ分類されました。手作業なら2時間かかっていた作業が完全自動化されました。win32comを使っているため、Outlookが起動している間はリアルタイムで振り分けが機能します。
シナリオ②:特定パターンのメールに自動返信
次に Claude Code に頼んだのは、定型的な問い合わせメールへの自動返信です。「在庫確認」「納期確認」「カタログ請求」の3種類の問い合わせが毎日20〜30件来るので、それぞれにテンプレート返信を自動送信したいと考えました。
対応パターン:
1. 件名または本文に「在庫」「stock」が含まれる
→ 「在庫確認のお問い合わせありがとうございます。現在の在庫状況は翌営業日中にご連絡いたします。」
2. 件名または本文に「納期」「delivery」が含まれる
→ 「納期に関するお問い合わせをいただきありがとうございます。担当者より3営業日以内にご連絡いたします。」
3. 件名または本文に「カタログ」「catalogue」「catalog」が含まれる
→ 「カタログのご請求ありがとうございます。PDFカタログをメールに添付してお送りします。」
重複返信を防ぐため、返信済みメールにカスタムフラグを立ててください。
社内メール(@mycompany.co.jp)には返信しないでください。
import win32com.client import pythoncom import re from datetime import datetime # 返信テンプレート辞書 TEMPLATES = { "在庫": { "pattern": r"在庫|stock", "subject_prefix": "【自動返信】在庫確認のお問い合わせ受付", "body": ( "いつもお世話になっております。\n\n" "在庫確認のお問い合わせをいただきありがとうございます。\n" "現在の在庫状況は翌営業日中に担当者よりご連絡いたします。\n\n" "お急ぎの場合はお電話でもお問い合わせください。\n\n" "---\nAurant Technologies 営業部\n" ) }, "納期": { "pattern": r"納期|delivery", "subject_prefix": "【自動返信】納期確認のお問い合わせ受付", "body": ( "いつもお世話になっております。\n\n" "納期に関するお問い合わせをいただきありがとうございます。\n" "担当者より3営業日以内にご連絡いたします。\n\n" "---\nAurant Technologies 営業部\n" ) }, "カタログ": { "pattern": r"カタログ|catalogue|catalog", "subject_prefix": "【自動返信】カタログご請求受付", "body": ( "いつもお世話になっております。\n\n" "カタログのご請求をいただきありがとうございます。\n" "PDFカタログをメールに添付してお送りします。\n\n" "---\nAurant Technologies 営業部\n" ) }, } REPLIED_FLAG = "AutoReplied_v1" # 返信済みマーカー(ユーザーフィールド) def is_already_replied(msg) -> bool: """カスタムフィールドで返信済みか確認""" try: field = msg.UserProperties.Find(REPLIED_FLAG) return field is not None and field.Value == True except: return False def mark_as_replied(msg): """メールに返信済みフラグを付ける""" prop = msg.UserProperties.Add(REPLIED_FLAG, 11) # 11 = olYesNo prop.Value = True msg.Save() def auto_reply_inbox(): pythoncom.CoInitialize() try: outlook = win32com.client.Dispatch("Outlook.Application") namespace = outlook.GetNamespace("MAPI") inbox = namespace.GetDefaultFolder(6) replied = 0 skipped = 0 for msg in list(inbox.Items): try: sender = msg.SenderEmailAddress or "" # 社内メールはスキップ if "@mycompany.co.jp" in sender.lower(): skipped += 1 continue # 返信済みメールはスキップ if is_already_replied(msg): skipped += 1 continue subject = msg.Subject or "" body = msg.Body or "" text = subject + " " + body for category, tpl in TEMPLATES.items(): if re.search(tpl["pattern"], text, re.IGNORECASE): reply = msg.Reply() reply.Subject = f"{tpl['subject_prefix']} - RE: {subject}" reply.Body = tpl["body"] reply.Send() mark_as_replied(msg) print(f" ✅ 自動返信[{category}]: {sender} | {subject[:30]}") replied += 1 break except Exception as e: print(f" エラー: {e}") print(f"[{datetime.now():%H:%M:%S}] 自動返信完了: {replied}件送信 / {skipped}件スキップ") finally: pythoncom.CoUninitialize() if __name__ == "__main__": auto_reply_inbox()
✅ 自動返信[在庫]: tanaka@supplier-abc.co.jp | 新製品の在庫状況について
✅ 自動返信[納期]: info@client-xyz.co.jp | 発注品の納期確認
✅ 自動返信[カタログ]: info@newclient.co.jp | カタログをお送りください
✅ 自動返信[在庫]: procurement@bigcorp.co.jp | stock availability inquiry
[09:05:14] 自動返信完了: 4件送信 / 38件スキップ(社内・返信済み)
Claude Code は「重複返信を防ぐためのカスタムフィールド」という細かい要件まで完璧に実装してくれました。最初は「そんな複雑なこともできるの?」と半信半疑でしたが、Claude Code が生成したコードはそのまま動作しました。
シナリオ③:条件一致メールを特定担当者に自動転送
クレームや重要案件のメールは、私ではなく上長や専門担当者に即座に転送したいケースがあります。Claude Code に転送スクリプトの生成を依頼しました。
転送ルール:
– 件名に「クレーム」「苦情」「返品」「不具合」が含まれる → manager@mycompany.co.jp に転送
– 件名に「契約」「法務」「訴訟」が含まれる → legal@mycompany.co.jp に転送
– 差出人が @vip-client.co.jp のメール → vip-support@mycompany.co.jp に転送
転送メールには「【自動転送】元の件名」の形式で件名を付けてください。
転送済みかどうかをOutlookのカテゴリ機能で管理してください(転送済みカテゴリを付与する)。
import win32com.client import pythoncom import re from datetime import datetime # 転送ルール定義 FORWARD_RULES = [ { "name": "クレーム", "pattern": r"クレーム|苦情|返品|不具合", "match_field": "subject", "forward_to": "manager@mycompany.co.jp", "note": "クレーム・品質問題担当", }, { "name": "法務", "pattern": r"契約|法務|訴訟", "match_field": "subject", "forward_to": "legal@mycompany.co.jp", "note": "法務・契約担当", }, { "name": "VIPクライアント", "pattern": r"@vip-client\.co\.jp", "match_field": "sender", "forward_to": "vip-support@mycompany.co.jp", "note": "VIPクライアント専任担当", }, ] FORWARDED_CATEGORY = "自動転送済み" def has_forwarded_category(msg) -> bool: """Outlookカテゴリに転送済みマークがあるか確認""" return FORWARDED_CATEGORY in (msg.Categories or "") def add_forwarded_category(msg): """Outlookカテゴリに転送済みマークを追加""" cats = msg.Categories or "" if FORWARDED_CATEGORY not in cats: msg.Categories = (cats + "," + FORWARDED_CATEGORY).strip(",") msg.Save() def auto_forward_inbox(): pythoncom.CoInitialize() try: outlook = win32com.client.Dispatch("Outlook.Application") namespace = outlook.GetNamespace("MAPI") inbox = namespace.GetDefaultFolder(6) forwarded_count = 0 for msg in list(inbox.Items): try: if has_forwarded_category(msg): continue subject = msg.Subject or "" sender = msg.SenderEmailAddress or "" forwarded_this = False for rule in FORWARD_RULES: target = subject if rule["match_field"] == "subject" else sender if re.search(rule["pattern"], target, re.IGNORECASE): fwd = msg.Forward() fwd.Subject = f"【自動転送】{subject}" fwd.To = rule["forward_to"] fwd.Body = ( f"▼ 自動転送ルール: {rule['name']}({rule['note']})\n" f"▼ 元の差出人: {sender}\n" f"▼ 転送日時: {datetime.now():%Y-%m-%d %H:%M}\n" f"\n{'='*50}\n\n" ) + (fwd.Body or "") fwd.Send() add_forwarded_category(msg) print(f" ✅ 転送[{rule['name']}]: {subject[:30]} → {rule['forward_to']}") forwarded_this = True forwarded_count += 1 break except Exception as e: print(f" エラー: {e}") print(f"[{datetime.now():%H:%M:%S}] 自動転送完了: {forwarded_count}件") finally: pythoncom.CoUninitialize() if __name__ == "__main__": auto_forward_inbox()
✅ 転送[クレーム]: 【至急】商品の不具合について → manager@mycompany.co.jp
✅ 転送[法務]: 契約書の修正依頼について → legal@mycompany.co.jp
✅ 転送[VIPクライアント]: 来期の取引条件について → vip-support@mycompany.co.jp
[09:10:22] 自動転送完了: 3件
Claude Code は「Outlookのカテゴリ機能」を使った転送済み管理まで実装してくれました。カテゴリはOutlookのUI上でも視覚的に確認できるため、転送漏れや二重転送がないかの確認もしやすくなっています。
シナリオ④:メール本文のデータをExcelに自動保存
受注確認メールには毎回「品番:XXXXX、数量:XX個、希望納期:XXXX年XX月XX日」という定型フォーマットのデータが含まれています。これを手作業でExcelに転記していたのですが、Claude Code に自動化を依頼しました。
抽出するデータ:
– 品番(「品番:」の後の英数字)
– 数量(「数量:」の後の数値と単位)
– 希望納期(「希望納期:」の後の日付)
– 差出人メールアドレス
– 受信日時
– 件名
Excelファイルは orders_2026.xlsx として保存し、シートに追記形式でデータを追加してください。
同じメールIDが既に登録されている場合は重複追加しないでください。
import win32com.client import pythoncom import re import openpyxl from openpyxl.styles import Font, PatternFill, Alignment from datetime import datetime from pathlib import Path EXCEL_PATH = Path("orders_2026.xlsx") HEADERS = ["メールID", "受信日時", "差出人", "件名", "品番", "数量", "希望納期"] def init_excel() -> openpyxl.Workbook: """Excelファイルを初期化(なければ作成)""" if EXCEL_PATH.exists(): return openpyxl.load_workbook(EXCEL_PATH) wb = openpyxl.Workbook() ws = wb.active ws.title = "受注データ" ws.append(HEADERS) # ヘッダー装飾 header_fill = PatternFill("solid", fgColor="0078D4") for cell in ws[1]: cell.fill = header_fill cell.font = Font(color="FFFFFF", bold=True) cell.alignment = Alignment(horizontal="center") wb.save(EXCEL_PATH) return wb def get_existing_ids(wb: openpyxl.Workbook) -> set: """登録済みメールIDのセットを取得""" ws = wb.active return {ws.cell(row=r, column=1).value for r in range(2, ws.max_row + 1)} def extract_order_data(body: str) -> dict: """メール本文から注文データを正規表現で抽出""" patterns = { "品番": r"品番[::]\s*([A-Za-z0-9\-]+)", "数量": r"数量[::]\s*(\d+\s*(?:個|本|枚|セット|箱|ケース)?)", "希望納期": r"希望納期[::]\s*(\d{4}年\d{1,2}月\d{1,2}日|\d{4}[-/]\d{1,2}[-/]\d{1,2})", } result = {} for key, pat in patterns.items(): m = re.search(pat, body) result[key] = m.group(1).strip() if m else "" return result def extract_emails_to_excel(folder_name: str = "受注メール"): pythoncom.CoInitialize() try: outlook = win32com.client.Dispatch("Outlook.Application") ns = outlook.GetNamespace("MAPI") inbox = ns.GetDefaultFolder(6) # 対象フォルダを検索 target_folder = None for f in inbox.Parent.Folders: if f.Name == folder_name: target_folder = f break if not target_folder: print(f"フォルダ '{folder_name}' が見つかりません") return wb = init_excel() ws = wb.active existing_ids = get_existing_ids(wb) added = 0 for msg in list(target_folder.Items): try: mail_id = msg.EntryID if mail_id in existing_ids: continue order = extract_order_data(msg.Body or "") row = [ mail_id, msg.ReceivedTime.strftime("%Y-%m-%d %H:%M") if msg.ReceivedTime else "", msg.SenderEmailAddress or "", msg.Subject or "", order["品番"], order["数量"], order["希望納期"], ] ws.append(row) existing_ids.add(mail_id) added += 1 print(f" ✅ 追記: {msg.Subject[:30]} | 品番={order['品番']} 数量={order['数量']}") except Exception as e: print(f" エラー: {e}") wb.save(EXCEL_PATH) print(f"[{datetime.now():%H:%M:%S}] Excel保存完了: {added}件追加 → {EXCEL_PATH}") finally: pythoncom.CoUninitialize() if __name__ == "__main__": extract_emails_to_excel("受注メール")
✅ 追記: 【発注】品番AB-2031の注文 | 品番=AB-2031 数量=50個
✅ 追記: 新規発注のご連絡 | 品番=CD-0892 数量=200枚
✅ 追記: 定期発注(3月分) | 品番=EF-1120 数量=1ケース
✅ 追記: 追加発注をお願いします | 品番=AB-2031 数量=30個
✅ 追記: 緊急発注お願いします | 品番=GH-5501 数量=10本
[09:15:48] Excel保存完了: 5件追加 → orders_2026.xlsx
以前は1件あたり2〜3分かけてExcelに手入力していた受注データが、Claude Code が生成したスクリプトで完全自動化されました。Excelのヘッダーに背景色まで自動設定してくれる細かさに驚きました。これも Claude Code に頼んだだけで実現した機能です。
シナリオ⑤:CSVから個別文面付き一括メール送信
定期的に顧客リストへ個別の案内メールを送る業務があります。宛先・名前・専用URLが入ったCSVファイルから、それぞれの顧客に個別の文面でメールを送る処理を Claude Code に実装してもらいました。
CSVの列:email, name, company, personal_url, plan_type
メールテンプレート:
件名:【{company}様専用】春の特別キャンペーンのご案内
本文:
{name}様
いつも大変お世話になっております。
{company}様専用の春の特別キャンペーンをご用意いたしました。
▼ {name}様専用ページ
{personal_url}
▼ ご契約プラン
{plan_type}
安全のため、送信前に確認ダイアログを表示してください。
送信ログをCSVに出力してください。
1秒間隔で送信してください(スパム判定回避)。
Claude Codeで業務自動化を始めませんか?
Aurant TechnologiesはClaude Code導入から自動化設計まで無料相談を承っています。