{"id":20522,"date":"2026-09-14T23:37:16","date_gmt":"2026-09-14T23:37:16","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/set-up-message-queue-asynchronous-sending-2\/"},"modified":"2026-09-14T23:37:16","modified_gmt":"2026-09-14T23:37:16","slug":"set-up-message-queue-asynchronous-sending","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/","title":{"rendered":"Como configurar filas de mensagens para envio ass\u00edncrono"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode nos ajudar a criar sites ou servi\u00e7os web escal\u00e1veis. Uma fila de mensagens permite que os aplicativos se comuniquem de forma ass\u00edncrona, enviando mensagens entre si.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em alto n\u00edvel, o enfileiramento de mensagens \u00e9 bem simples. Um processo, chamado Produtor, publica mensagens em uma fila, onde elas s\u00e3o armazenadas at\u00e9 que um processo Consumidor esteja pronto para consumi-las.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A publica\u00e7\u00e3o de mensagens em um message broker \u00e9 uma opera\u00e7\u00e3o muito r\u00e1pida, e podemos aproveitar isso para acelerar nossos servi\u00e7os web. Podemos delegar algumas tarefas a processos em segundo plano, fazendo com que nosso servi\u00e7o web publique uma mensagem em uma fila. Assim, podemos ter processos consumidores em segundo plano que consomem as mensagens e executam as tarefas delegadas conforme necess\u00e1rio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste guia, usaremos\u00a0<a href=\"https:\/\/www.rabbitmq.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">RabbitMQ<\/a>\u00a0como message broker. Vamos integrar o RabbitMQ a um aplicativo Flask de exemplo para adiar o envio de e-mails para um processo em segundo plano. O aplicativo, Flaskr, pode parecer familiar se voc\u00ea j\u00e1 concluiu o\u00a0<a href=\"http:\/\/flask.pocoo.org\/docs\/0.12\/tutorial\/introduction\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Tutorial do Flask<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos dar uma olhada na nossa fun\u00e7\u00e3o de visualiza\u00e7\u00e3o de cadastro:<\/p>\n\n\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=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"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=\"code_0\" role=\"tabpanel\" aria-labelledby=\"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=\"#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\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    @app.route(&#039;\/signup&#039;, methods=[&#039;GET&#039;, &#039;POST&#039;])                                  \r\ndef signup():  \r\n    error = None                                                                \r\n    if request.method == &#039;POST&#039;:                                                \r\n        email = request.form[&#039;email&#039;]                                           \r\n        password = request.form[&#039;password&#039;]                                     \r\n        if not (email or password):                                             \r\n            return signup_error(&#039;Email Address and Password are required.&#039;)        \r\n        db = get_db()                                                              \r\n        c = db.cursor()                                                            \r\n        c.execute(&#039;SELECT * FROM users WHERE email=?;&#039;, (email,))                  \r\n        if c.fetchone():                                                           \r\n            return signup_error(&#039;Email Addres already has an account.&#039;)            \r\n        c.execute(&#039;INSERT INTO users (email, password) VALUES (?, ?);&#039;,            \r\n                  (email, pbkdf2_sha256.hash(password)))                           \r\n        db.commit()                                                                  \r\n        send_welcome_email(email)                                                  \r\n        flash(&#039;Account Created&#039;)                                                   \r\n        return redirect(url_for(&#039;login&#039;))                                          \r\n    else:                                                                          \r\n        return render_template(&#039;signup.html&#039;)                                      \r\n\r\ndef send_welcome_email(address):  \r\n    res = requests.post(                                                           \r\n        &quot;https:\/\/api.mailgun.net\/v3\/{}\/messages&quot;.format(app.config[&#039;DOMAIN&#039;]),  \r\n        auth=(&quot;api&quot;, MAILGUN_API_KEY),                                             \r\n        data={&quot;from&quot;: &quot;Flaskr &quot;.format(app.config[&#039;DOMAIN&#039;]),          \r\n              &quot;to&quot;: [address],                                                     \r\n              &quot;subject&quot;: &quot;Welcome to Flaskr!&quot;,                                     \r\n              &quot;text&quot;: &quot;Welcome to Flaskr, your account is now active!&quot;}            \r\n    )                                                                              \r\n    if res.status_code != 200:                                                     \r\n        # Something terrible happened &lt;img class=&quot;emoji&quot; alt=&quot;\ud83d\ude41&quot; src=&quot;https:\/\/s.w.org\/images\/core\/emoji\/12.0.0-1\/svg\/1f641.svg&quot;&gt;                                          \r\n        raise MailgunError(&quot;{}-{}&quot;.format(res.status_code, res.reason))            \r\n\r\ndef signup_error(error):  \r\n    return render_template(&#039;signup.html&#039;, error=error)\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">No momento, a fun\u00e7\u00e3o de visualiza\u00e7\u00e3o verifica o banco de dados para garantir que n\u00e3o exista uma conta com esse endere\u00e7o de e-mail e, em seguida, adiciona o novo usu\u00e1rio ao banco de dados. A visualiza\u00e7\u00e3o ent\u00e3o envia imediatamente uma mensagem de e-mail de boas-vindas ao usu\u00e1rio antes de concluir a solicita\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Existem alguns problemas com essa visualiza\u00e7\u00e3o que podemos melhorar com uma fila de mensagens. N\u00e3o precisamos fazer o usu\u00e1rio esperar por uma resposta enquanto enviamos o e-mail de boas-vindas. Seria melhor se pud\u00e9ssemos responder ao usu\u00e1rio o mais r\u00e1pido poss\u00edvel. Tamb\u00e9m queremos uma maneira de tentar enviar o e-mail de boas-vindas novamente se, por algum motivo, n\u00e3o conseguirmos na primeira tentativa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiro, vamos executar uma inst\u00e2ncia do RabbitMQ em um cont\u00eainer Docker:<\/p>\n\n\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=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"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=\"code_0\" role=\"tabpanel\" aria-labelledby=\"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=\"#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\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                        docker run -d --hostname my-rabbit -p 4369:4369 -p 5672:5672  \r\n     -p 35197:35197 --name rabbitmq rabbitmq:3\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Agora, vamos adicionar um pouco de c\u00f3digo para inicializar uma fila quando nosso aplicativo iniciar:<\/p>\n\n\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=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"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=\"code_0\" role=\"tabpanel\" aria-labelledby=\"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=\"#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\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    def connect_queue():  \r\n    if not hasattr(g, &#039;rabbitmq&#039;):                                                                    \r\n        g.rabbitmq = pika.BlockingConnection(                                                         \r\n            pika.ConnectionParameters(app.config[&#039;RABBITMQ_HOST&#039;])                                    \r\n        )                                                                                             \r\n    return g.rabbitmq                                                                                 \r\n\r\ndef get_welcome_queue():  \r\n    if not hasattr(g, &#039;welcome_queue&#039;):                                                               \r\n        conn = connect_queue()                                                                        \r\n        channel = conn.channel()                                                                      \r\n        channel.queue_declare(queue=&#039;welcome_queue&#039;, durable=True)                                    \r\n        channel.queue_bind(exchange=&#039;amq.direct&#039;, queue=&#039;welcome_queue&#039;)                              \r\n        g.welcome_queue = channel                                                                     \r\n    return g.welcome_queue                                                                            \r\n\r\n@app.teardown_appcontext                                                                              \r\ndef close_queue(error)  \r\n    if hasattr(g, &#039;rabbitmq&#039;):                                                                        \r\n        g.rabbitmq.close()\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Estamos declarando uma fila chamada &#8220;welcome_queue&#8221;, que usaremos para enviar mensagens aos workers com o endere\u00e7o de e-mail para o qual o e-mail de boas-vindas precisa ser enviado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, podemos atualizar nossa visualiza\u00e7\u00e3o de cadastro para publicar uma mensagem na fila, em vez de enviar o e-mail de boas-vindas.<\/p>\n\n\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=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"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=\"code_0\" role=\"tabpanel\" aria-labelledby=\"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=\"#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\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    @app.route(&#039;\/signup&#039;, methods=[&#039;GET&#039;, &#039;POST&#039;])                                  \r\ndef signup():  \r\n    error = None                                                                \r\n    if request.method == &#039;POST&#039;:                                                \r\n        email = request.form[&#039;email&#039;]                                           \r\n        password = request.form[&#039;password&#039;]                                     \r\n        if not (email or password):                                             \r\n            return signup_error(&#039;Email Address and Password are required.&#039;)     \r\n        db = get_db()                                                           \r\n        c = db.cursor()                                                         \r\n        c.execute(&#039;SELECT * FROM users WHERE email=?;&#039;, (email,))               \r\n        if c.fetchone():                                                        \r\n            return signup_error(&#039;Email Addres already has an account.&#039;)         \r\n        c.execute(&#039;INSERT INTO users (email, password) VALUES (?, ?);&#039;,         \r\n                  (email, pbkdf2_sha256.hash(password)))                        \r\n        db.commit()                                                             \r\n        q = get_welcome_queue()                                                 \r\n        q.basic_publish(                                                        \r\n            exchange=&#039;amq.direct&#039;,                                              \r\n            routing_key=&#039;welcome_queue&#039;,                                        \r\n            body=email,                                                         \r\n            properties=pika.BasicProperties(                                    \r\n                delivery_mode=_DELIVERY_MODE_PERSISTENT                         \r\n            )                                                                   \r\n        )                                                                       \r\n        flash(&#039;Account Created&#039;)                                                \r\n        return redirect(url_for(&#039;login&#039;))                                       \r\n    else:                                                                       \r\n        return render_template(&#039;signup.html&#039;)\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Agora podemos escrever o c\u00f3digo do nosso worker. A parte legal de usar uma fila de mensagens \u00e9 que o processo do worker pode ser executado em qualquer lugar. Ele pode ser executado em servidores de workers dedicados ou at\u00e9 mesmo junto com seu servi\u00e7o web. \u00c9 assim que seria um script simples de worker:<\/p>\n\n\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=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"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=\"code_0\" role=\"tabpanel\" aria-labelledby=\"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=\"#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\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    import pika  \r\nimport requests\r\n\r\n# Configuration\r\nDOMAIN = &#039;example.com&#039;  \r\nMAILGUN_API_KEY = &#039;YOUR_MAILGUN_API_KEY&#039;  \r\nRABBITMQ_HOST = &#039;localhost&#039;\r\n\r\nconnection = pika.BlockingConnection(  \r\n    pika.ConnectionParameters(host=RABBITMQ_HOST)\r\n)\r\nchannel = connection.channel()  \r\nchannel.queue_declare(queue=&#039;welcome_queue&#039;, durable=True)\r\n\r\nclass Error(Exception):  \r\n    pass\r\n\r\nclass MailgunError(Error):  \r\n    def __init__(self, message):\r\n        self.message = message\r\n\r\ndef send_welcome_message(ch, method, properties, body):  \r\n    address = body.decode(&#039;UTF-8&#039;)\r\n    print(&quot;Sending welcome email to {}&quot;.format(address))\r\n    res = requests.post(\r\n        &quot;https:\/\/api.mailgun.net\/v3\/{}\/messages&quot;.format(DOMAIN),\r\n        auth=(&quot;api&quot;, MAILGUN_API_KEY),\r\n        data={&quot;from&quot;: &quot;Flaskr &quot;.format(DOMAIN),\r\n              &quot;to&quot;: [address],\r\n              &quot;subject&quot;: &quot;Welcome to Flaskr!&quot;,\r\n              &quot;text&quot;: &quot;Welcome to Flaskr, your account is now active!&quot;}\r\n    )\r\n    ch.basic_ack(delivery_tag=method.delivery_tag)\r\n    if res.status_code != 200:\r\n        # Something terrible happened :-O\r\n        raise MailgunError(&quot;{}-{}&quot;.format(res.status_code, res.reason))\r\n\r\nchannel.basic_consume(send_welcome_message, queue=&#039;welcome_queue&#039;)  \r\nchannel.start_consuming()  \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Estamos quase terminando! Desacoplamos com sucesso o envio do nosso e-mail de boas-vindas do servi\u00e7o web. Agora, a \u00fanica coisa que falta \u00e9 tentarmos enviar novamente o e-mail de boas-vindas, caso o envio falhe por algum motivo. Uma maneira inteligente de adicionar uma l\u00f3gica de nova tentativa ao seu aplicativo \u00e9 usar uma fila de mensagens n\u00e3o entregues (dead letter queue).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adicionaremos uma segunda fila, a &#8220;retry_queue&#8221;, que usaremos para colocar uma mensagem temporariamente se encontrarmos um erro de envio de e-mail. As mensagens na fila de novas tentativas ter\u00e3o uma data de expira\u00e7\u00e3o no futuro. Configuraremos o RabbitMQ de forma que, quando uma mensagem expirar, ela seja colocada de volta em nossa fila de boas-vindas, pronta para ser coletada por um worker para tentar enviar o e-mail de novo:<\/p>\n\n\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=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"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=\"code_0\" role=\"tabpanel\" aria-labelledby=\"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=\"#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\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    retry_channel = connection.channel()  \r\nretry_channel.queue_declare(  \r\n    queue=&#039;retry_queue&#039;,\r\n    durable=True,\r\n    arguments={\r\n        &#039;x-message-ttl&#039;: RETRY_DELAY_MS,\r\n        &#039;x-dead-letter-exchange&#039;: &#039;amq.direct&#039;,\r\n        &#039;x-dead-letter-routing-key&#039;: &#039;welcome_queue&#039;\r\n    }\r\n)\r\n\r\ndef send_welcome_message(ch, method, properties, body):  \r\n    address = body.decode(&#039;UTF-8&#039;)\r\n    print(&quot;Sending welcome email to {}&quot;.format(address))\r\n    res = requests.post(\r\n        &quot;https:\/\/api.mailgun.net\/v3\/{}\/messages&quot;.format(DOMAIN),\r\n        auth=(&quot;api&quot;, MAILGUN_API_KEY),\r\n        data={&quot;from&quot;: &quot;Flaskr &quot;.format(DOMAIN),\r\n              &quot;to&quot;: [address],\r\n              &quot;subject&quot;: &quot;Welcome to Flaskr!&quot;,\r\n              &quot;text&quot;: &quot;Welcome to Flaskr, your account is now active!&quot;}\r\n    )\r\n    ch.basic_ack(delivery_tag=method.delivery_tag)\r\n    if res.status_code != 200:\r\n        print(&quot;Error sending to {}. {} {}. Retrying...&quot;.format(\r\n            address, res.status_code, res.reason\r\n        ))\r\n        retry_channel.basic_publish(\r\n            exchange=&#039;&#039;,\r\n            routing_key=&#039;retry_queue&#039;,\r\n            body=address,\r\n            properties=pika.BasicProperties(\r\n                delivery_mode=_DELIVERY_MODE_PERSISTENT\r\n            )\r\n        )\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Simples assim! Introduzimos com sucesso o envio ass\u00edncrono em nosso aplicativo usando o RabbitMQ. Para baixar o reposit\u00f3rio completo com o c\u00f3digo-fonte de exemplo em funcionamento, confira o\u00a0<a href=\"https:\/\/github.com\/dmend\/mg-async-flaskr\" target=\"_tabs\" rel=\"noopener noreferrer\">meu reposit\u00f3rio no GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Receba mais guias como este assinando o blog. Voc\u00ea receber\u00e1 uma atualiza\u00e7\u00e3o toda semana com as publica\u00e7\u00f5es mais recentes da equipe da Mailgun. E se voc\u00ea ainda n\u00e3o usa a Mailgun para enviar, receber e monitorar os e-mails do seu aplicativo, cadastre-se abaixo!<\/p>\n\n\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_b51f8e4d7d078b3454418e273136d579\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Cadastre-se            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_b51f8e4d7d078b3454418e273136d579\">\r\n                \u00c9 f\u00e1cil come\u00e7ar. E \u00e9 gr\u00e1tis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Veja o que voc\u00ea pode alcan\u00e7ar com a melhor plataforma de entrega de e-mail do mundo.<\/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>O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode nos ajudar a criar sites ou servi\u00e7os web escal\u00e1veis. Uma fila de mensagens permite que os aplicativos se comuniquem de forma ass\u00edncrona, enviando mensagens entre si.<\/p>\n","protected":false},"author":13,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20522","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-email"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Como configurar filas de mensagens para envio ass\u00edncrono - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode ajudar a criar sites ou servi\u00e7os web escal\u00e1veis, incluindo o envio de e-mails.\" \/>\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\/email\/set-up-message-queue-asynchronous-sending\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como configurar filas de mensagens para envio ass\u00edncrono - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode ajudar a criar sites ou servi\u00e7os web escal\u00e1veis, incluindo o envio de e-mails.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.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=\"3 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\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/\",\"name\":\"Como configurar filas de mensagens para envio ass\u00edncrono - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-14T23:37:16+00:00\",\"description\":\"O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode ajudar a criar sites ou servi\u00e7os web escal\u00e1veis, incluindo o envio de e-mails.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/set-up-message-queue-asynchronous-sending\\\/#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\":\"Como configurar filas de mensagens para envio ass\u00edncrono\"}]},{\"@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":"Como configurar filas de mensagens para envio ass\u00edncrono - Transactional Email API Service For Developers | Mailgun","description":"O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode ajudar a criar sites ou servi\u00e7os web escal\u00e1veis, incluindo o envio de e-mails.","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\/email\/set-up-message-queue-asynchronous-sending\/","og_locale":"pt_BR","og_type":"article","og_title":"Como configurar filas de mensagens para envio ass\u00edncrono - Transactional Email API Service For Developers | Mailgun","og_description":"O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode ajudar a criar sites ou servi\u00e7os web escal\u00e1veis, incluindo o envio de e-mails.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/","name":"Como configurar filas de mensagens para envio ass\u00edncrono - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-14T23:37:16+00:00","description":"O enfileiramento de mensagens \u00e9 uma ferramenta interessante que pode ajudar a criar sites ou servi\u00e7os web escal\u00e1veis, incluindo o envio de e-mails.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/set-up-message-queue-asynchronous-sending\/#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":"Como configurar filas de mensagens para envio ass\u00edncrono"}]},{"@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\/20522","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\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20522\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=20522"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=20522"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}