Menerima Email

Pesan email yang dikirim ke aplikasi Anda diimplementasikan sebagai permintaan HTTP yang berisi data MIME. Untuk memproses pesan email masuk, kaitkan alamat email dengan pengendali skrip di konfigurasi aplikasi Anda, lalu sertakan pengendali dalam kode aplikasi Anda.

Email masuk menghasilkan permintaan HTTP, yang diteruskan ke skrip yang sesuai. Skrip yang menangani email masuk harus berada di layanan default Anda.

Untuk informasi selengkapnya tentang layanan Mail, lihat Ringkasan Mail API.

Mengonfigurasi aplikasi Anda untuk menerima email

Ketika Anda membuat aplikasi baru, email masuk dinonaktifkan secara default. Untuk mengaktifkan email masuk, Anda harus mengubah file app.yaml di layanan default.

  1. Tambahkan bagian inbound_services yang mengaktifkan layanan email masuk. Contoh:

    inbound_services:
    - mail

    Jika Anda tidak mengaktifkan email masuk dengan menyertakan bagian ini dalam file konfigurasi, email masuk akan dinonaktifkan, dan pesan email yang dikirim ke aplikasi akan diabaikan.

  2. Tambahkan pemetaan yang mengaitkan alamat email yang dipetakan URL dengan pengendali skrip.

    Untuk layanan default, alamat email untuk menerima email memiliki format berikut:

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

    Untuk layanan non-default, alamat email memiliki format berikut:

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

    Pesan email dikirim ke aplikasi Anda sebagai permintaan POST HTTP menggunakan URL berikut, dengan [ADDRESS] sebagai alamat email lengkap, termasuk nama domain:

    /_ah/mail/[ADDRESS]
    

    Untuk menangani email masuk di aplikasi Anda, petakan URL email ke pengendali di file app.yaml:

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

    Pada contoh di atas, /_ah/mail/.+ cocok dengan semua email yang dialamatkan ke aplikasi. Jika ingin, Anda dapat menyiapkan beberapa pengendali untuk alamat email yang berbeda, seperti pada contoh berikut:

    - 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 pesan email masuk dicocokkan dengan daftar ini dari awal hingga akhir. Jadi, jika URL pesan email cocok dengan lebih dari satu pola, pengendali pertama yang cocok akan dieksekusi. Dengan begitu, Anda dapat menyertakan pengendali "catchall" sebagai pemetaan terakhir. Pengendali berjalan dalam modul default (atau versi aplikasi).

Menangani email masuk

Python SDK menentukan InboundMailHandler, class webapp untuk menangani email masuk. InboundMailHandler ada dalam paket google.appengine.ext.webapp.mail_handlers.

Untuk menggunakan InboundMailHandler:

  1. Buat subclass untuk InboundMailHandler dan ganti metode receive().
  2. Panggil metode receive() dengan argumen class InboundEmailMessage, yang ditentukan oleh Python SDK.

Misalnya, Anda dapat membuat instance InboundEmailMessage seperti ini:

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 berisi metode class praktis mapping() yang menampilkan pasangan yang cocok dengan semua alamat email masuk ke pengendali email, dan tentu saja Anda dapat memanggilnya pada subclass InboundMailHandler mana pun yang Anda kodekan:

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

Objek InboundEmailMessage (dalam contoh ini mail_message) berisi pesan email. Metode bodies() menampilkan isi dalam pesan. Jika Anda memanggil bodies() tanpa argumen, metode ini akan menampilkan iterator yang menghasilkan isi HTML terlebih dahulu, lalu isi teks biasa. Jika hanya menginginkan HTML atau teks biasa, Anda dapat meneruskan argumen ke 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()
    # ...

Objek InboundEmailMessage menyertakan atribut untuk mengakses kolom pesan lainnya:

  • subject berisi subjek pesan.
  • sender adalah alamat pengirim, misalnya "Nobody <nobody@example.com>"
  • to adalah daftar penerima utama pesan yang dipisahkan koma, misalnya "Joe <joe@example.com>, Bill <bill@example.com>".
  • cc berisi daftar penerima Cc yang dipisahkan koma, misalnya "Joe <joe@example.com>, Bill <bill@example.com>".
  • date menampilkan tanggal pesan.
  • attachments adalah daftar objek Attachment, yang mungkin kosong.
  • original adalah pesan lengkap, termasuk data yang tidak ditampilkan oleh kolom lain seperti header email, sebagai Python email.message.Message.

Menyimulasikan pesan masuk dengan server pengembangan lokal

Setelah menyiapkan aplikasi untuk menangani email masuk, Anda dapat menggunakan konsol server pengembangan untuk menyimulasikan pesan email masuk:

  1. Akses server pengembangan sebagai administrator dengan membuka http://localhost:8080/console, lalu pilih Login sebagai administrator.
  2. Di server pengembangan, klik Email Masuk pada navigasi.
  3. Isi formulir yang muncul, lalu klik Kirim Email.

    Untuk mempelajari lebih lanjut, termasuk cara menjalankan server pengembangan, lihat Server Pengembangan Python.