Lição 14: Enviando emails com prazer
Esta lição do tutorial demonstra diversas capacidades do Gato GraphQL para enviar emails.
Enviando emails
Enviamos emails via mutation _sendEmail fornecida pela extensão Email Sender.
- O email é enviado com tipo de conteúdo "text" ou "HTML" dependendo de qual propriedade do input
messageAsé utilizada - O input
fromé opcional; se não fornecido, as configurações armazenadas no WordPress são utilizadas _sendEmailexecuta a função WordPresswp_mail, portanto usará a configuração definida para envio de emails no WordPress (como o provedor SMTP a ser utilizado)
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
}
}
}
}Compondo o email usando Markdown
O campo _strConvertMarkdownToHTML da extensão Helper Function Collection converte Markdown em HTML.
Podemos usar este campo para compor o email usando 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
}
}
}
}Injetando dados dinâmicos no email
Usando os campos de função fornecidos pelo PHP Functions via Schema, podemos criar um template de mensagem contendo marcadores de posição e substituí-los por dados dinâmicos:
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
}
}Enviando um email de notificação ao administrador
Podemos recuperar o email do usuário administrador da tabela wp_options do WordPress e injetar este valor no campo 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
}
}Alternativamente, se as Mutations aninhadas estiverem habilitadas na Schema Configuration, podemos recuperar o email do administrador diretamente na operação mutation (e injetá-lo na 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
}
}Enviando um email personalizado aos usuários
Para que esta query GraphQL funcione, a Schema Configuration aplicada ao endpoint precisa ter as Mutations aninhadas habilitadas
Como _sendEmail é um campo global (ou, mais precisamente, uma mutation global), ele pode ser executado em qualquer tipo do schema GraphQL, incluindo User.
Esta query recupera uma lista de usuários, obtém seus dados (nome, email e número de créditos restantes, que é armazenado como meta) e envia um email personalizado para cada um deles:
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
}
}
}
}
}