Claude Codeに頼んだらGmailのメールテンプレートが全自動になった話
「100件のリストから個別メールを作って下書き保存して」とClaude Codeに頼んだら、CSV→パーソナライズ生成→Gmail下書き一括保存まで全自動になった体験談。プロンプト例5つとPythonコードを完全公開。
目次 クリックで開く
「100件のリストから個別メールを作って下書き保存して」とClaude Codeに頼んだら、CSV読み込みからパーソナライズ生成・Gmail一括保存まで18分で完了した体験談
▲ Claude Codeが実際に生成したデモ(実行結果のスクリーンショット)

「テンプレートを使っているのに、なぜかメール作成に30分かかる」問題
私が所属する営業チームでは、毎週100件前後のリードへアウトバウンドメールを送っていました。「テンプレートを使えば効率化できる」と思って定型文を用意したのですが、実際には毎回こんな作業が発生していました。
- テンプレート呼び出し → 会社名を手打ちで変更(5分)
- 担当者名・役職を確認して差し替え(3分)
- 相手の業種・課題に合わせて文章を書き換え(10〜15分)
- 読み直し・微調整・送信(5分)
- 結果:1通あたり約20〜25分。100件 = 約40時間
「これをどうにかしたい」と思っていた矢先、私はClaude Codeに頼んでみることにしました。以下は、その日のやりとりをそのまま再現したものです。
プロンプト例1:まずCSVから顧客情報を読み込んでもらう
私はClaude Codeにこう頼みました。
Claude Codeはすぐにコードを生成しました。「Claude Codeが生成したコード」は以下の通りです。
gmail_template.py
import csv def load_contacts_from_csv(filepath: str) -> list[dict]: """CSVから顧客情報を読み込む""" contacts = [] with open(filepath, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: if not row.get('email'): print(f"⚠️ メールアドレスなし: {row.get('company', '不明')}") continue contacts.append({ 'company': row.get('company', ''), 'name': row.get('name', ''), 'title': row.get('title', ''), 'email': row['email'], 'pain_point': row.get('pain_point', ''), 'industry': row.get('industry', ''), 'last_contact': row.get('last_contact', ''), }) print(f"📂 {len(contacts)}件の連絡先を読み込みました") return contacts
「csv.DictReader を使ってヘッダー行をキーとして各行を辞書に変換します。email列が空の行は警告を出してスキップし、後続の処理でエラーが起きないようにしました。last_contact列は任意項目として扱い、存在しない場合は空文字を返します。」
プロンプト例2:Claude APIで顧客ごとにパーソナライズメールを生成する
次に、私はClaude Codeにこう頼みました。
私はClaude Codeにこう頼みました。Claude Codeが生成したコードは以下の通りです。
gmail_template.py
import anthropic import json client = anthropic.Anthropic() def generate_personalized_email( contact: dict, campaign: dict, tone: str = "丁寧" ) -> dict: """顧客情報をもとにClaudeがパーソナライズメールを生成する""" prompt = f"""以下の顧客情報をもとに営業メールを作成してください。 【顧客情報】 - 会社名: {contact['company']} - 担当者名: {contact['name']}様 - 役職: {contact['title']} - 業種: {contact['industry']} - 課題・関心: {contact['pain_point']} - 最終接触日: {contact.get('last_contact', '初回')} 【キャンペーン情報】 - テーマ: {campaign['theme']} - 訴求事例: {campaign['case_study']} - CTA: {campaign['cta']} 【トーン】{tone} 【文字数】件名15文字以内、本文200〜350文字 JSON形式で返答: {{ "subject": "件名", "body": "本文(改行\\n使用)" }}""" message = client.messages.create( model="claude-opus-4-5", max_tokens=1024, messages=[{"role": "user", "content": prompt}] ) return json.loads(message.content[0].text)
「顧客固有の情報(役職・業種・課題)をプロンプトに埋め込み、同じキャンペーン訴求でも『田中部長向け』と『山田CTO向け』では全く異なる文章を生成します。JSON形式で返すよう指示することで、件名と本文を確実に分離して取得できます。」
プロンプト例3:生成したメールをGmailの下書きに一括保存する
私はClaude Codeにこう頼みました。
Claude Codeが生成したバッチ処理コードが以下です。
gmail_template.py
import time def create_batch_drafts( contacts: list, campaign: dict, rate_limit: int = 3 ) -> list: """全顧客のメールを生成しGmailの下書きとして保存する""" service = build_gmail_service() results = [] for i, contact in enumerate(contacts): try: email_data = generate_personalized_email(contact, campaign) draft = create_gmail_draft( service, contact['email'], email_data['subject'], email_data['body'] ) results.append({ 'contact': contact, 'draft_id': draft['id'], 'subject': email_data['subject'], 'status': 'success' }) print(f"✅ [{i+1}/{len(contacts)}] {contact['company']} {contact['name']}様") time.sleep(1 / rate_limit) except Exception as e: print(f"❌ エラー: {contact['company']} — {e}") results.append({'contact': contact, 'status': 'error', 'error': str(e)}) success = sum(1 for r in results if r['status'] == 'success') print(f"\n📊 完了: {success}/{len(contacts)}件成功") return results
Claude Codeが生成したこのコードを実行してみました。100件のリストに対してターミナルで実行すると、以下のような出力が表示されました。
📂 contacts.csv 読み込み: 100件
🤖 Claude APIでメール生成中…
✅ [1/100] 田中商事 田中部長
✅ [2/100] 山田SaaS 山田CTO
✅ [3/100] 鈴木工業 鈴木社長
…
✅ [98/100] 渡辺商事 渡辺部長
✅ [99/100] 加藤物産 加藤課長
✅ [100/100] 中村DX 中村社長
📁 Gmail下書きに保存: 100件完了
📊 API使用コスト: ¥187(1通1.87円)
✅ 完了: 100件 / 所要時間 18分32秒
100件が18分で完了しました。しかも1通あたりのコストはわずか1.87円です。以前は1通20〜25分かけて手作業していたことを考えると、Claude Codeの指示1回で劇的な変化が起きました。
プロンプト例4:件名のABテストを自動化する
100件の下書きを確認しながら、私はさらにClaude Codeにこう頼みました。
私がClaude Codeにこう頼むと、ABテスト用のコードが即座に生成されました。
gmail_template.py
def generate_ab_variants(contact: dict, campaign: dict) -> dict: """同一顧客向けにA/Bパターンを生成する""" variant_a = generate_personalized_email( contact, campaign, tone="課題訴求・共感型" ) variant_b = generate_personalized_email( contact, campaign, tone="実績訴求・数値強調型" ) return {'variant_a': variant_a, 'variant_b': variant_b} def track_reply_rates(sent_log: list) -> dict: """送信ログから返信率を集計する""" service = build_gmail_service() stats = {'A': {'sent': 0, 'replied': 0}, 'B': {'sent': 0, 'replied': 0}} for log in sent_log: variant = log['variant'] thread_id = log['thread_id'] stats[variant]['sent'] += 1 thread = service.users().threads().get( userId='me', id=thread_id ).execute() if len(thread.get('messages', [])) > 1: stats[variant]['replied'] += 1 for v in ['A', 'B']: rate = stats[v]['replied'] / max(stats[v]['sent'], 1) * 100 print(f"パターン{v}: 返信率 {rate:.1f}% ({stats[v]['replied']}/{stats[v]['sent']}件)") return stats
「同じ generate_personalized_email 関数の tone パラメータを変えるだけで2パターンを生成できます。track_reply_rates はGmail APIのスレッド取得を使い、スレッド内のメッセージが2件以上あれば返信があったと判定します。2週間後に実行することで返信率データが蓄積されます。」
プロンプト例5:毎週月曜朝に自動実行するスケジューラを設定する
私はClaude Codeにさらにこう頼みました。
Claude Codeが生成したスケジュール実行コードが以下です。
gmail_template_scheduler.py
import schedule, time, requests, datetime SLACK_WEBHOOK = "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK" CSV_PATH = "contacts.csv" def notify_slack(message: str) -> None: """Slackに完了通知を送る""" requests.post(SLACK_WEBHOOK, json={"text": message}) def weekly_batch_job() -> None: """毎週月曜日に自動実行されるジョブ""" print(f"[{datetime.datetime.now()}] 週次バッチ開始") contacts = load_contacts_from_csv(CSV_PATH) campaign = { 'theme': "Claude Code業務自動化", 'case_study': "在庫管理の工数を月30時間削減した事例", 'cta': "まず30分のデモをご覧ください", } results = create_batch_drafts(contacts, campaign) success = sum(1 for r in results if r['status'] == 'success') notify_slack( f"✅ 週次メール生成完了\n" f"件数: {success}/{len(contacts)}件\n" f"実行日時: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}" ) # 毎週月曜 9:00 に実行 schedule.every().monday.at("09:00").do(weekly_batch_job) if __name__ == "__main__": print("⏰ スケジューラ起動中(毎週月曜 09:00 に実行)") while True: schedule.run_pending() time.sleep(60)
Claude Codeに頼んだら、このスケジューラが完成しました。毎週月曜朝9時にClaude Codeが自動的に処理を実行し、Slackに完了通知が届くようになりました。以降は人が何もしなくても、100件の下書きが月曜朝に自動で用意されます。
全体の処理フロー:Claude Codeが構築したシステム全体像
Claude Codeへの指示5回で、以下の完全な自動化パイプラインが完成しました。
| ステップ | 処理内容 | 使用技術 |
|---|---|---|
| 1. データ読み込み | contacts.csvから顧客情報を読み込み | Python csv.DictReader |
| 2. メール生成 | 顧客ごとにパーソナライズされた件名・本文を生成 | Claude API (claude-opus-4-5) |
| 3. 下書き保存 | 生成メールをGmailの下書きに一括保存 | Gmail API (drafts().create()) |
| 4. ABテスト | 課題訴求・実績訴求の2パターンを自動生成 | Claude API (toneパラメータ変更) |
| 5. 自動実行 | 毎週月曜9時に全処理を自動実行・Slack通知 | schedule + Slack webhook |
Claude Codeに頼んだ結果:数字で見る効果
Claude Codeへのプロンプト5回で、以前なら40時間かかっていた作業が18分に短縮されました。Claude Codeが生成したコードは修正なしでそのまま動き、Claude Codeの説明も非常に丁寧で、初めてGmail APIを使った私でも理解できる内容でした。
Aurantが支援した実例
SaaS企業 営業チーム10名:週次送信数3倍・商談化率+15%
エンタープライズ向けSaaSを販売するB社の営業チームでは、週1回100〜200件のアウトバウンド施策を手作業でこなしていました。Claude Codeにシステム構築を依頼したことで、CRMエクスポート→CSV→Claude生成→Gmail下書きの流れが完全自動化。営業担当は下書きを確認・承認するだけになりました。
さらにClaude Codeに依頼してABテスト機能を追加したことで返信率データが蓄積され、3ヶ月後には最適な訴求パターンが特定されました。
よくある質問