問い合わせメール転送機能実装手順書

概要

DialFocusサイトの問い合わせフォームの入力内容をGmailアドレスに転送する機能をCloudflare Workers + Email Routingで実装します。

アーキテクチャ

実装手順

1. Cloudflare Workers プロジェクトの作成

1.1 Wrangler CLIのインストール

npm install -g wrangler

1.2 Cloudflareにログイン

wrangler login

1.3 Workersプロジェクトの初期化

mkdir tsuchiya-contact-form
cd tsuchiya-contact-form
wrangler init

2. プロジェクト設定

2.1 wrangler.tomlの設定

name = "tsuchiya-contact-form"
main = "src/index.js"
compatibility_date = "2023-12-01"

[env.production]
vars = { ENVIRONMENT = "production" }

[[env.production.bindings]]
name = "EMAIL"
type = "send_email"

2.2 環境変数の設定

wrangler secret put GMAIL_ADDRESS
# プロンプトでGmailアドレスを入力

3. Workers コードの実装

3.1 src/index.js

export default {
  async fetch(request, env) {
    // CORS設定(実際のPagesドメインに変更)
    const corsHeaders = {
      'Access-Control-Allow-Origin': 'https://your-pages-domain.pages.dev',
      'Access-Control-Allow-Methods': 'POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type',
    };

    // OPTIONSリクエストの処理(CORS preflight)
    if (request.method === 'OPTIONS') {
      return new Response(null, { headers: corsHeaders });
    }

    // POSTリクエストの処理
    if (request.method === 'POST') {
      try {
        const formData = await request.json();
        
        // バリデーション
        if (!formData.email || !formData.subject || !formData.message) {
          return new Response(
            JSON.stringify({ error: 'Required fields missing' }),
            { status: 400, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
          );
        }

        // メールアドレスの簡易バリデーション
        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        if (!emailRegex.test(formData.email)) {
          return new Response(
            JSON.stringify({ error: 'Invalid email format' }),
            { status: 400, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
          );
        }

        // メール送信
        await env.EMAIL.send({
          from: '[email protected]', // 実際のドメインに変更
          to: env.GMAIL_ADDRESS,
          subject: `[DialFocus Contact] ${formData.subject}`,
          text: `
問い合わせフォームからのメッセージ

差出人: ${formData.email}
件名: ${formData.subject}

メッセージ:
${formData.message}

---
送信日時: ${new Date().toISOString()}
          `,
        });

        return new Response(
          JSON.stringify({ success: true, message: 'Email sent successfully' }),
          { headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
        );
      } catch (error) {
        console.error('Email sending error:', error);
        return new Response(
          JSON.stringify({ error: 'Failed to send email' }),
          { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
        );
      }
    }

    return new Response('Method not allowed', { 
      status: 405,
      headers: corsHeaders
    });
  },
};

4. Cloudflare Email Routing設定

4.1 ドメインでEmail Routingを有効化

  1. Cloudflareダッシュボードにログイン
  2. 対象ドメインを選択
  3. 「Email」タブに移動
  4. 「Email Routing」を有効化

4.2 MXレコードの設定

Email Routing有効化時に自動で設定されます:

Type: MX
Name: @
Content: isaac.mx.cloudflare.net
Priority: 10

4.3 転送ルールの設定

  1. 「Routing rules」で新しいルールを作成
  2. 送信先: [email protected]
  3. 転送先: あなたのGmailアドレス

5. Workersのデプロイ

5.1 デプロイ実行

wrangler deploy

5.2 デプロイ後のURL確認

デプロイ完了後、以下のようなURLが発行されます:

https://tsuchiya-contact-form.your-subdomain.workers.dev

6. Pages側フォームの修正

6.1 日本語サポートページ(ja/apps/dialfocus/support.md)

既存のフォーム送信処理を以下に置き換え:

// フォーム送信処理の修正(既存のsubmitイベントリスナー内)
if (!hasErrors) {
  submitButton.disabled = true;
  submitButton.textContent = '送信中...';
  
  try {
    // Workers APIに送信
    const response = await fetch('https://tsuchiya-contact-form.your-subdomain.workers.dev/', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        email: email,
        subject: subject,
        message: message,
      }),
    });
    
    const result = await response.json();
    
    if (response.ok && result.success) {
      // 成功処理
      form.style.display = 'none';
      successMessage.classList.add('show');
      
      // 3秒後にフォームをリセット
      setTimeout(() => {
        form.reset();
        form.style.display = 'block';
        successMessage.classList.remove('show');
        submitButton.disabled = false;
        submitButton.textContent = 'メッセージを送信';
      }, 3000);
    } else {
      throw new Error(result.error || '送信に失敗しました');
    }
  } catch (error) {
    console.error('Form submission error:', error);
    alert('送信に失敗しました。もう一度お試しください。');
    submitButton.disabled = false;
    submitButton.textContent = 'メッセージを送信';
  }
}

6.2 英語サポートページ(en/apps/dialfocus/support.md)

同様の処理を英語版にも適用:

// 英語版のsubmitButton.textContentを変更
submitButton.textContent = 'Sending...';
// 成功後
submitButton.textContent = 'Send Message';

7. 設定値の更新

7.1 実際の値に置き換える項目

7.2 CORS設定の確認

CORSのAccess-Control-Allow-Originを正確なPagesドメインに設定

8. テスト

8.1 動作テスト

  1. フォームから実際にメッセージを送信
  2. Gmailでメールが受信されることを確認
  3. エラーハンドリングのテスト

8.2 確認項目

セキュリティ考慮事項

レート制限の実装(推奨)

// Workers内でIP別のレート制限を実装
const rateLimitKey = request.headers.get('CF-Connecting-IP');
// KV Storageを使用してレート制限実装

スパム対策

トラブルシューティング

よくある問題

  1. CORS エラー: Origin設定を確認
  2. メールが届かない: Email Routingの設定確認
  3. Workers デプロイエラー: wrangler.tomlの設定確認

ログ確認方法

wrangler tail tsuchiya-contact-form

費用

補足: Gmail送信設定(オプション)

概要

独自ドメインからGmail経由でメール送信を可能にする設定です。フォーム機能には不要ですが、プロフェッショナルな対応のために設定できます。

前提条件

オプション1: Google Workspace利用(推奨)

Step 1: Google Workspaceの契約

  1. Google Workspace(https://workspace.google.com/)にアクセス
  2. プランを選択(Business Starter: 月額680円/ユーザー)
  3. 独自ドメインでアカウント作成

Step 2: ドメイン認証

  1. Google WorkspaceでドメインVerification
  2. CloudflareでTXTレコード追加
  3. MXレコードをGoogle Workspaceに変更

Step 3: Gmail設定

  1. Google WorkspaceアカウントでGmail利用
  2. you@[ドメイン]として自動的に送受信可能

オプション2: 外部SMTP利用

推奨SMTPサービス

Step 1: SMTPサービス契約

  1. 選択したサービスでアカウント作成
  2. ドメイン認証設定
  3. SMTP認証情報取得

Step 2: Gmail設定

  1. Gmail → 設定 → アカウントとインポート
  2. 「他のメールアドレスを追加」をクリック
  3. 必要情報を入力:
    名前: あなたの名前
    メールアドレス: contact@[ドメイン]
    エイリアスとして扱う: チェック
    

Step 3: SMTP設定

  1. 「SMTPサーバー経由で送信」を選択
  2. SMTP情報を入力:
    SMTPサーバー: [サービス提供のSMTPサーバー]
    ポート: 587 (TLS) または 465 (SSL)
    ユーザー名: [SMTP認証ユーザー名]
    パスワード: [SMTP認証パスワード]
    TLS接続: 有効
    

Step 4: 確認コード入力

  1. 確認メールがcontact@[ドメイン]に送信
  2. Email Routingでメールが転送される
  3. 確認コードをGmailに入力

オプション3: シンプルな返信設定

Gmail設定のみ

  1. Gmail → 設定 → 全般
  2. 「返信時のデフォルト動作」設定
  3. 署名に独自ドメインのメールアドレスを記載

署名例

--
Tsuchiya
DialFocus Developer
contact@[ドメイン]

DNS設定が必要な場合

SPFレコード(送信認証)

Type: TXT
Name: @
Content: v=spf1 include:[SMTPサービス] ~all

DKIMレコード(送信認証)

SMTPサービス提供の設定に従って追加

注意事項

  1. Google Workspace推奨: 最もシンプルで確実
  2. SMTP設定: 技術的知識が必要
  3. DNS伝播: 設定変更後24-48時間で有効
  4. テスト送信: 設定完了後は必ずテスト

トラブルシューティング

この手順書に従って実装することで、問い合わせフォームからGmailへのメール転送機能が完成します。