Pelajaran 14: Mengirim email dengan mudah
Pelajaran tutorial ini mendemonstrasikan berbagai kemampuan Gato GraphQL untuk mengirim email.
Mengirim email
Kita mengirim email melalui mutation _sendEmail yang disediakan oleh ekstensi Email Sender.
- Email dikirim dengan tipe konten "text" atau "HTML" tergantung properti mana dari input
messageAsyang digunakan - Input
frombersifat opsional; jika tidak disediakan, pengaturan yang tersimpan di WordPress akan digunakan _sendEmailmenjalankan fungsiwp_mailWordPress, sehingga akan menggunakan konfigurasi yang ditentukan untuk mengirim email di WordPress (seperti penyedia SMTP yang digunakan)
mutation {
sendTextEmail: _sendEmail(
input: {
from: {
email: "from@email.com"
name: "Me myself"
}
replyTo: "replyTo@email.com"
to: "target@email.com"
cc: ["cc1@email.com", "cc2@email.com"]
bcc: ["bcc1@email.com", "bcc2@email.com", "bcc3@email.com"]
subject: "Email with text content"
messageAs: {
text: "Hello world!"
}
}
) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
}
sendHTMLEmail: _sendEmail(
input: {
to: "target@email.com"
subject: "Email with HTML content"
messageAs: {
html: "<p>Hello world!</p>"
}
}
) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
}
}Menyusun email menggunakan Markdown
Field _strConvertMarkdownToHTML dari ekstensi Helper Function Collection mengonversi Markdown ke HTML.
Kita dapat menggunakan field ini untuk menyusun email menggunakan Markdown:
query GetEmailData {
emailMessage: _strConvertMarkdownToHTML(
text: """
We have great news: **Version 1.0 of our plugin will be released soon!**
If you'd like to help us beta test it, please complete [this form](https://forms.gle/FpXNromWAsZYC1zB8).
_Please reply by 30th June 🙏_
Thanks!
"""
)
@export(as: "emailMessage")
}
mutation SendEmail @depends(on: "GetEmailData") {
_sendEmail(
input: {
to: "target@email.com"
subject: "Great news!"
messageAs: {
html: $emailMessage
}
}
) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
}
}Menyisipkan data dinamis ke dalam email
Menggunakan function field yang disediakan oleh ekstensi PHP Functions via Schema, kita dapat membuat template pesan yang berisi placeholder, dan menggantinya dengan data dinamis:
query GetPostData($postID: ID!) {
post(by: {id: $postID}) {
title @export(as: "postTitle")
excerpt @export(as: "postExcerpt")
url @export(as: "postLink")
author {
name @export(as: "postAuthorName")
url @export(as: "postAuthorLink")
}
}
}
query GetEmailData @depends(on: "GetPostData") {
emailMessageTemplate: _strConvertMarkdownToHTML(
text: """
There is a new post by [{$postAuthorName}]({$postAuthorLink}):
**{$postTitle}**: {$postExcerpt}
[Read online]({$postLink})
"""
)
emailMessage: _strReplaceMultiple(
search: ["{$postAuthorName}", "{$postAuthorLink}", "{$postTitle}", "{$postExcerpt}", "{$postLink}"],
replaceWith: [$postAuthorName, $postAuthorLink, $postTitle, $postExcerpt, $postLink],
in: $__emailMessageTemplate
)
@export(as: "emailMessage")
subject: _sprintf(string: "New post created by %s", values: [$postAuthorName])
@export(as: "emailSubject")
}
mutation SendEmail @depends(on: "GetEmailData") {
_sendEmail(
input: {
to: "target@email.com"
subject: $emailSubject
messageAs: {
html: $emailMessage
}
}
) {
status
}
}Mengirim email notifikasi kepada admin
Kita dapat mengambil email pengguna admin dari tabel wp_options WordPress, dan menyisipkan nilai ini ke dalam field to:
query ExportData {
adminEmail: optionValue(name: "admin_email")
@export(as: "adminEmail")
}
mutation SendEmail @depends(on: "ExportData") {
_sendEmail(
input: {
to: $adminEmail
subject: "Admin notification"
messageAs: {
html: "There is a new post on the site, go check!"
}
}
) {
status
}
}Sebagai alternatif, jika Nested Mutations diaktifkan dalam Schema Configuration, kita dapat mengambil email admin langsung di operasi mutation (dan menyisipkannya ke dalam mutation melalui Field to Input):
mutation SendEmail {
adminEmail: optionValue(name: "admin_email")
_sendEmail(
input: {
to: $__adminEmail
subject: "Admin notification"
messageAs: {
html: "There is a new post on the site, go check!"
}
}
) {
status
}
}Mengirim email yang dipersonalisasi kepada pengguna
Agar query GraphQL ini berfungsi, Schema Configuration yang diterapkan pada endpoint perlu mengaktifkan Nested Mutations
Karena _sendEmail adalah field global (atau, lebih tepatnya, mutation global), ia dapat dijalankan pada tipe apa pun dari skema GraphQL, termasuk User.
Query ini mengambil daftar pengguna, mendapatkan data mereka (nama, email, dan jumlah kredit yang tersisa, yang disimpan sebagai meta), dan mengirimkan email yang dipersonalisasi kepada masing-masing pengguna:
mutation {
users {
email
displayName
credits: metaValue(key: "credits")
# If the user does not have meta entry "credits", use `0` credits
hasNoCreditsEntry: _isNull(value: $__credits)
remainingCredits: _if(condition: $__hasNoCreditsEntry, then: 0, else: $__credits)
emailMessageTemplate: _strConvertMarkdownToHTML(
text: """
Hello %s,
Your have **%s remaining credits** in your account.
Would you like to [buy more](%s)?
"""
)
emailMessage: _sprintf(
string: $__emailMessageTemplate,
values: [
$__displayName,
$__remainingCredits,
"https://mysite.com/buy-credits"
]
)
_sendEmail(
input: {
to: $__email
subject: "Remaining credits alert"
messageAs: {
html: $__emailMessage
}
}
) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
}
}
}