Cara Mengirim Email Dengan PHP Menggunakan Twilio SendGrid dan Mezzio
Diterbitkan: 2021-03-24Email sama pentingnya dengan alat komunikasi seperti biasanya. Untuk membantu Anda memanfaatkan email dengan lebih baik, saya akan menunjukkan cara mengirim email menggunakan framework Mezzio PHP dan API Twilio SendGrid.
Secara khusus, Anda akan mempelajari cara mengirim email dengan teks biasa dan badan HTML, dan itu termasuk lampiran PDF. Anda juga akan mempelajari cara menggunakan fungsionalitas templat transaksional Twilio SendGrid untuk membuat badan email menjadi lebih sederhana baik oleh tim pengembangan maupun tim lain dalam organisasi Anda.
Kedengarannya bagus? Mari kita mulai.
Ikhtisar aplikasi cepat
Sebagai cara untuk membuat tutorial ini lebih bermakna, anggaplah bahwa kode yang akan kita tulis adalah bagian dari toko e-niaga online fiktif yang dibangun dengan Mezzio, bernama The Little PHP Shop —khususnya, bagian segera setelah pelanggan melakukan pembelian. Pada saat itu dalam alur pengguna, pelanggan menerima email, berterima kasih kepada mereka atas pembelian mereka, dan menyertakan faktur PDF untuk catatan mereka.
Kami akan membuat kelas Handler untuk mengirim email pasca pembelian, yang akan menerima detail pembelian dari pesanan yang diselesaikan oleh pelanggan. Dengan informasi pembelian tersebut, kelas Handler kemudian akan menggunakan beberapa kelas di SendGrid PHP API untuk membangun dan mengirim email konfirmasi pembelian.
Dari jumlah tersebut, yang paling penting adalah "SendGrid\Mail\Mail" dan "\SendGrid." “SendGrid\Mail\Mail” adalah objek yang menyimpan semua properti untuk pesan email yang akan kami kirim melalui Twilio SendGrid. Objek "SendGrid" membentuk lapisan transport, memfasilitasi pengiriman email melalui Twilio SendGrid.
Prasyarat
Untuk menyelesaikan tutorial ini, Anda memerlukan 4 hal berikut di lingkungan pengembangan lokal Anda:
- akun Twilio SendGrid
- PHP 7.4 dengan ekstensi SSL cURL , mbstring , dan O pen diinstal dan diaktifkan
- Komposer terpasang secara global
- keriting
Perancah aplikasi Mezzio
Pertama kita perlu membuat aplikasi dasar. Untuk melakukan itu, kita akan, seperti biasa, menggunakan Kerangka Mezzio untuk melakukannya untuk kita. Setelah kami membuat perancah aplikasi dasar, kami akan beralih ke direktori proyek yang baru dibuat. Kemudian jalankan perintah berikut di terminal Anda, ikuti petunjuk untuk yang pertama:
Instal dependensi yang diperlukan
Dengan perancah proyek, kita perlu menambahkan 3 dependensi tambahan untuk menyelesaikan proyek. Ini adalah:
- Pustaka PHP API Twilio SendGrid untuk berinteraksi dengan API Twilio SendGrid
- Klien HTTP PHP untuk mengirim permintaan HTTP
- PHP Dotenv untuk menyimpan dan mengambil variabel lingkungan
Untuk menginstalnya, jalankan perintah berikut di terminal Anda:
Inisialisasi PHP Dotenv
Dengan dependensi terinstal, kami memuat PHP Dotenv sehingga akan membaca variabel yang diatur dalam ".env" dan membuatnya tersedia untuk PHP sebagai variabel lingkungan. Untuk melakukannya, masukkan kode berikut di “public/index.php,” tepat setelah “require vendor/autoload.php.”
Tambahkan detail akun Twilio SendGrid Anda
Sekarang Anda perlu menyediakan aplikasi dengan kunci API SendGrid Anda. Untuk melakukannya, setelah masuk ke Twilio SendGrid , navigasikan ke “Settings -> API Keys . " Sesampainya disana:
- Klik " Buat Kunci API " untuk membuat kunci API
- Beri nama kunci API baru, terima izin kunci API default " Akses Penuh " , dan klik " Buat dan Lihat "
Dengan kunci API yang dibuat, klik dan salin kuncinya, lalu klik “ Selesai . ”
Setelah itu, tambahkan 2 kunci lagi ke file: “SENDGRID_DEFAULT_SENDER_ADDRESS” dan “SENDGRID_DEFAULT_SENDER_NAME.” Seperti yang ditunjukkan oleh namanya, ini adalah alamat email dan nama yang akan kami gunakan untuk email apa pun yang dikirim dari aplikasi kami kecuali diganti.
Catatan: Untuk melakukan ini, di Otentikasi Pengirim , pastikan tertulis "Terverifikasi" di tabel "Verifikasi Pengirim Tunggal".
Setel detail konfigurasi email aplikasi
Selain kunci API Twilio SendGrid, kami akan menyimpan beberapa pengaturan konfigurasi email global lainnya. Secara khusus, kami akan menetapkan dari dan membalas ke alamat email dan nama yang akan kami gunakan di setiap pesan email. Dengan begitu, kita tidak perlu mengaturnya setiap saat.
Kami juga akan membuat 2 templat isi email: satu untuk email teks biasa dan satu untuk email HTML. Untuk melakukannya, di “config/autoload” buat file baru bernama “mail.global.php,” dan di dalamnya, tambahkan kode berikut.
Buat kelas untuk membuat instance objek email
Dengan set detail konfigurasi aplikasi utama, sekarang mari buat kelas yang akan membuat instance objek email dasar dengan set properti default. Untuk melakukannya, di direktori baru, "src/App/src/Mailer," buat file baru bernama "SendGridMailMessageFactory.php," dan di dalamnya, tambahkan kode di bawah ini.
Saat kita memanggil kelas, kelas tersebut memiliki akses ke wadah injeksi ketergantungan (DI) aplikasi, dari mana ia akan mengambil detail konfigurasi yang kita simpan di “config/autoload/mail.global.php.”
Setelah itu, itu akan membuat instance objek "SendGrid\Mail\Mail" baru dan mengatur dari dan membalas detail dengan meneruskan detail konfigurasi masing-masing ke panggilan ke metode "Mail," "setFrom," dan "setReplyTo", masing-masing. Setelah itu, itu akan mengembalikan objek "Mail" yang dipakai.
Untuk menggunakannya, Anda harus mendaftarkannya dengan wadah DI. Untuk melakukannya, di “src/App/src/ConfigProvider,” tambahkan entri berikut ke elemen “factories” dalam larik yang dikembalikan dari metode “getDependencies”.
Buat Handler untuk mengirim email
Selanjutnya kita perlu membuat kelas Handler untuk menulis dan mengirim email. Untuk melakukannya, kita akan menggunakan alat CLI Mezzio , tersedia melalui Composer, dengan menjalankan perintah di bawah ini.
Menjalankan perintah di atas melakukan empat hal untuk kita:
- C membuat kelas Handler baru, "src/App/Handler/EmailSenderHandler.php"
- Membuat kelas pabrik untuk membuat instance kelas Handler, "src/App/Handler/EmailSenderHandlerFactory.php"
- Membuat file template (“src/App/templates/app/email-sender.html.<ext>”), yang tidak akan kita perlukan . Nama file “<ext>” ditentukan oleh mesin template yang Anda pilih selama tahap “buat-proyek”.
- Daftarkan kelas Handler baru sebagai layanan dalam wadah DI dengan menambahkan entri ke “config/autoload/mezzio-tooling-factories.global.php”
Refactor Handler untuk mengirim email
Dengan "EmailSenderHandler.php" dibuat, sekarang kita perlu memfaktorkannya kembali sehingga dapat mengirim email. Untuk melakukannya, pertama-tama kita akan memfaktorkan ulang konstruktor "EmailSenderHandler", mengganti parameter "TemplateRendererInterface" dengan 3 parameter baru. Ini akan menginisialisasi 3 variabel anggota kelas baru:
- Objek “\SendGrid\Mail\Mail”
- Objek “\SendGrid”
- Array yang berisi detail konfigurasi yang diperlukan
Anda dapat melihat konstruktor yang direvisi dalam contoh di bawah ini, bersama dengan variabel anggota kelas terkait. Ganti variabel anggota kelas yang ada dan konstruktor dengan kode ini.
Catatan: Selanjutnya, kita perlu melakukan refactor pada metode "handle". Ganti konten metode "pegangan" "EmailSenderHandler" yang ada dengan kode di bawah ini, lalu mari kita lihat fungsinya.
Ini dimulai dengan menggunakan "$request->getParsedBody()" untuk mengambil parameter apa pun yang disediakan di badan permintaan, yang akan mengembalikan array asosiatif, menginisialisasi "$details." Dengan parameter yang tersedia, ia memanggil metode "addTo" objek "SendGrid\Mail\Mail" untuk mengatur penerima email, meneruskan alamat email penerima dan nama di 2 argumen pertama dan larik substitusi di argumen ketiga.
Substitusi memungkinkan Anda untuk menyesuaikan pesan email untuk setiap penerima. Dalam email teks biasa, string apa pun yang langsung dikelilingi oleh tanda hubung, misalnya, “-first_name-” adalah substitusi. Dalam email HTML, ia menggunakan sintaks Handlebars , yang mengelilingi string dengan tanda kurung ganda, misalnya, “{{ first_name }}.”
Selanjutnya, kita mengatur subjek pesan dan menambahkan plaintext dan isi pesan HTML. Dengan itu, email kami siap dikirim. Jadi kami menggunakan objek "SendGrid", "$this->mailer," untuk mengirimnya, menginisialisasi variabel baru, "$response," dengan respons dari upaya mengirim pesan. Terakhir, kami mengembalikan objek JsonResponse , yang berisi kode status dan isi dari respons.
Catatan: Memfaktorkan ulang metode __invoke EmailSenderHandlerFactory
Sekarang setelah kita menyelesaikan pemfaktoran ulang "EmailSenderHandler", kita perlu memfaktorkan ulang "EmailSenderHandlerFactory." Ini akan membuat instantiate "EmailSenderHandler" dengan benar. Untuk melakukannya, ganti definisi metode “__invoke`” yang ada dengan kode berikut.

Ini mengambil objek "\SendGrid\Mail\Mail" dari wadah DI, diprainisialisasi dengan pengirim dan membalas detail email, dan menginisialisasi objek baru bernama "$message." Ini kemudian membuat instance objek "SendGrid" baru, bernama "$mailer" untuk mengirim pesan email. Terakhir, ia mengambil konfigurasi email dari konfigurasi aplikasi. Kemudian, ia menggunakan ini untuk menginisialisasi dan mengembalikan objek "EmailSenderHandler".
Perbarui tabel perutean
Dengan semua perubahan itu, ada satu perubahan terakhir yang harus dilakukan sebelum kita dapat menguji kode dan mengirim email. Kami harus memperbarui tabel perutean sehingga rute default menggunakan kelas Handler baru kami sebagai pengendali rute, alih-alih "HomePageHandler." Untuk melakukannya, ganti definisi default route di “config/routes.php” dengan contoh berikut.
Kirim email pertama
Sekarang saatnya mengirim email pertama. Untuk melakukannya, pertama, jalankan aplikasi dengan menjalankan perintah di bawah ini di terminal.
Kemudian, dengan menggunakan cURL, buat permintaan GET ke “ http://localhost:8080 ,” seperti pada contoh di bawah ini, ganti nilai dalam kurung sudut dengan detail yang relevan untuk email Anda.
Anda akan melihat output “{“status”:202,“message”:””}” ke terminal, dan Anda akan menerima email yang terlihat seperti gambar di bawah ini.
Catatan: Gunakan templat email transaksional alih-alih string templat
Meskipun kami dapat mengirim email dengan teks biasa dan isi HTML, cara kami melakukannya, bagaimanapun, kurang ideal. Untuk setiap email yang kami kirim—dan aplikasi kami mungkin akan mengirim cukup banyak—kami perlu menambahkan teks biasa dan badan HTML untuk email tersebut.
Tetapi menyimpan definisi badan email dalam kode menempatkan sebagian besar upaya pada tim pengembangan. Namun, setidaknya menurut pengalaman saya, sering kali tim lain, sering kali memasarkan, membuat dan memelihara template email.
Jadi untuk alasan itu, dan karena ini akan mempercepat pengembangan dan membagi beban ke beberapa tim, kami akan memfaktorkan ulang aplikasi untuk menggunakan template email transaksional . Anda dapat membuat dan memelihara ini melalui Twilio SendGrid UI oleh anggota tim yang mungkin memiliki sedikit atau tanpa pengalaman teknis, alih-alih dalam kode.
Jika Anda belum pernah mendengarnya, glosarium Twilio SendGrid mendefinisikannya sebagai berikut:
Template email transaksional adalah tata letak email yang telah dikodekan sebelumnya yang dapat digunakan pemasar, desainer, dan pengembang untuk membuat kampanye email transaksional dengan cepat dan mudah. Template email transaksional Twilio SendGrid memungkinkan orang nonteknis dan teknis untuk membuat perubahan waktu nyata pada email yang diterima penerima mereka.
Untuk artikel ini, kita hanya membutuhkan yang cukup mendasar. Untuk melakukannya, ikuti detail dalam dokumentasi Twilio SendGrid dan buat yang memiliki konten hanya dalam modul teks tunggal. Kemudian, untuk teks isi, gunakan teks di bawah ini.
Perhatikan bahwa ada 6 substitusi dalam email:
- “first_name”: Nama depan pelanggan
- “last_name”: Nama belakang pelanggan
- “sender_name”: Nama toko e-commerce (The Little PHP Shop)
- "sender_state": Status toko e-niaga
- "sender_country": Negara toko e-niaga
- “support_email”: Email dukungan yang dapat digunakan pelanggan untuk mendapatkan dukungan purna jual
Mengingat itu, kita perlu membuat informasi itu tersedia untuk aplikasi kita. Nama depan dan belakang pelanggan yang sudah kita miliki. 4 substitusi yang tersisa akan menjadi global, jadi seperti yang kita lakukan sebelumnya, kita akan menambahkan konfigurasi di bawah ini ke “ config/autoload/mail.global.php ,” setelah elemen “templates”.
Dengan file konfigurasi baru yang dibuat, dalam metode “handle” “EmailSenderHandler”, ganti 2 panggilan ke “$this->mail->addContent(),” dengan kode berikut.
Panggilan metode 2 menambahkan detail pengirim dan mendukung alamat email sebagai substitusi global. Penggantian ini berlaku untuk badan email sebelum penggantian lainnya tetapi diganti jika ada penggantian dengan kunci yang sama untuk penerima email.
Selanjutnya, Anda perlu mengambil ID template email transaksional. Anda dapat menemukannya dengan mengeklik nama template di daftar template , seperti yang dapat Anda lihat pada tangkapan layar di bawah.
Salin dan simpan di “config/autoload/mail.global.php” di elemen baru dengan kunci “template_id” lalu hapus “plain” dan “HTML.” Setelah selesai, elemen “mail/template” dari larik yang dikembalikan akan terlihat seperti kode di bawah ini, di mana “<the template's id>” menggantikan ID template Anda.
Dengan konfigurasi yang diperbarui, sekarang kita perlu menambahkan panggilan ke metode "Mail" "setTemplateId" di metode "handle" "EmailSenderHandler", meneruskan ID template yang baru saja kita tambahkan ke "config/autoload/mail.global. php.” Anda dapat melihat contohnya pada kode di bawah ini.
Mari kita uji perubahannya
Seperti sebelumnya, menggunakan cURL, buat permintaan GET ke “ http://localhost:8080 ” untuk menguji apakah perubahan berfungsi seperti yang diharapkan. Anda akan melihat keluaran “{“status”:202,“message”:””}” ke terminal, seperti pada contoh sebelumnya. Di kotak masuk email Anda, Anda akan melihat email yang indah, dengan penggantian diganti, seperti pada gambar di bawah.
Lampirkan faktur PDF
Sekarang kita menggunakan template dinamis, mari lampirkan faktur PDF yang kita bicarakan di bagian atas artikel. Untuk menghemat waktu dan tenaga Anda dalam mencari atau membuatnya sendiri, saya telah membuat contoh faktur PDF yang dapat Anda gunakan untuk artikel ini. Simpan di direktori “data” aplikasi .
Catatan: Untuk melampirkan invoice, kita perlu menggunakan metode “Mail” “addAttachment”, yang dapat Anda lihat pada contoh kode berikutnya. Metode ini membutuhkan 5 argumen, tetapi kami hanya menyediakan 4 argumen pertama, yaitu:
- Objek "Lampiran" atau string yang disandikan Base64 . Jika nilai parameter ini tidak dikodekan base64, metode akan melakukannya untuk kita.
- Jenis mime lampiran (sekarang dikenal sebagai jenis media ).
- Nama file lampiran . Ini adalah nama tempat file akan disimpan, secara default, kecuali jika pengguna mengubahnya.
- Disposisi konten lampiran . Jika Anda tidak terbiasa dengan disposisi konten, disposisi konten sebaris berarti bahwa lampiran akan ditampilkan secara otomatis saat pesan ditampilkan, dan disposisi konten lampiran berarti bahwa lampiran tidak ditampilkan secara otomatis dan memerlukan beberapa bentuk tindakan dari pengguna untuk Buka.
Pada contoh kode di bawah ini, metode file_get_contents PHP membaca konten file menjadi variabel baru bernama “$invoice.” Kemudian, PDF dilampirkan ke pesan dengan memanggil metode “addAttachment”.
Disini kita:
- Masukkan isi faktur, yang akan dikodekan Base64
- Setel jenis MIME ke “application/pdf” saat kami melampirkan file PDF
- Tetapkan nama file faktur ke nama fiktif yang mungkin diharapkan oleh pelanggan
- Atur disposisi konten ke "lampiran"
Sekarang setelah kita menyelesaikan perubahan itu, mari kita uji apakah mereka berfungsi. Jalankan permintaan cURL yang sama dengan yang kami jalankan 2 kali sebelumnya. Kemudian, di kotak masuk email Anda, Anda akan melihat email yang indah dengan contoh faktur PDF yang terlihat saat melihat email.
Begitulah cara mengirim email dengan PHP menggunakan Twilio SendGrid dan Mezzio
Meskipun kami hanya menggores permukaan dari apa yang mungkin saat mengirim email dengan Twilio SendGrid dan Mezzio, Anda sekarang dapat mengirim email dengan teks biasa dan isi HTML, serta dengan lampiran. Anda juga telah mempelajari cara menggunakan templat dan substitusi transaksional yang dapat Anda atur secara global dan per penerima.
Saya sangat menganjurkan Anda untuk melihat dokumentasi perpustakaan PHP untuk melihat apa lagi yang tersedia, seperti menjadwalkan pengiriman email, melampirkan file dari Amazon S3, menambahkan header, dan menambahkan bagian dan kategori.
Matthew Setter adalah Editor PHP di tim Twilio Voices dan—tentu saja—pengembang PHP. Dia juga penulis Mezzio Essentials . Saat dia tidak sedang menulis kode PHP, dia sedang mengedit artikel PHP yang bagus di Twilio. Dia dapat dihubungi melalui:
- Email: matthew@matthewsetter.com
- Web: http://matthewsetter.com
- Twitter: @settermjd
- GitHub: https://github.com/settermjd