メールの受信

アプリに送信されるメール メッセージは、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 SDK では、受信メールを処理するためのウェブ アプリ クラス InboundMailHandler が定義されています。InboundMailHandlergoogle.appengine.ext.webapp.mail_handlers パッケージにあります。

InboundMailHandler を使用するには:

  1. InboundMailHandler のサブクラスを作成し、receive() メソッドをオーバーライドします。
  2. Python SDK で定義されているクラス InboundEmailMessage の引数を使用して receive() メソッドを呼び出します。

たとえば、次のように InboundEmailMessage のインスタンスを作成できます。

import logging

from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
import webapp2


class LogSenderHandler(InboundMailHandler):
    def receive(self, mail_message):
        logging.info("Received a message from: " + mail_message.sender)

InboundMailHandler には、すべての受信メールアドレスとメールハンドラの一致ペアを返す mapping() コンビニエンス クラス メソッドが含まれます。これは、InboundMailHandler の任意のサブクラスで呼び出すことができます。

app = webapp2.WSGIApplication([LogSenderHandler.mapping()], debug=True)

InboundEmailMessage オブジェクト(この例では mail_message)にメール メッセージが含まれています。bodies() メソッドがメッセージ内の本文を返します。bodies() を引数なしで呼び出すと、先に HTML 形式の本文、次に書式なしテキストの本文を返すイテレータが返されます。HTML または書式なしテキストのいずれかが必要な場合は、次のように bodies() に引数を渡すことができます。

plaintext_bodies = mail_message.bodies('text/plain')
html_bodies = mail_message.bodies('text/html')

for content_type, body in html_bodies:
    decoded_html = body.decode()
    # ...

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

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

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

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

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

    開発用サーバーの実行方法などの詳細については、Python 開発用サーバーをご覧ください。