{"id":17569,"date":"2026-08-17T15:25:50","date_gmt":"2026-08-17T15:25:50","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/"},"modified":"2026-09-15T10:56:18","modified_gmt":"2026-09-15T10:56:18","slug":"criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/","title":{"rendered":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Have you received an instant notification email when you purchased something online? That\u2019s essentially what a <a href=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/o-que-e-e-mail-transacional-basico\/\">transactional message<\/a> is. Transactional messages are automated emails or notifications you receive when you sign up for a service, make a purchase, or reset a password. They also include fraud alerts, abandoned cart reminders, and delivery and banking updates. Unlike marketing emails, they confirm actions and keep you informed, building trust and enhancing user engagement.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">In this article, you\u2019ll learn how to automate transactional messages from your application using API workflows to improve the customer experience.\u00a0<\/p>\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-7576\"><p class=\"h5 m-0\" id=\"toc-title-7576\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#why-does-transactional-email-matter-for-customer-experience\">Why does transactional email matter for customer experience?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#how-do-you-build-an-api-workflow-to-automate-transactional-email\">How do you build an API workflow to automate transactional email?<\/a><a class=\"scrollme link-body-color\" href=\"#set-up-a-new-python-project\">Set up a new Python project<\/a><a class=\"scrollme link-body-color\" href=\"#obtain-an-api-key\">Obtain an API key<\/a><a class=\"scrollme link-body-color\" href=\"#import-modules-and-initialize\">Import modules and initialize<\/a><a class=\"scrollme link-body-color\" href=\"#send-an-email-using-the-mailgun-api\">Send an email using the Mailgun API<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#best-practice-automate-account-registration-emails\">Best practice: Automate account registration emails<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#best-practice-automate-double-opt-in-confirmation-emails\">Best practice: Automate double opt-in confirmation emails<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#best-practice-automate-password-reset-emails\">Best practice: Automate password reset emails<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#whats-next-after-you-ship-these-workflows\">What&#8217;s next after you ship these workflows?<\/a><\/div><\/div><\/nav>\n<h2 class=\"wp-block-heading\">Why does transactional email matter for customer experience?<\/h2>\n\n<p class=\"wp-block-paragraph\">In contrast to bulk <a href=\"https:\/\/www.mailgun.com\/pt\/blog\/deliverability\/e-mails-transacionais-vs-e-mails-de-marketing\/\" target=\"_tabs\" rel=\"noopener noreferrer\">marketing emails<\/a>, transactional messages are personalized, timely, and anticipated because they\u2019re highly relevant to the user\u2019s activity. These messages are one-to-one and contain information directly related to the user\u2019s activities. <\/p>\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> Did you know? 74% of consumers prefer to get transactional messages by email, and 71% would even check their spam folder if they didn\u2019t receive them.<a href=\"https:\/\/www.mailgun.com\/pt\/resources\/research\/e-mail-experiencia-do-cliente\/\"> Learn more in our report on email and the customer experience.<\/a>\u00a0\u00a0<\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">Timely transactional messages \u2013 like order confirmations and account alerts \u2013 <a href=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/e-mail-transacional-heroi-anonimo\/\" target=\"_tabs\" rel=\"noopener noreferrer\">boost customer satisfaction<\/a>, enhance transparency, and strengthen trust by efficiently addressing customer interactions and potential fraud. They also assist customers by offering self-service options and reducing the burden on customer support. <\/p>\n\n<p class=\"wp-block-paragraph\"> Unlike promotional emails that often go unnoticed, transactional emails are eagerly awaited and often opened instantly; users will even go on a treasure hunt in their spam folders to track them down. <\/p>\n\n<h2 class=\"wp-block-heading\">How do you build an API workflow to automate transactional email?<\/h2>\n\n<p class=\"wp-block-paragraph\">In this tutorial, you\u2019ll learn how to send transactional emails from your application by setting up simple workflows with <a href=\"https:\/\/www.mailgun.com\/pt\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>Mailgun APIs<\/u><\/a>. Mailgun is an email-sending platform that allows you to send and track emails. It simplifies transactional email automation with reliable and easy-to-use APIs.\u00a0\u00a0You\u2019ll use Mailgun to automate transactional messages with Python in the following scenarios:\u00a0<\/p>\n\n<ul class=\"wp-block-list\">\n<li>User account signup\u00a0<\/li>\n\n\n\n<li>Double opt-in for newsletter subscriptions\u00a0<\/li>\n\n\n\n<li>Password reset\u00a0<\/li>\n<\/ul>\n\n<p class=\"wp-block-paragraph\">Before you begin, make sure you have the following:\u00a0<\/p>\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.python.org\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>Python<\/u><\/a> 3.9 or higher\u00a0<\/li>\n\n\n\n<li>A Mailgun account (the <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>free 30-day trial<\/u><\/a> is sufficient for this tutorial)\u00a0<\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\">Set up a new Python project<\/h3>\n\n<p class=\"wp-block-paragraph\">To get started, create a directory for your Python project and add an empty .env file inside it.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Before you proceed, it\u2019s good practice to create and activate a new <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>virtual environment<\/u><\/a> to isolate your project and avoid dependency conflicts.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Once your virtual environment is active, install the necessary libraries (requests and python-dotenv) by running the following:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-fc0bfcea3d03ea88c7b03253b39010c1_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-fc0bfcea3d03ea88c7b03253b39010c1_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-fc0bfcea3d03ea88c7b03253b39010c1_code_0\" role=\"tabpanel\" aria-labelledby=\"block-fc0bfcea3d03ea88c7b03253b39010c1_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-fc0bfcea3d03ea88c7b03253b39010c1_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-fc0bfcea3d03ea88c7b03253b39010c1_code_0_content\" class=\"language-Python\">\r\n\r\n                                    ```python \r\npip install requests python-dotenv \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">The requests library enables you to make API calls, and python-dotenv helps you securely store your API key outside your code.\u00a0<\/p>\n\n<h3 class=\"wp-block-heading\">Obtain an API key<\/h3>\n\n<p class=\"wp-block-paragraph\">To make API calls to Mailgun, you need an <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/203380100-Where-can-I-find-my-API-keys-and-SMTP-credentials\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>API key<\/u><\/a> from your Mailgun account.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Sign in to your Mailgun account and navigate to the <a href=\"https:\/\/app.mailgun.com\/settings\/api_security\" target=\"_tabs\" rel=\"noopener noreferrer\"><b><u>API Security<\/u><\/b><\/a> page. You can find this under the drop-down menu below your name in the top right corner:\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Create an API key and then copy it:\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Store it securely by pasting the key into your project\u2019s .env file:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-854551cf7fae1afda6370c4390ce46db_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-854551cf7fae1afda6370c4390ce46db_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-854551cf7fae1afda6370c4390ce46db_code_0\" role=\"tabpanel\" aria-labelledby=\"block-854551cf7fae1afda6370c4390ce46db_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-854551cf7fae1afda6370c4390ce46db_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-854551cf7fae1afda6370c4390ce46db_code_0_content\" class=\"language-Python\">\r\n\r\n                                    ```python \r\nMAILGUN_API_KEY=&quot;Your API Key Here&quot; \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">When you\u2019re using Mailgun, take note of your <b>Sending domains<\/b> on the <a href=\"https:\/\/app.mailgun.com\/mg\/dashboard\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>dashboard<\/u><\/a>:\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">If you\u2019re on a free plan, you\u2019ll see a sandbox domain, which you\u2019ll use in the API endpoint and as the \u201cfrom\u201d email address when sending emails through the Mailgun APIs. The sandbox domain typically looks like this: <code>.mailgun.org<\/code>.<\/p>\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> If you want to send emails using a custom domain, you\u2019ll need to upgrade to a paid plan. The free plan limits you to the sandbox domain and allows sending emails to up to five verified addresses, which is helpful when it comes to testing and development as you integrate the Mailgun API into your system. You can add these email addresses to <a href=\"https:\/\/help.mailgun.com\/hc\/en-us\/articles\/217531258-Authorized-Recipients\"><b>Authorized Recipients<\/b><\/a> in account settings.\u00a0<\/div>\r\n    <\/div>\r\n\n<h3 class=\"wp-block-heading\">Import modules and initialize<\/h3>\n\n<p class=\"wp-block-paragraph\">To automate transactional emails, start by creating a main.py file in your project directory and adding the following code:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-f7204fd18aec83a38d4d203543d1a8b0_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-f7204fd18aec83a38d4d203543d1a8b0_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-f7204fd18aec83a38d4d203543d1a8b0_code_0\" role=\"tabpanel\" aria-labelledby=\"block-f7204fd18aec83a38d4d203543d1a8b0_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-f7204fd18aec83a38d4d203543d1a8b0_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-f7204fd18aec83a38d4d203543d1a8b0_code_0_content\" class=\"language-Python\">\r\n\r\n                                    ```python \r\nimport requests \r\n\r\nimport logging \r\n\r\nimport os \r\n\r\nfrom dotenv import load_dotenv \r\n\r\nlogging.basicConfig(level=logging.INFO)\u202f # Set log level \r\n\r\nload_dotenv()\u202f # For reading the API key from the `.env` file \r\n\r\n# Sandbox API URL format: https:\/\/api.mailgun.net\/v3\/sandbox.mailgun.org\/messages \r\n\r\nMAILGUN_API_URL = &quot;https:\/\/api.mailgun.net\/v3\/YOUR_DOMAIN_NAME\/messages&quot; \r\n\r\nFROM_EMAIL_ADDRESS = &quot;Sender Name &quot; \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">The <code>load_dotenv() function<\/code>, from the <code>python-dotenv <\/code>library, loads environment variables from your .env file into your Python code. This is a best practice for securely storing and accessing sensitive information like credentials and API keys.\u00a0\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">MAILGUN_API_URL sets the API URL for your Python script, while FROM_EMAIL_ADDRESS specifies the sender\u2019s email address (both must use your email-sending domain or the sandbox domain mentioned previously).\u00a0<\/p>\n\n<h3 class=\"wp-block-heading\">Send an email using the Mailgun API<\/h3>\n\n<p class=\"wp-block-paragraph\">The following code shows you how to send an email to a single address using the Mailgun API. You should add this code to the main.py file you created earlier, below initialization:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-8e9f920ef2790514818fde06db88d077_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-8e9f920ef2790514818fde06db88d077_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-8e9f920ef2790514818fde06db88d077_code_0\" role=\"tabpanel\" aria-labelledby=\"block-8e9f920ef2790514818fde06db88d077_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-8e9f920ef2790514818fde06db88d077_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-8e9f920ef2790514818fde06db88d077_code_0_content\" class=\"language-Python\">\r\n\r\n                                    \r\n```python \r\ndef _send_email(to_address: str, subject: str, message: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fSend single email to the given email address using Mailgun API. \r\n\r\n\u202f\u202f\u202f\u202f:param to_address: \r\n\r\n\u202f\u202f\u202f\u202f:param subject: \r\n\r\n\u202f\u202f\u202f\u202f:param message: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202ftry: \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fapi_key = os.getenv(&quot;MAILGUN_API_KEY&quot;)\u202f # Get API key from the `.env` file \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fresp = requests.post(MAILGUN_API_URL, auth=(&quot;api&quot;, api_key), \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fdata={&quot;from&quot;: FROM_EMAIL_ADDRESS, \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f&quot;to&quot;: to_address, &quot;subject&quot;: subject, &quot;html&quot;: message}) \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fif resp.status_code == 200:\u202f # Success \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202flogging.info(f&quot;Successfully sent an email to &#039;{to_address}&#039; via Mailgun API.&quot;) \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202felse: \u202f # Error \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202flogging.error(f&quot;Could not send the email, reason: {resp.text}&quot;) \r\n\r\n\u202f\u202f\u202f\u202fexcept Exception as ex: \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202flogging.exception(f&quot;Mailgun error: {ex}&quot;) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">The <code>_send_email()<\/code> function takes three arguments: <code>to_address<\/code>, <code>subject<\/code>, and <code>message<\/code>. <code>to_address<\/code> is the recipient\u2019s email, while subject and message define the email\u2019s subject and content, respectively. <\/p>\n\n<p class=\"wp-block-paragraph\">The function reads the Mailgun API key from the .env file, which is then used to authenticate the API call to the specified MAILGUN_API_URL. This key uniquely identifies your account, allowing Mailgun to verify your request. <\/p>\n\n<p class=\"wp-block-paragraph\">To ensure the email is sent correctly, you must use your unique API key; the \u201cfrom\u201d email address must be associated with your valid domain or Mailgun\u2019s sandbox domain. Otherwise, the API call will fail and return an error. <\/p>\n\n<p class=\"wp-block-paragraph\">The email data is sent using the HTTP POST method through the requests.post() call. If the API call is successful, the email is queued for delivery, and the API returns an HTTP 200 OK status. If an error occurs, the API provides an error message along with an appropriate HTTP status code. Both scenarios are logged by this function for your reference. <\/p>\n\n<p class=\"wp-block-paragraph\">All the transactional email automations in the following sections rely on the <code>_send_email() <\/code>function to send emails through the Mailgun API. <\/p>\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> The Mailgun API call returns immediately after receiving your HTTP request, indicating that the email has been queued for delivery.\u00a0<\/div><div class=\"content-body mt-3\">With this setup, you\u2019re now ready to automate your transaction emails for various scenarios.\u00a0<\/div>\r\n    <\/div>\r\n\n<h2 class=\"wp-block-heading\">Best practice: Automate account registration emails<\/h2>\n\n<p class=\"wp-block-paragraph\">User account registration is one of the most important use cases for transactional emails, as it serves as the user\u2019s entry point into your system. First impressions matter, and this initial interaction is an opportunity to build trust and establish a positive relationship with the user. A well-timed, congratulatory email upon registration not only confirms the success of the process but also reassures the user that their account is ready to use.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">To achieve this, your system should immediately send an automated confirmation email to let the user know their registration was successful.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Here\u2019s an example of how to implement this:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-c1b1742c903dd17963b478347424ce8e_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-c1b1742c903dd17963b478347424ce8e_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-c1b1742c903dd17963b478347424ce8e_code_0\" role=\"tabpanel\" aria-labelledby=\"block-c1b1742c903dd17963b478347424ce8e_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-c1b1742c903dd17963b478347424ce8e_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-c1b1742c903dd17963b478347424ce8e_code_0_content\" class=\"language-Python\">\r\n\r\n                                    ```python \r\ndef _notify_registration(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fNotify user on successful registration using `_send_email` \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Use your own formatted HTML message here, with an appropriate link \r\n\r\n\u202f\u202f\u202f\u202fregistration_msg = f&#039;Dear {user_name},&lt;br \/&gt;&lt;br \/&gt; You have successfully registered on our site.&#039; \r\n\r\n\u202f\u202f\u202f\u202f_send_email(user_email, &quot;Registration successful&quot;, registration_msg) \r\n\r\ndef register_user(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fRegister the user and notify the user on successful registration. \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Actual code to register the user \r\n\r\n\u202f\u202f\u202f\u202flogging.info(f&quot;Sending registration email to the user: {user_name}...&quot;) \r\n\r\n\u202f\u202f\u202f\u202f_notify_registration(user_name, user_email) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">The first function, <code>_notify_registration()<\/code>, is responsible for sending an email notification to a user who just registered. It takes two parameters: user_name and user_email. Inside this function, a simple HTML message is constructed using an <a href=\"https:\/\/docs.python.org\/3\/tutorial\/inputoutput.html#formatted-string-literals\" target=\"_tabs\" rel=\"noopener noreferrer\"><u>f-string<\/u><\/a>, which allows for easy insertion of the user\u2019s name into the message. This function then calls the previously discussed function <code>_send_email()<\/code> to send the email.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">\u00a0The second stub function, <code>register_user()<\/code>, suggests the main entry point for the user registration process within your system. It also takes <code>user_name<\/code> and <code>user_email<\/code> as parameters. In real life, it would typically have more parameters or \u2018user\u2019 objects with more details. This function is responsible for handling the registration process. As shown here, it logs the email sending and calls the<code> _notify_registration()<\/code> function to initiate the automated confirmation email after completing user registration.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">User registration acts as a triggering event for this transactional email, and you can automate it using the API workflow shown above. It\u2019s also a great chance to inform users about your services and key features.\u00a0<\/p>\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> The Mailgun API allows you to create and customize <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#templates\">HTML templates<\/a>, giving you the flexibility to design visually appealing transactional emails with rich content.\u00a0<\/div>\r\n    <\/div>\r\n\n<h2 class=\"wp-block-heading\">Best practice: Automate double opt-in confirmation emails<\/h2>\n\n<p class=\"wp-block-paragraph\">When a user subscribes to your newsletter, instead of immediately adding them to your subscriber list, you can send an email asking them to confirm their subscription. This process, called double opt-in confirmation, is legally required in some countries for regulatory compliance.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Here, the user\u2019s subscription acts as the trigger, and you can automate double opt-in confirmation with the following code:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-11c81c6a51d39f1733aef2a19a775a38_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-11c81c6a51d39f1733aef2a19a775a38_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-11c81c6a51d39f1733aef2a19a775a38_code_0\" role=\"tabpanel\" aria-labelledby=\"block-11c81c6a51d39f1733aef2a19a775a38_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-11c81c6a51d39f1733aef2a19a775a38_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-11c81c6a51d39f1733aef2a19a775a38_code_0_content\" class=\"language-Python\">\r\n\r\n                                    ```python \r\ndef _notify_subscription(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fDouble opt-in confirmation for user subscription. \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Use your own formatted HTML message here, with an appropriate link \r\n\r\n\u202f\u202f\u202f\u202fsubscription_msg = f&#039;Dear {user_name},&lt;br \/&gt;&lt;br \/&gt; Please confirm your subscription to our newsletter by clicking &#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;this link: &lt;a href=&quot;https:\/\/example.com\/confirm-subscription?id=abcdef1234567xyz&quot;&gt;&#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;https:\/\/example.com\/confirm-subscription?id=abcdef1234567xyz&lt;\/a&gt;&#039; \r\n\r\n\u202f\u202f\u202f\u202f_send_email(user_email, &quot;Confirm subscription&quot;, subscription_msg) \r\n\r\ndef subscribe_user(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fSubscribe user and send opt-in confirmation message. \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Code to subscribe user with pending confirmation \r\n\r\n\u202f\u202f\u202f\u202flogging.info(f&quot;Sending subscription confirmation email to the user: {user_name}...&quot;) \r\n\r\n\u202f\u202f\u202f\u202f_notify_subscription(user_name, user_email) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">The first function, <code>_notify_subscription()<\/code>, is responsible for sending a double opt-in confirmation email to a user who has requested to subscribe to a newsletter. It takes two parameters: user_name and user_email. Inside this function, an HTML message is constructed using an f-string, which includes the user\u2019s name and a dummy confirmation link. Again, this function then calls the <code>_send_email()<\/code> function to send the email.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">The second stub function, <code>subscribe_user()<\/code>, is the main entry point for the user subscription process. It also takes user_name and user_email as parameters. This function typically handles the initial subscription process, likely storing the user\u2019s information with a \u2018pending\u2019 status. At the end, it logs email sending and then calls the <code>_notify_subscription()<\/code> function to create and send the double opt-in confirmation email.\u00a0<\/p>\n\n<h2 class=\"wp-block-heading\">Best practice: Automate password reset emails<\/h2>\n\n<p class=\"wp-block-paragraph\">Ever found yourself needing to log in, only to realize that you\u2019ve forgotten your password and have to click the \u201cforgot password\u201d link? Clicking that link triggers an email you\u2019re eagerly anticipating.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Here\u2019s example code that demonstrates how to automate this type of transactional email:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-17311108f134bd9c544306c9be15425f_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-17311108f134bd9c544306c9be15425f_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-17311108f134bd9c544306c9be15425f_code_0\" role=\"tabpanel\" aria-labelledby=\"block-17311108f134bd9c544306c9be15425f_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-17311108f134bd9c544306c9be15425f_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-17311108f134bd9c544306c9be15425f_code_0_content\" class=\"language-Python\">\r\n\r\n                                    ```python \r\ndef _notify_password_reset(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fSend password reset email to the user \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Use your own formatted HTML message here \r\n\r\n\u202f\u202f\u202f\u202fregistration_msg = f&#039;Dear {user_name},&lt;br \/&gt;&lt;br \/&gt; Please use the following link to reset your password: &#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;&lt;a href=&quot;https:\/\/example.com\/password-reset?token=lmnopqr7654321abc&quot;&gt;&#039; \\ \r\n\r\n\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202ff&#039;https:\/\/example.com\/password-reset?token=lmnopqr7654321abc&lt;\/a&gt;&#039; \r\n\r\n\u202f\u202f\u202f\u202f_send_email(user_email, &quot;Reset password&quot;, registration_msg) \r\n\r\ndef reset_user_password(user_name: str, user_email: str): \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202fInitiate password-reset and notify user \r\n\r\n\u202f\u202f\u202f\u202f:param user_name: \r\n\r\n\u202f\u202f\u202f\u202f:param user_email: \r\n\r\n\u202f\u202f\u202f\u202f&quot;&quot;&quot; \r\n\r\n\u202f\u202f\u202f\u202f# Password reset code for the user \r\n\r\n\u202f\u202f\u202f\u202flogging.info(f&quot;Sending password reset email to the user: {user_name}...&quot;) \r\n\r\n\u202f\u202f\u202f\u202f_notify_password_reset(user_name, user_email) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">The <code>_notify_password_reset() function<\/code> is responsible for creating and sending a password reset email to the user. It takes the user\u2019s name and email address as inputs. Inside the function, an HTML message is created using an f-string, which includes the user\u2019s name and a unique password reset URL. The function then uses the <code>_send_email()<\/code> function to deliver this message to the user\u2019s inbox.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">The <code>reset_user_password()<\/code> function works alongside it as the starting point when a user wants to reset their password. It also requires the user\u2019s name and email as inputs. This function would normally do some behind-the-scenes work to set up the password reset (not shown in this code). It then logs the email dispatch and calls <code>_notify_password_reset()<\/code> to send the reset instructions.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Similar to the previous two use cases, this pair of functions demonstrates a modular approach to handling password resets. By keeping the notification and triggering processes separate, this design makes the system easier to maintain and allows for future improvements to the password reset workflow.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">You can call these functions from the main function for demonstration, like this:\u00a0<\/p>\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#block-88876fca252fc128bf9735b1aa63670c_code_0\" type=\"button\" role=\"tab\" aria-controls=\"block-88876fca252fc128bf9735b1aa63670c_code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"block-88876fca252fc128bf9735b1aa63670c_code_0\" role=\"tabpanel\" aria-labelledby=\"block-88876fca252fc128bf9735b1aa63670c_code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#block-88876fca252fc128bf9735b1aa63670c_code_0_content\" data-clipboard-label=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                                                        <pre class=\"w-100 h-100 m-0 line-numbers language-Python\" tabindex=\"0\">\r\n                                <code id=\"block-88876fca252fc128bf9735b1aa63670c_code_0_content\" class=\"language-Python\">\r\n\r\n                                    ```python \r\n# Demo of automated transactional emails \r\n\r\nif __name__ == &quot;__main__&quot;: \r\n\r\n\u202f\u202f\u202f\u202fregister_user(&quot;Kirstin&quot;,\u202f &quot;Kirstin &quot;) \r\n\r\n\u202f\u202f\u202f\u202fsubscribe_user(&quot;Jakkie&quot;,\u202f &quot;Jakkie &quot;) \r\n\r\n\u202f\u202f\u202f\u202freset_user_password(&quot;Manish&quot;,\u202f &quot;Manish &quot;) \r\n``` \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n<p class=\"wp-block-paragraph\">These three examples show how to automate transactional emails within your system. Each follows a similar pattern:\u00a0<\/p>\n\n<ol class=\"wp-block-list\">\n<li>A specific function is created for a particular type of notification (registration, subscription, or password reset), which gets triggered by the corresponding event or workflow.\u00a0<\/li>\n\n\n\n<li>The function prepares a relevant email message.\u00a0<\/li>\n\n\n\n<li>A separate utility function (using the Mailgun API) is called to actually send the email.\u00a0<\/li>\n<\/ol>\n\n<p class=\"wp-block-paragraph\">This approach ensures that transactional emails are automatically sent at key moments, such as when a user registers, subscribes, or requests a password reset.\u00a0\u00a0<\/p>\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> You can find all the code for this tutorial in <a href=\"https:\/\/github.com\/manishh\/gifts-giveaways\/tree\/master\/python\/mailgun-transactional-emails\">this GitHub repo<\/a>. For even more info check out <a href=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/os-beneficios-da-automacao-de-e-mail\/\">the eight benefits of email automation to enhance your customer experience.<\/a>\u00a0<\/div>\r\n    <\/div>\r\n\n<h2 class=\"wp-block-heading\">What&#8217;s next after you ship these workflows?<\/h2>\n\n<p class=\"wp-block-paragraph\">In this article, we broke down the power of transactional emails in user communication. Unlike marketing emails, these messages are triggered by specific actions\u2014like a purchase or password reset\u2014and deliver crucial, time-sensitive info that keeps users engaged and informed.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">We also covered how to automate these emails using API workflows, walking you through setting up functions for things like welcome emails, subscription confirmations, and password resets. This automation ensures your emails hit inboxes right when your users need them.\u00a0<\/p>\n\n<p class=\"wp-block-paragraph\">Ready to streamline your transactional emails? With Mailgun\u2019s robust APIs and tracking tools, you can easily automate messages and enhance the user experience from start to finish, but don\u2019t take our word for it, check it out for yourself.\u00a0<\/p>\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\"  aria-labelledby=\"banner-block-block-3462ed96f6f7c1c235e45f989d151eca\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Sign Up            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block-3462ed96f6f7c1c235e45f989d151eca\">\r\n                It&#8217;s easy to get started. And it&#8217;s free.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">See what you can accomplish with the world\u2019s best email delivery platform.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Mantenha os clientes informados com e-mails transacionais que geram confian\u00e7a. Aprenda a potencializar sua automa\u00e7\u00e3o de e-mail com os fluxos de trabalho de API do Mailgun para uma experi\u00eancia do cliente perfeita.\u00a0<\/p>\n","protected":false},"author":11,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"blog_category":[19],"class_list":["post-17569","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-dev-life"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores, com exemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores: configura\u00e7\u00e3o segura de API, tratamento de erros e c\u00f3digo Python para fluxos de trabalho de registro, opt-in e redefini\u00e7\u00e3o de senha.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores, com exemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores: configura\u00e7\u00e3o segura de API, tratamento de erros e c\u00f3digo Python para fluxos de trabalho de registro, opt-in e redefini\u00e7\u00e3o de senha.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-15T10:56:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/\",\"name\":\"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores, com exemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-08-17T15:25:50+00:00\",\"dateModified\":\"2026-09-15T10:56:18+00:00\",\"description\":\"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores: configura\u00e7\u00e3o segura de API, tratamento de erros e c\u00f3digo Python para fluxos de trabalho de registro, opt-in e redefini\u00e7\u00e3o de senha.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/dev-life\\\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/inicio\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores, com exemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun","description":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores: configura\u00e7\u00e3o segura de API, tratamento de erros e c\u00f3digo Python para fluxos de trabalho de registro, opt-in e redefini\u00e7\u00e3o de senha.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/","og_locale":"pt_BR","og_type":"article","og_title":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores, com exemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun","og_description":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores: configura\u00e7\u00e3o segura de API, tratamento de erros e c\u00f3digo Python para fluxos de trabalho de registro, opt-in e redefini\u00e7\u00e3o de senha.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-15T10:56:18+00:00","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/","name":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores, com exemplos de c\u00f3digo - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-08-17T15:25:50+00:00","dateModified":"2026-09-15T10:56:18+00:00","description":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores: configura\u00e7\u00e3o segura de API, tratamento de erros e c\u00f3digo Python para fluxos de trabalho de registro, opt-in e redefini\u00e7\u00e3o de senha.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/pt\/blog\/dev-life\/criar-fluxos-de-trabalho-de-api-para-e-mails-transacionais\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/pt\/inicio\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Pr\u00e1ticas recomendadas de e-mail transacional para desenvolvedores"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/pt\/#website","url":"https:\/\/www.mailgun.com\/pt\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!","publisher":{"@id":"https:\/\/www.mailgun.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/pt\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/17569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/users\/11"}],"version-history":[{"count":4,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/17569\/revisions"}],"predecessor-version":[{"id":21345,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/17569\/revisions\/21345"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=17569"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=17569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}