接收電子郵件

發送到應用程式的電子郵件是含 MIME 資料的 HTTP 要求。如要處理內送電子郵件,請將電子郵件地址與應用程式設定中的指令碼處理常式建立關聯,然後將處理常式加在應用程式的程式碼中。

內送電子郵件會產生 HTTP 要求,系統會將這些要求傳遞到適當的指令碼。您的預設服務必須要有處理內收電子郵件的指令碼。

如需進一步瞭解郵件服務,請參閱郵件 API 總覽

設定以應用程式接收電子郵件

建立新應用程式時,預設會停用內送電子郵件。若要啟用內送電子郵件,必須修改預設服務中的 app.yaml 檔案。

  1. 新增一個會啟用內送電子郵件服務的 inbound_services 區段。例如:

    inbound_services:
    - mail

    若未在設定檔中新增這個區段,以利啟用內送電子郵件, 就會停用內送電子郵件功能,因此會忽略發送至應用程式的電子郵件。

  2. 新增對應,為網址對應的電子郵件地址與指令碼處理常式建立關聯。

    您的應用程式可以使用符合以下格式的地址接收電子郵件:

    [STRING]@[GCP project ID].appspotmail.com
    

    發送到應用程式的電子郵件是採用以下網址的 HTTP POST 要求,其中 [ADDRESS] 是包含網域名稱的 完整電子郵件地址:

    /_ah/mail/[ADDRESS]
    

    若要在應用程式中處理內送電子郵件,須讓電子郵件網址對應於 app.yaml 檔案中的處理常式:

    - 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

    系統將根據此清單,從頭到尾一一比對內送電子郵件的網址; 如果電子郵件網址符合一個以上的格式, 系統會執行第一個相符的處理常式。這樣您所加入的最後一個對應項目就可以是「catchall」。處理常式會在預設模組 (或應用程式版本) 中執行。

處理內送電子郵件

Python SDK 定義 InboundMailHandler,這是一種用於處理內送電子郵件的 webapp 類別。InboundMailHandler 位在 google.appengine.ext.webapp.mail_handlers 套件中。

要使用 InboundMailHandler

  1. 請建立 InboundMailHandler 的子類別並覆寫 receive() 方法。
  2. 使用類別 receive() 的引數呼叫 InboundEmailMessage 方法 (這是以 Python SDK 定義的)。

例如,您可以建立一個 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 包含一個逗號分隔的清單,內容註明副本收件人,例如 "Joe <joe@example.com>, Bill <bill@example.com>"
  • date 會傳回電子郵件日期。
  • attachmentsAttachment 物件的清單,可能沒有內容。
  • original 是完整電子郵件,內容包括其他欄位沒有顯示的資料,例如電子郵件的標頭,如 Python email.message.Message

使用本機開發伺服器模擬內送電子郵件

設定好處理內送電子郵件的應用程式之後, 就可以使用開發伺服器主控台模擬內送電子郵件:

  1. http://localhost:8080/_ah/login 選取 [Sign in as administrator] (以管理員身分登入),以管理員身分存取開發伺服器。
  2. 在開發伺服器的導航介面中按一下 [傳入的郵件]
  3. 填妥出現的表單,然後按一下 [傳送電子郵件]

    如需詳細資訊,包括如何執行開發伺服器,請參閱 Python 開發伺服器

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境