使用 Mail API 接收郵件

本指南說明如何使用 Mail API 接收郵件。

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

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

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

事前準備

您必須將寄件者電子郵件註冊為已獲授權的寄件者。詳情請參閱哪些人可以傳送電子郵件

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

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

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

    inbound_services:
    - mail

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

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

    如果是預設服務,接收電子郵件的電子郵件地址格式如下:

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

    非預設服務的電子郵件地址格式如下:

    [STRING]@[servicename]-dot-[Google Cloud 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 網頁架構時,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>"
  • date 會傳回電子郵件日期。
  • attachmentsAttachment 物件的清單,可能沒有內容。
  • original 是完整電子郵件,內容包括其他欄位沒有顯示的資料,例如電子郵件的標頭,如 Python email.message.Message

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

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

  1. 前往 http://localhost:8080/console 並選取「以管理員身分登入」,以管理員身分存取開發伺服器。
  2. 在開發伺服器的導航介面中按一下 [傳入的郵件]
  3. 填妥出現的表單,然後按一下 [傳送電子郵件]

    如要執行開發伺服器,請參閱本機開發伺服器

如要進一步瞭解 Mail API 的遷移注意事項,請參閱「郵件處理常式」指南。