Mail API でメールを受信する

このガイドでは、Mail API を使用してメールを受信する方法について説明します。

アプリに送信されるメール メッセージは、MIME データを含む HTTP リクエストとして実装されます。受信メール メッセージを処理するには、アプリの構成でメールアドレスをスクリプト ハンドラに関連付けてから、ハンドラをアプリのコードに追加します。

これにより、受信メールから HTTP リクエストが生成され、適切なスクリプトに渡されます。受信メールを処理するスクリプトは、デフォルトのサービスに存在している必要があります。

メールサービスの詳細については、Mail API の概要をご覧ください。

始める前に

送信者のメールアドレスを承認済み送信者として登録する必要があります。詳細については、メールを送信できるユーザーをご覧ください。

メールを受信するアプリの構成

新しくアプリを作成すると、受信メールはデフォルトで無効になっています。受信メールを有効にするには、デフォルトのサービスで app.yaml ファイルを変更する必要があります。

  1. 受信メールサービスを有効にする inbound_services セクションを追加します。 次に例を示します。

    inbound_services:
    - mail

    このセクションを構成ファイルに追加して受信メールを有効にしないと、受信メールは無効になり、アプリに送信されるメール メッセージは無視されます。

  2. URL にマッピングされたメールアドレスとスクリプト ハンドラを関連付けるマッピングを追加します。

    デフォルト サービスの場合、メール受信用のメールアドレスの形式は次のとおりです。

    [STRING]@[Google Cloud project ID].appspotmail.com
    

    デフォルト以外のサービスの場合、メールアドレスの形式は次のようになります。

    [STRING]@[servicename]-dot-[Google Cloud project ID].appspotmail.com
    

    メール メッセージは、次の URL を使用する HTTP POST リクエストとしてアプリに送信されます。[ADDRESS] はドメイン名を含む完全なメールアドレスです。

    /_ah/mail/[ADDRESS]
    

    受信メールをアプリで処理するには、app.yaml ファイルでメールの URL をハンドラにマッピングします。

    - url: /_ah/mail/.+
      script: handle_incoming_email.app
      login: admin

    上記の例で、/_ah/mail/.+ はアプリ宛てのすべてのメールアドレスを照合します。次の例のように、メールアドレスごとに複数のハンドラを設定することもできます。

    - url: /_ah/mail/owner@.*your_app_id\.appspotmail\.com
      script: handle_owner.app
      login: admin
    - url: /_ah/mail/support@.*your_app_id\.appspotmail\.com
      script: handle_support.app
      login: admin
    - url: /_ah/mail/.+
      script: handle_catchall.app
      login: admin

    受信メール メッセージの URL がこのリストの先頭から最後までの項目と照合されます。メール メッセージの URL が複数のパターンと一致した場合は、最初に一致したハンドラが実行されるハンドラになります。最後のマッピングに catchall ハンドラを入れることもできます。ハンドラはデフォルトのモジュール(またはアプリ バージョン)で実行されます。

受信メールの処理

Python ウェブ フレームワークを使用する際は、InboundEmailMessage コンストラクタが HTTP リクエスト本文のバイト列を取り込みます。Python では、InboundEmailMessage オブジェクトを作成する方法が複数あります。Flask では、request.get_data() によってリクエスト バイト列が与えられます。InboundEmailMessage オブジェクトにメール メッセージが含まれます。bodies() メソッドがメッセージ内の本文を返します。bodies() を引数なしで呼び出すと、先に HTML 形式の本文、次に書式なしテキストの本文を返すイテレータが返されます。HTML または書式なしテキストのいずれかが必要な場合は、次のように bodies() に引数を渡すことができます。

@app.route("/_ah/mail/<path>", methods=["POST"])
def receive_mail(path):
    message = mail.InboundEmailMessage(request.get_data())

    # Do something with the message
    print(
        f"Received greeting for {escape(message.to)} at {escape(message.date)} from {escape(message.sender)}"
    )
    for content_type, payload in message.bodies("text/plain"):
        print(f"Text/plain body: {payload.decode()}")
        break

    return "OK", 200

InboundEmailMessage オブジェクトには、その他のメッセージ フィールドにアクセスするための属性が含まれます。

  • subject にはメッセージの件名が含まれます。
  • sender は、"Nobody <nobody@example.com>" のような、送信者のアドレスです。
  • to は、"Joe <joe@example.com>, Bill <bill@example.com>" のようなメッセージ受信者のカンマ区切りリストです。
  • cc には、"Joe <joe@example.com>, Bill <bill@example.com>" のような cc 受信者のカンマ区切りリストが含まれます。
  • date はメッセージの日付を返します。
  • attachmentsAttachment オブジェクトのリストです。空の場合もあります。
  • original は、Python の email.message.Message のような、他のフィールドによって公開されないデータ(メールヘッダーなど)を含む完全なメッセージです。

ローカル開発用サーバーでの受信メッセージのシミュレーション

受信メールを処理するようにアプリを設定すると、開発用サーバーのコンソールで受信メール メッセージのシミュレーションを行うことができます。

  1. http://localhost:8080/console に移動して [Sign in as administrator] を選択し、管理者として開発用サーバーにアクセスします。
  2. 開発用サーバーで、ナビゲーションにある [Inbound Mail] をクリックします。
  3. 表示されたフォームに入力して、[Send Email] をクリックします。

    開発用サーバーの実行方法については、ローカル開発用サーバーをご覧ください。

Mail API の移行に関する考慮事項を確認する。メールハンドラ ガイドをご覧ください。