Halaman ini menjelaskan cara menggunakan Mail API, salah satu layanan paket versi lama, dengan runtime Python untuk lingkungan standar. Aplikasi Anda dapat mengakses layanan yang dipaketkan melalui SDK layanan App Engine untuk Python.
Ringkasan
Dalam Python, fungsi penanganan email disertakan dalam modul
google.appengine.api.mail. Ini berbeda dengan Python 2, dengan modul mail_handlers disediakan oleh webapp. Mail API untuk Python dapat digunakan untuk menerima email dan notifikasi pantulan.
Menggunakan Mail API
Aplikasi Anda menerima email saat email dikirim sebagai isi permintaan dalam permintaan HTTP POST. Agar aplikasi dapat menangani email masuk, aplikasi harus mencocokkan URL
dengan jalur /_ah/mail/[ADDRESS]. Bagian [ADDRESS]
jalur biasanya adalah alamat email dengan akhiran
@<Cloud-Project-ID>.appspotmail.com. Email yang dikirim ke aplikasi dalam format ini akan dirutekan ke fungsi.
Python tidak mengharuskan aplikasi untuk menentukan skrip pengendali dalam file app.yaml, sehingga Anda dapat menghapus semua bagian handler di app.yaml.
File app.yaml Anda harus menyimpan baris berikut:
inbound_services:
- mail
- mail_bounce
Mengirim email
Anda tidak perlu mengubah konfigurasi aplikasi saat mengupgrade ke Python. Perilaku, fitur, dan petunjuk penyiapan untuk mengirim email tetap sama. Lihat referensi Mail API untuk Python guna mengetahui detail selengkapnya.
Menerima email
Untuk menerima email, Anda harus mengimpor modul google.appengine.api.mail dan
menggunakan class InboundEmailMessage untuk mewakili email. Class ini perlu
dibuat instance-nya untuk mengambil konten email dari permintaan HTTP yang masuk.
Sebelumnya di Python 2, aplikasi dapat mengakses class InboundEmailMessage dengan mengganti metode receive() di pengendali aplikasi web InboundEmailHandler.
Hal ini tidak diperlukan di Python; sebagai gantinya, aplikasi perlu membuat instance objek baru.
Framework web
Saat menggunakan framework web Python, konstruktor InboundEmailMessage menggunakan byte isi permintaan HTTP. Ada beberapa cara untuk membuat objek InboundEmailMessage di Python. Berikut adalah contoh untuk aplikasi Flask dan Djago:
Python 3 (Flask)
Di Flask, request.get_data() memberikan byte permintaan.
Python 3 (Django)
Di Django, request.body memberikan byte isi permintaan HTTP.
Untuk melihat contoh kode lengkap dari panduan ini, lihat GitHub.
Framework lain yang mematuhi WSGI
Untuk framework lainnya yang mematuhi WSGI, sebaiknya gunakan metode yang sama seperti contoh Flask dan Django untuk membuat InboundEmailMessage. Metode ini berfungsi
saat byte isi permintaan HTTP tersedia secara langsung.
Aplikasi WSGI tanpa framework web
Jika aplikasi Anda adalah aplikasi WSGI yang tidak menggunakan framework web, ada kemungkinan bahwa byte isi permintaan HTTP tidak langsung tersedia. Jika byte isi permintaan HTTP tersedia secara langsung, sebaiknya gunakan framework web Python.
Dalam Python, metode factory bernama from_environ ditentukan untuk InboundEmailMessage. Metode ini adalah metode class yang menggunakan
kamus environWSGI
sebagai input, dan dapat digunakan untuk aplikasi WSGI apa pun.
Pada contoh berikut, perhatikan bagaimana environ diambil sebagai input untuk mendapatkan
mail_message:
Python 3 (aplikasi WSGI)
Menerima notifikasi email tidak terkirim
Notifikasi pantulan adalah pesan otomatis dari sistem email yang menunjukkan masalah pada pengiriman pesan aplikasi Anda. Untuk memproses notifikasi
memantul, aplikasi Anda harus mencocokkan jalur URL yang masuk dengan jalur
/_ah/bounce.
Seperti InboundEmailMessage, class BounceNotification untuk Python 2 dapat
diakses dengan mengganti metode receive() di pengendali webapp
BounceNotificationHandler.
Di Python, aplikasi perlu membuat instance objek BounceNotification yang dapat dibuat dengan beberapa cara, bergantung pada framework web Python yang digunakan.
Framework web
Objek BounceNotification diinisialisasi dengan nilai yang diambil dengan memanggil post_vars.get(key).
Saat menggunakan framework web Python, seperti Flask atau Django, konstruktor BounceNotification menggunakan kamus bernama post_vars, yang berisi permintaan POST dari data formulir. Untuk mengambil data, metode
get() harus ditentukan pada objek input. key adalah daftar nilai input
yang dapat dibaca dan diambil oleh BounceNotification, serta dapat berupa salah satu
dari berikut ini:
original-to, original-cc, original-bcc, original-subject, original-text, notification-from, notification-to, notification-cc, notification-bcc, notification-subject, notification-text, raw-message
Di sebagian besar framework web, data ini tersedia sebagai multi-kamus di objek permintaan. Sebagian besar jenis ini dapat dikonversi menjadi kamus yang dikunci oleh string.
Untuk semua kunci kecuali raw-message, nilainya dapat berupa apa pun. Biasanya, nilainya berupa
nilai tunggal seperti string, atau daftar nilai, seperti
{'to': ['bob@example.com', 'alice@example.com']}. Nilai default untuk semua kolom
adalah string kosong. Nilai ini akan mengisi properti original dan notification.
Untuk kunci raw-message, nilainya harus berupa input yang valid bagi konstruktor
EmailMessage.
Nilai dapat berupa nilai tunggal atau daftar bernilai tunggal. Kunci raw-message
digunakan untuk menginisialisasi properti original_raw_message objek.
Python 2 (webapp2)
class LogBounceHandler(BounceNotificationHandler):
def receive(self, bounce_message):
logging.info('Received bounce post ... [%s]', self.request)
logging.info('Bounce original: %s', bounce_message.original)
logging.info('Bounce notification: %s', bounce_message.notification)
Python 3 (Flask)
Di Flask,
request.form
dari jenis werkzeug.datastructures.MultiDict
memberikan variabel POST. Namun, metode get() untuk jenis ini hanya menampilkan nilai, meskipun ada beberapa nilai untuk kunci yang ada.
Untuk mendapatkan semua nilai yang terkait dengan sebuah kunci,
aplikasi harus memanggil
dict(request.form.lists()),
yang menghasilkan kamus dengan setiap nilai berupa daftar.
Python 3 (Django)
Di Django, request.POST
dari jenis django.http.QueryDict
memberikan variabel POST. Namun, metode get() untuk jenis ini hanya menampilkan nilai, meskipun ada beberapa nilai untuk kunci yang ada.
Untuk mendapatkan semua nilai yang terkait dengan sebuah kunci,
aplikasi harus memanggil dict(request.POST.lists()),
yang menghasilkan kamus dengan setiap nilai berupa daftar.
Aplikasi WSGI tanpa framework web
Jika aplikasi Anda adalah aplikasi WSGI yang tidak menggunakan framework web, ada kemungkinan variabel bentuk permintaan HTTP POST tidak tersedia secara langsung dalam kamus.
Dalam Python, metode factory bernama from_environ ditentukan untuk BounceNotification. Metode ini adalah metode class yang menggunakan kamus environ WSGI sebagai input, dan dapat digunakan untuk aplikasi WSGI apa pun.
Pada contoh berikut, perhatikan bagaimana environ diambil sebagai input untuk mendapatkan
bounce_message:
Python 3
Contoh kode
Untuk melihat contoh kode lengkap dari panduan ini, lihat GitHub.