Tutorial skema
Tutorial skemaPelajaran 14: Mengirim email dengan mudah

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 messageAs yang digunakan
  • Input from bersifat opsional; jika tidak disediakan, pengaturan yang tersimpan di WordPress akan digunakan
  • _sendEmail menjalankan fungsi wp_mail WordPress, 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
        }
      }
    }
  }
}