OutlookのメールをClaude Codeで自動振り分け・自動返信させたら受信トレイ管理が劇的に楽になった体験記【2026年版】

Claude Codeを使ってOutlookの受信トレイを完全自動化した体験記。win32comによる自動振り分け・自動返信・転送・Excel出力・一括送信・時間指定送信まで、Claude Codeが生成した実際のPythonコードを全公開。

この記事をシェア:
目次 クリックで開く




💌 Outlook 自動化
🤖 Claude Code
2026年4月25日
📖 読了 約15分

毎朝、100件超えの受信トレイを手作業で処理するのが当たり前になっていた私が、Claude Codeに頼んでOutlookメールを全自動化したところ、メール処理時間が1日2時間から15分に激減しました。この記事では、Claude Codeに実際に送ったプロンプト・生成されたPythonコード(win32com使用)・実行結果をすべて公開します。プログラミングの知識がなくても、Claude Codeに話しかけるだけで業務自動化できる時代が来ました。

Claude CodeによるOutlookメール自動化デモ画面

▲ Claude Code が生成したPythonコードでOutlookの受信トレイを自動振り分けしている様子

なぜ私は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

シナリオ①:差出人・件名で自動振り分け

1 自動振り分け(win32com)

最初に Claude Code に試みたのは、受信メールを差出人ドメインと件名キーワードの組み合わせで自動的にフォルダに振り分けるスクリプトです。Outlookの標準ルールでは設定できなかった複合条件を、Pythonで完全にカスタマイズできるのが魅力です。

💬 私はClaude Codeにこう頼みました:PythonとOutlookのCOM自動化(win32com)を使って、受信トレイのメールを自動振り分けするスクリプトを書いてください。

条件:
– 差出人が @important-client.co.jp ドメインで件名に「見積」「発注」が含まれる → 「重要取引先」フォルダ
– 差出人が社内(@mycompany.co.jp)のメール → 「社内連絡」フォルダ
– 件名に「メルマガ」「配信停止」「unsubscribe」が含まれる → 「メルマガ」フォルダ
– それ以外は「未分類」フォルダ

フォルダが存在しない場合は自動作成してください。
スクリプトは毎分自動実行できるようにしてください。

🤖 Claude Code の回答(生成されたコード):

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)
Claude CodeによるOutlook自動化結果
Claude CodeによるOutlook自動化結果

▶ 実行結果
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が起動している間はリアルタイムで振り分けが機能します。

シナリオ②:特定パターンのメールに自動返信

2 自動返信(テンプレート付き)

次に Claude Code に頼んだのは、定型的な問い合わせメールへの自動返信です。「在庫確認」「納期確認」「カタログ請求」の3種類の問い合わせが毎日20〜30件来るので、それぞれにテンプレート返信を自動送信したいと考えました。

💬 私はClaude Codeにこう頼みました:Outlookのwin32comを使って、受信メールの件名・本文キーワードで返信テンプレートを自動送信するPythonスクリプトを書いてください。

対応パターン:
1. 件名または本文に「在庫」「stock」が含まれる
→ 「在庫確認のお問い合わせありがとうございます。現在の在庫状況は翌営業日中にご連絡いたします。」

2. 件名または本文に「納期」「delivery」が含まれる
→ 「納期に関するお問い合わせをいただきありがとうございます。担当者より3営業日以内にご連絡いたします。」

3. 件名または本文に「カタログ」「catalogue」「catalog」が含まれる
→ 「カタログのご請求ありがとうございます。PDFカタログをメールに添付してお送りします。」

重複返信を防ぐため、返信済みメールにカスタムフラグを立ててください。
社内メール(@mycompany.co.jp)には返信しないでください。

🤖 Claude Code の回答(生成されたコード):

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 が生成したコードはそのまま動作しました。

シナリオ③:条件一致メールを特定担当者に自動転送

3 自動転送(条件付き)

クレームや重要案件のメールは、私ではなく上長や専門担当者に即座に転送したいケースがあります。Claude Code に転送スクリプトの生成を依頼しました。

💬 私はClaude Codeにこう頼みました:Outlookのwin32comで、特定条件に一致する受信メールを自動転送するPythonコードを書いてください。

転送ルール:
– 件名に「クレーム」「苦情」「返品」「不具合」が含まれる → manager@mycompany.co.jp に転送
– 件名に「契約」「法務」「訴訟」が含まれる → legal@mycompany.co.jp に転送
– 差出人が @vip-client.co.jp のメール → vip-support@mycompany.co.jp に転送

転送メールには「【自動転送】元の件名」の形式で件名を付けてください。
転送済みかどうかをOutlookのカテゴリ機能で管理してください(転送済みカテゴリを付与する)。

🤖 Claude Code の回答(生成されたコード):

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に自動保存

4 データ抽出 → Excel保存

受注確認メールには毎回「品番:XXXXX、数量:XX個、希望納期:XXXX年XX月XX日」という定型フォーマットのデータが含まれています。これを手作業でExcelに転記していたのですが、Claude Code に自動化を依頼しました。

💬 私はClaude Codeにこう頼みました:Outlookの特定フォルダ「受注メール」にあるメールの本文から、以下のデータを正規表現で抽出してExcelファイルに自動保存するPythonスクリプトを書いてください。

抽出するデータ:
– 品番(「品番:」の後の英数字)
– 数量(「数量:」の後の数値と単位)
– 希望納期(「希望納期:」の後の日付)
– 差出人メールアドレス
– 受信日時
– 件名

Excelファイルは orders_2026.xlsx として保存し、シートに追記形式でデータを追加してください。
同じメールIDが既に登録されている場合は重複追加しないでください。

🤖 Claude Code の回答(生成されたコード):

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から個別文面付き一括メール送信

5 CSV一括送信(個別文面付き)

定期的に顧客リストへ個別の案内メールを送る業務があります。宛先・名前・専用URLが入ったCSVファイルから、それぞれの顧客に個別の文面でメールを送る処理を Claude Code に実装してもらいました。

💬 私はClaude Codeにこう頼みました:CSVファイルから顧客情報を読み込んで、Outlookのwin32comで個別文面付きの一括メールを送信するPythonスクリプトを書いてください。

CSVの列:email, name, company, personal_url, plan_type

メールテンプレート:
件名:【{company}様専用】春の特別キャンペーンのご案内
本文:
{name}様

いつも大変お世話になっております。
{company}様専用の春の特別キャンペーンをご用意いたしました。

▼ {name}様専用ページ
{personal_url}

▼ ご契約プラン
{plan_type}

安全のため、送信前に確認ダイアログを表示してください。
送信ログをCSVに出力してください。
1秒間隔で送信してください(スパム判定回避)。

Claude Codeで業務自動化を始めませんか?

Aurant TechnologiesはClaude Code導入から自動化設計まで無料相談を承っています。

無料相談はこちら →

AT
aurant technologies 編集

上場企業からスタートアップまで、数多くのデータ分析基盤構築・AI導入プロジェクトを主導。単なる技術提供にとどまらず、MA/CRM(Salesforce, Hubspot, kintone, LINE)導入によるマーケティング最適化やバックオフィス業務の自動化など、常に「事業数値(売上・利益)」に直結する改善実績多数。

この記事が役に立ったらシェア: