이메일 받기

앱으로 전송된 이메일 메시지는 MIME 데이터가 포함된 HTTP 요청으로 구현됩니다. 수신 이메일 메시지를 처리하려면 이메일 주소를 앱 구성의 스크립트 핸들러와 연결한 다음 앱 코드에 핸들러를 포함합니다.

수신 이메일은 관련 스크립트로 전달되는 HTTP 요청을 생성합니다. 기본 서비스에 수신 이메일을 처리하는 스크립트가 있어야 합니다.

메일 서비스에 대한 자세한 내용은 메일 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]
    

    앱에서 수신 이메일을 처리하려면 이메일 URL을 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

    수신 이메일 메시지의 URL이 목록의 처음부터 끝까지 대응되므로 이메일 메시지 URL이 둘 이상의 패턴과 일치하면 첫 번째 일치하는 핸들러가 실행됩니다. 이렇게 하면 마지막 매핑으로 '포괄' 핸들러를 포함할 수 있습니다. 핸들러는 기본 모듈(또는 애플리케이션 버전)에서 실행됩니다.

수신 이메일 처리

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에는 참조 수신자를 쉼표로 구분한 목록이 포함됩니다(예: "Joe <joe@example.com>, Bill <bill@example.com>").
  • date는 메시지 날짜를 반환합니다.
  • attachmentsAttachment 객체 목록이며 비어 있을 수 있습니다.
  • original은 나머지 필드(예: 이메일 헤더)에 의해 노출되지 않은 데이터가 포함된 전체 메시지입니다(형식: Python email.message.Message).

로컬 개발 서버에서 수신 메시지 시뮬레이션

수신 이메일을 처리하도록 앱을 설정한 후 개발 서버 콘솔을 사용하여 수신 이메일 메시지를 시뮬레이션할 수 있습니다.

  1. http://localhost:8080/_ah/login으로 이동한 다음 관리자로 로그인을 선택하여 개발 서버에 관리자로 액세스합니다.
  2. 개발 서버의 탐색 메뉴에서 수신 메일을 클릭합니다.
  3. 나타나는 양식을 작성한 다음 이메일 보내기를 클릭합니다.

    개발 서버를 실행하는 방법을 비롯한 자세한 내용은 Python 개발 서버를 참조하세요.