Leçon 14 : Envoyer des emails avec plaisir
Cette leçon du tutoriel démontre plusieurs capacités de Gato GraphQL pour envoyer des emails.
Envoi d'emails
Nous envoyons des emails via la mutation _sendEmail fournie par l'extension Email Sender.
- L'email est envoyé avec le type de contenu « text » ou « HTML » selon la propriété de l'entrée
messageAsutilisée - L'entrée
fromest optionnelle ; si elle n'est pas fournie, les paramètres stockés dans WordPress sont utilisés _sendEmailexécute la fonction WordPresswp_mail, elle utilisera donc la configuration définie pour l'envoi d'emails dans WordPress (comme le fournisseur SMTP à utiliser)
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
}
}
}
}Composition de l'email en Markdown
Le champ _strConvertMarkdownToHTML de l'extension Collection de Fonctions Utilitaires convertit le Markdown en HTML.
Nous pouvons utiliser ce champ pour composer l'email en 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
}
}
}
}Injection de données dynamiques dans l'email
En utilisant les champs de fonction fournis par l'extension PHP Functions via Schema, nous pouvons créer un modèle de message contenant des espaces réservés, et les remplacer par des données dynamiques :
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
}
}Envoi d'un email de notification à l'administrateur
Nous pouvons récupérer l'email de l'utilisateur administrateur depuis la table wp_options de WordPress, et injecter cette valeur dans le champ 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
}
}Alternativement, si les Mutations imbriquées sont activées dans la Schema Configuration, nous pouvons récupérer l'email de l'administrateur directement dans l'opération mutation (et l'injecter dans la mutation via 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
}
}Envoi d'un email personnalisé aux utilisateurs
Pour que cette requête GraphQL fonctionne, la Configuration du schéma appliquée à l'endpoint doit avoir les Mutations imbriquées activées
Comme _sendEmail est un champ global (ou, plus précisément, une mutation globale), il peut être exécuté sur n'importe quel type du schéma GraphQL, y compris User.
Cette requête récupère une liste d'utilisateurs, obtient leurs données (nom, email et nombre de crédits restants, qui sont stockés comme méta), et envoie un email personnalisé à chacun d'eux :
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
}
}
}
}
}