Cara Menerima Email dengan Kerangka Flask untuk Python
Diterbitkan: 2020-04-30Meskipun ada banyak tutorial di Internet tentang mengirim email, hanya ada sedikit cara mengkonfigurasi aplikasi untuk menerima dan memprosesnya. Ini adalah tugas yang bisa sangat sulit jika Anda mencoba mengatur semuanya sendiri, tetapi semudah menerima permintaan web saat menggunakan fitur Inbound Parse Twilio SendGrid .
Dalam tutorial singkat ini Anda akan belajar bagaimana Twilio SendGrid meneruskan email Anda langsung ke aplikasi web Anda, menggunakan Python dan kerangka web Flask.
Persyaratan
Ini adalah persyaratan untuk menyelesaikan tutorial ini:
- Python 3: Jika sistem operasi Anda tidak menyediakan juru bahasa Python 3, Anda dapat membuka python.org untuk mengunduh penginstal.
- Akun Twilio SendGrid: Jika Anda baru menggunakan Twilio SendGrid, Anda dapat membuat akun gratis , yang memungkinkan Anda mengirim 100 email per hari selamanya.
- Domain tempat Anda akan menerima email: Sepanjang artikel ini, saya akan menggunakan domainandadi sini.com . Anda harus menggantinya dengan nama domain Anda sendiri.
- ngrok : Kami akan menggunakan utilitas praktis ini untuk menghubungkan aplikasi Flask yang berjalan secara lokal di komputer Anda ke URL publik tempat SendGrid dapat mengirim permintaan. Ini diperlukan untuk versi pengembangan aplikasi karena komputer Anda kemungkinan berada di belakang router atau firewall, sehingga tidak dapat dijangkau secara langsung di Internet. Jika Anda belum menginstal ngrok, Anda dapat mengunduh salinannya untuk Windows, MacOS, atau Linux .
Otentikasi domain
Sebelum Twilio SendGrid dapat menerima email di domain Anda, Anda harus mengautentikasinya , sehingga Twilio SendGrid mengetahui bahwa domain berada di bawah kendali Anda.
Memulai otentikasi domain
Untuk mengautentikasi domain Anda, masuk ke akun SendGrid Anda, dan di bilah navigasi sisi kiri buka “Pengaturan” untuk kemudian pilih Otentikasi Pengirim .
Di halaman Otentikasi Pengirim , klik tombol "Memulai" di bagian "Otentikasi Domain".
Anda akan diminta untuk memilih penyedia DNS Anda, yang biasanya merupakan perusahaan yang sama dengan tempat Anda membeli domain. Jika penyedia DNS Anda tidak muncul dalam daftar, atau jika Anda tidak tahu siapa mereka, cukup pilih "Saya Tidak Yakin".
Anda kemudian akan ditanya tentang menambahkan branding ke tautan yang muncul di email keluar. Ini bukan topik yang sedang kita bahas saat ini, jadi pilih "Tidak". Anda dapat mengaktifkan opsi ini di lain waktu jika Anda ingin menggunakannya.
Klik tombol “Next” untuk melanjutkan ke halaman berikutnya.
Pada halaman berikut Anda akan diminta untuk memberikan nama domain Anda. Saya memasukkan yourdomainhere.com , dan Anda harus memasukkan domain yang ingin Anda gunakan. Anda tidak perlu mengubah apa pun di bagian "Pengaturan Lanjutan".
Klik tombol “Berikutnya” untuk melanjutkan.
Halaman sekarang akan menampilkan 3 catatan DNS baru yang perlu Anda tambahkan ke konfigurasi domain Anda, masing-masing dengan jenis, nama host, dan nilai. Untuk kenyamanan Anda, host dan nilai semua dapat disalin ke clipboard. Di bawah ini Anda dapat melihat pengaturan yang saya berikan. Milik Anda akan serupa, tetapi dengan nama domain Anda sendiri di dalamnya:
Menambahkan entri DNS ke domain Anda
Langkah selanjutnya akan berbeda tergantung pada penyedia DNS Anda. Kunjungi halaman konfigurasi domain Anda dan temukan di mana pengaturan DNS diedit.
Tangkapan layar di bawah ini untuk Google Domains . Anda dapat melihat bagaimana saya menambahkan yang pertama dari tiga catatan DNS pada gambar berikut. Perhatikan bahwa 3 catatan dengan nama @, ftp , dan catatan www tidak terkait dengan tutorial ini dan sudah disetel di domain saya.
Hati-hati tentang cara Anda memasukkan nama data DNS. Sementara beberapa penyedia mengharapkan nama yang sepenuhnya memenuhi syarat untuk catatan DNS Anda, seperti yang ditunjukkan oleh SendGrid, yang lain mengharapkan hanya bagian sebelum nama domain. Misalnya, data yang ditunjukkan SendGrid sebagai em3329.domainandadi sini.com harus dimasukkan sebagai em3329 di Google Domains. Periksa catatan DNS Anda yang lain dan konsistenlah dengan cara Anda memasukkan yang baru ini.
Berikut adalah bagaimana 3 catatan DNS baru terlihat setelah saya memasukkannya:
Verifikasi domain
Sekarang kembali ke halaman Otentikasi Pengirim SendGrid , di mana domain Anda akan muncul sebagai tertunda. Klik untuk melanjutkan proses otentikasi.
Di layar berikutnya, Anda akan melihat 3 catatan DNS. Klik tombol "Verifikasi" di kanan atas halaman agar SendGrid menarik catatan DNS Anda dan mengonfirmasi bahwa Anda telah menambahkan entri yang diminta.
Jika SendGrid dapat memverifikasi domain Anda, Anda akan mendapatkan pesan "Berhasil!" halaman:
Sebaliknya, jika SendGrid tidak dapat memverifikasi entri DNS Anda, Anda perlu mencoba lagi nanti. Setiap kali perubahan DNS dilakukan, dibutuhkan beberapa waktu agar perubahan menyebar ke seluruh server DNS. Kegagalan tepat setelah mengedit entri DNS Anda hanya berarti Anda perlu memberikan sedikit lebih banyak waktu sebelum Anda menekan tombol "Verifikasi" lagi. Perhatikan bahwa dibutuhkan waktu hingga 48 jam agar DNS menyebar sepenuhnya, meskipun biasanya membutuhkan waktu yang jauh lebih sedikit.
Setelah Anda mendapatkan pesan "Berhasil!" halaman Anda sedang dalam perjalanan untuk mendapatkan email yang diposting ke aplikasi web Flask Anda.
Aplikasi email Flask
Sekarang kita siap untuk membuat aplikasi web Flask sederhana dimana SendGrid dapat meneruskan email kita.
Buat Lingkungan Virtual Python
Mengikuti praktik terbaik Python, kita akan membuat direktori terpisah untuk proyek kita, dan di dalamnya kita akan membuat lingkungan virtual . Kami kemudian akan menginstal kerangka Flask di atasnya.
Jika Anda menggunakan sistem Unix atau Mac OS, buka terminal dan masukkan perintah berikut untuk melakukan tugas yang dijelaskan di atas:
Jika Anda mengikuti tutorial di Windows, masukkan perintah berikut di jendela prompt perintah:
Rute email masuk
Sekarang mari kita menulis aplikasi Flask yang akan menerima email masuk. Kode untuk aplikasi lengkap ditunjukkan di bawah ini. Masukkan kode ini ke dalam file bernama app.py .
Aplikasi hanya memiliki satu rute web yang terhubung ke URL / email . Kami akan meminta SendGrid memanggil rute ini untuk meneruskan email masuk kepada kami. Permintaan yang mereka kirim akan memiliki semua detail yang terkait dengan email yang dikirim sebagai pos formulir HTTP standar. Ini berarti bahwa dari Flask kita dapat dengan mudah mengakses semua detail ini dari kamus `request.form`.
Variabel bentuk berikut sangat menarik:
- `request.form['from']`: pengirim email
- `request.form['to']`: penerima email
- `request.form['subject']`: subjek email
- `request.form['text']` badan email dalam format teks biasa
- `request.form['html']` badan email dalam format HTML
Perhatikan bahwa ini bukan satu-satunya bidang yang dikirimkan oleh SendGrid. Tinjau daftar lengkap parameter email di dokumentasi SendGrid.
Karena pemrosesan email sangat bergantung pada masing-masing aplikasi, misalnya aplikasi Flask, yang kita lakukan hanyalah mencetak kolom email ke konsol.
Setelah Anda menyimpan app.py Anda dapat memulai aplikasi Flask sebagai berikut:
Aplikasi sekarang berjalan dan mendengarkan permintaan yang masuk, tetapi hanya dapat dijangkau dari komputer Anda sendiri. Biarkan aplikasi berjalan di jendela terminal Anda untuk saat ini. Pada bagian selanjutnya kita akan memaparkannya ke Internet.
Webhook Parse Masuk SendGrid
Terakhir dari tutorial ini adalah mengkonfigurasi SendGrid untuk meneruskan email masuk di domain Anda ke aplikasi Flask.
Mulai ngrok
Alat ngrok membuat URL yang tersedia untuk umum dan memetakannya ke aplikasi yang berjalan secara lokal. Ini adalah teknik umum yang digunakan untuk mengekspos layanan di Internet untuk pengembangan dan pengujian. Setelah aplikasi Flask Anda selesai, Anda akan menyebarkannya untuk produksi di server yang tepat dan ini tidak akan diperlukan lagi.
Jika belum, instal ngrok di sistem Anda. Biarkan aplikasi Flask berjalan dan buka jendela terminal kedua untuk memulai ngrok sebagai berikut:
Ini memberitahu ngrok untuk membuat "tunnel" dari Internet publik ke port 5000 di mesin lokal kami, di mana aplikasi Flask sedang menunggu permintaan web. Output dari ngrok akan terlihat sebagai berikut:
Perhatikan baris yang diawali dengan “Forwarding” di layar ngrok. Ini menunjukkan URL publik yang dibuat secara acak yang digunakan ngrok untuk mengarahkan permintaan ke layanan kami. Kami akan menggunakan https:// URL karena menggunakan enkripsi.
Mendaftarkan URL webhook dengan SendGrid
Kembali ke dasbor SendGrid dan di bawah Pengaturan pilih Inbound Parse , lalu klik “Tambahkan Host & URL.”
Di halaman berikutnya masukkan subdomain tempat Anda akan menerima email. Ini bisa berupa subdomain apa pun yang belum digunakan di domain Anda, atau jika Anda lebih suka menerima email langsung di domain tingkat atas, itu bisa dibiarkan kosong. Pada gambar di bawah ini, saya menggunakan subdomain parse , yang berarti email yang diterima oleh SendGrid akan memiliki format < apa saja>@parse.domainandahere.com . Membiarkan bidang subdomain kosong akan memungkinkan SendGrid menerima email untuk <anything>@yourdomainhere.com , yang dalam beberapa kasus mungkin lebih disukai.
Selanjutnya Anda harus memilih nama domain Anda . Ini adalah daftar dropdown yang menunjukkan semua domain yang telah Anda verifikasi dengan SendGrid. Jika Anda melakukan ini untuk pertama kalinya, Anda hanya akan melihat domain yang telah Anda verifikasi sebelumnya.
Bidang berikut adalah untuk URL tujuan untuk webhook Anda. Ini adalah URL yang dihasilkan oleh ngrok yang ditambahkan dengan URL Flask /email . Dalam kasus saya ini adalah https://bbf1b72b.ngrok.io/email . Anda akan memiliki URL yang serupa, tetapi bagian pertama dari nama host ngrok akan berbeda.
Klik "Tambah" untuk mengonfigurasi webhook Anda.
Sekarang Anda akan melihat entri untuk webhook Anda di halaman utama Inbound Parse:
Catatan: URL ngrok berubah setiap kali ngrok dihentikan dan dimulai ulang, jadi selama pengembangan Anda perlu mengedit webhook untuk memperbarui URL setiap kali Anda memulai ulang ngrok. Saat Anda menggunakan webhook untuk penggunaan produksi, Anda akan menghostingnya langsung di URL publik, jadi ngrok tidak akan digunakan.
Mendaftarkan subdomain parse
Subdomain yang Anda pilih untuk menerima email di bagian sebelumnya harus ditentukan dalam konfigurasi DNS domain Anda dengan data `MX`. Nilai untuk catatan ini sama untuk semua pelanggan SendGrid: `mx.sendgrid.net.` (perhatikan titik akhir setelah “net”).
Dalam konfigurasi DNS Google Domains saya, saya mendefinisikan subdomain parse saya sebagai berikut:
Ingatlah bahwa tergantung pada penyedia domain apa yang Anda gunakan, Anda mungkin perlu memasukkan nama host lengkap untuk data DNS ini, jadi dalam hal ini adalah parse.domainandahere.com .
Jika Anda memutuskan untuk tidak mendefinisikan subdomain di bagian sebelumnya, maka nama host Anda akan menjadi yourdomainhere.com , yang untuk beberapa penyedia DNS harus diberikan sebagai “ @”.
Ingatlah bahwa perubahan DNS ini juga perlu disebarkan, jadi Anda mungkin tidak dapat segera menerima email.
Mengirim email percobaan
Saat aplikasi Flask dan ngrok Anda sedang berjalan, buka klien email Anda dan kirim email percobaan. Di bidang “Kepada:” Anda dapat memasukkan nama pengguna apa pun yang Anda inginkan, karena SendGrid menangkap semua nama pengguna. Apa yang terjadi setelah @ harus menjadi domain penerima email lengkap Anda.
Pada contoh di bawah ini saya mengirim email ke [email protected] :
Tunggu satu atau dua menit hingga SendGrid menerima email dan meneruskannya ke URL webhook ngrok, yang selanjutnya akan meneruskannya ke titik akhir /email Flask . Seperti yang Anda lihat di atas, titik akhir sederhana yang saya tulis di aplikasi Flask mencetak data email yang diterima ke konsol:
Jadi ini dia, kami sekarang menerima email sebagai permintaan web di aplikasi Flask kami!
penyebaran produksi
Di bagian ini, saya ingin menunjukkan beberapa perbedaan penting antara webhook yang digunakan selama pengembangan dan yang dimaksudkan untuk penggunaan produksi.
Deployment tanpa ngrok
Seperti disebutkan di atas, ngrok bukan alat produksi dan tidak boleh digunakan dalam penyebaran produksi. Sebagai gantinya Anda akan menyebarkan aplikasi Flask Anda di server yang terhubung langsung ke Internet. Ada beberapa opsi penerapan yang dibahas dalam dokumentasi Flask.
Keamanan webhook
Pertimbangkan bahwa titik akhir penerima email Anda tersedia untuk umum di Internet, sehingga siapa pun yang mengetahui URL tersebut dapat mengirim permintaan ke sana, berpotensi memaparkan aplikasi Anda ke permintaan palsu yang dikirim oleh pengguna jahat yang berpura-pura menjadi permintaan SendGrid.
Langkah yang baik untuk mencegah jenis serangan ini adalah dengan mengimplementasikan Basic Authentication pada endpoint Flask Anda. Ekstensi Flask-HTTPAuth dapat membantu dalam menerapkan jenis keamanan ini.
Jika Anda menambahkan autentikasi ke titik akhir, Anda harus menyertakan nama pengguna dan sandi di URL webhook yang diberikan ke SendGrid. Webhook yang saya gunakan di atas harus diberikan sebagai https://username:[email protected]/email.
Kesimpulan
Meskipun ada banyak langkah yang terlibat dalam menyiapkan semuanya untuk menerima email, ini adalah salah satu cara paling sederhana untuk mencapainya. Untuk informasi lebih lanjut tentang Inbound Parse, lihat halaman dokumen kami.
Kami tidak sabar untuk melihat apa yang Anda buat dengan Inbound Parse!