{"id":20431,"date":"2026-09-14T23:34:43","date_gmt":"2026-09-14T23:34:43","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/configurer-files-attente-messages-envoi-asynchrone\/"},"modified":"2026-09-14T23:34:43","modified_gmt":"2026-09-14T23:34:43","slug":"configurer-files-attente-messages-envoi-asynchrone","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/","title":{"rendered":"Comment configurer des files d&rsquo;attente de messages pour l&rsquo;envoi asynchrone"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La mise en file d&rsquo;attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs. Une file d&rsquo;attente de messages permet aux applications de communiquer de mani\u00e8re asynchrone en s&rsquo;envoyant des messages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans les grandes lignes, la mise en file d&rsquo;attente de messages est assez simple. Un processus, appel\u00e9 le Producteur, publie des messages dans une file d&rsquo;attente, o\u00f9 ils sont stock\u00e9s jusqu&rsquo;\u00e0 ce qu&rsquo;un processus Consommateur soit pr\u00eat \u00e0 les consommer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La publication de messages vers un courtier de messages est une op\u00e9ration tr\u00e8s rapide, que nous pouvons exploiter pour acc\u00e9l\u00e9rer nos services Web. Nous pouvons d\u00e9l\u00e9guer certaines t\u00e2ches \u00e0 des processus en arri\u00e8re-plan en faisant en sorte que notre service Web publie plut\u00f4t un message dans une file d&rsquo;attente. Nous pouvons ensuite utiliser des processus consommateurs en arri\u00e8re-plan pour consommer les messages et ex\u00e9cuter les t\u00e2ches d\u00e9l\u00e9gu\u00e9es selon les besoins.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans ce guide, nous utiliserons\u00a0<a href=\"https:\/\/www.rabbitmq.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">RabbitMQ<\/a>\u00a0comme courtier de messages. Nous allons int\u00e9grer RabbitMQ dans un exemple d&rsquo;application Flask pour diff\u00e9rer l&rsquo;envoi d&#8217;emails vers un processus en arri\u00e8re-plan. L&rsquo;application, Flaskr, vous semblera peut-\u00eatre famili\u00e8re si vous avez d\u00e9j\u00e0 termin\u00e9 le\u00a0<a href=\"http:\/\/flask.pocoo.org\/docs\/0.12\/tutorial\/introduction\/\" target=\"_tabs\" rel=\"noopener noreferrer\">tutoriel Flask<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examinons notre fonction de vue d&rsquo;inscription\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Actuellement, la fonction de vue v\u00e9rifie la base de donn\u00e9es pour s&rsquo;assurer qu&rsquo;aucun compte n&rsquo;existe d\u00e9j\u00e0 avec cette adresse email, puis ajoute le nouvel utilisateur \u00e0 la base de donn\u00e9es. La vue envoie ensuite imm\u00e9diatement un email de bienvenue \u00e0 l&rsquo;utilisateur avant de terminer la requ\u00eate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette vue pr\u00e9sente quelques probl\u00e8mes que nous pouvons am\u00e9liorer gr\u00e2ce \u00e0 une file d&rsquo;attente de messages. Il n&rsquo;est pas n\u00e9cessaire de faire attendre l&rsquo;utilisateur pendant l&rsquo;envoi de l&#8217;email de bienvenue. Il serait pr\u00e9f\u00e9rable de pouvoir r\u00e9pondre \u00e0 l&rsquo;utilisateur d\u00e8s que possible. Nous voulons \u00e9galement un moyen de r\u00e9essayer d&rsquo;envoyer l&#8217;email de bienvenue si, pour une raison quelconque, nous n&rsquo;y parvenons pas du premier coup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tout d&rsquo;abord, ex\u00e9cutons une instance de RabbitMQ dans un conteneur Docker\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Ajoutons maintenant un peu de code pour initialiser une file d&rsquo;attente au d\u00e9marrage de notre application\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Nous d\u00e9clarons une file d&rsquo;attente appel\u00e9e \u00ab\u00a0welcome_queue\u00a0\u00bb que nous utiliserons pour envoyer des messages aux workers avec l&rsquo;adresse email \u00e0 laquelle l&#8217;email de bienvenue doit \u00eatre envoy\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, nous pouvons mettre \u00e0 jour notre vue d&rsquo;inscription pour publier un message dans la file d&rsquo;attente au lieu d&rsquo;envoyer l&#8217;email de bienvenue.<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Nous pouvons maintenant \u00e9crire notre code de worker. L&rsquo;avantage d&rsquo;utiliser une file d&rsquo;attente de messages est que le processus worker peut s&rsquo;ex\u00e9cuter n&rsquo;importe o\u00f9. Il peut s&rsquo;ex\u00e9cuter sur des serveurs d\u00e9di\u00e9s aux workers, ou bien aux c\u00f4t\u00e9s de votre service Web. Voici \u00e0 quoi ressemblerait un simple script de worker\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Nous avons presque termin\u00e9\u00a0! Nous avons r\u00e9ussi \u00e0 dissocier l&rsquo;envoi de notre email de bienvenue du service Web. Il ne nous reste plus qu&rsquo;\u00e0 r\u00e9essayer d&rsquo;envoyer l&#8217;email de bienvenue au cas o\u00f9 son envoi \u00e9chouerait pour une raison quelconque. Une fa\u00e7on intelligente d&rsquo;ajouter une logique de nouvelle tentative \u00e0 votre application consiste \u00e0 utiliser une file d&rsquo;attente de lettres mortes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous ajouterons une deuxi\u00e8me file d&rsquo;attente, la \u00ab\u00a0retry_queue\u00a0\u00bb, que nous utiliserons pour placer temporairement un message si nous rencontrons une erreur d&rsquo;envoi d&#8217;email. Les messages de la file d&rsquo;attente de nouvelles tentatives auront une date d&rsquo;expiration dans le futur. Nous allons configurer RabbitMQ de sorte que, lorsqu&rsquo;un message expire, il soit replac\u00e9 dans notre file d&rsquo;attente de bienvenue, pr\u00eat \u00e0 \u00eatre r\u00e9cup\u00e9r\u00e9 par un worker pour tenter d&rsquo;envoyer \u00e0 nouveau l&#8217;email\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Et c&rsquo;est tout\u00a0! Nous avons introduit avec succ\u00e8s l&rsquo;envoi asynchrone dans notre application \u00e0 l&rsquo;aide de RabbitMQ. Pour t\u00e9l\u00e9charger le d\u00e9p\u00f4t de code source complet de l&rsquo;exemple, consultez\u00a0<a href=\"https:\/\/github.com\/dmend\/mg-async-flaskr\" target=\"_tabs\" rel=\"noopener noreferrer\">mon d\u00e9p\u00f4t Github<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9couvrez d&rsquo;autres guides comme celui-ci en vous inscrivant au blog. Vous recevrez une mise \u00e0 jour chaque semaine avec les derniers articles de l&rsquo;\u00e9quipe Mailgun. Et si vous n&rsquo;utilisez pas encore Mailgun pour envoyer, recevoir et suivre les emails de votre application, inscrivez-vous ci-dessous\u00a0!<\/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_7c184096e4ac5875c71460b1ee75b730\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                S&rsquo;inscrire            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_7c184096e4ac5875c71460b1ee75b730\">\r\n                Lancez-vous, c&rsquo;est facile ! Et c&rsquo;est gratuit.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">D\u00e9couvrez ce que vous pouvez accomplir avec la meilleure plateforme de livraison d\u2019emails au monde.<\/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>La mise en file d&rsquo;attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs. Une file d&rsquo;attente de messages permet aux applications de communiquer de mani\u00e8re asynchrone en s&rsquo;envoyant des messages.<\/p>\n","protected":false},"author":13,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20431","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>Comment configurer des files d&#039;attente de messages pour l&#039;envoi asynchrone - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"La mise en file d&#039;attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs, y compris pour l&#039;envoi d&#039;emails.\" \/>\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\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comment configurer des files d&#039;attente de messages pour l&#039;envoi asynchrone - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"La mise en file d&#039;attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs, y compris pour l&#039;envoi d&#039;emails.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/\" \/>\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 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/\",\"name\":\"Comment configurer des files d'attente de messages pour l'envoi asynchrone - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-14T23:34:43+00:00\",\"description\":\"La mise en file d'attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs, y compris pour l'envoi d'emails.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/#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\\\/fr\\\/blog\\\/email\\\/configurer-files-attente-messages-envoi-asynchrone\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Comment configurer des files d\u2019attente de messages pour l\u2019envoi asynchrone\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/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\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Comment configurer des files d'attente de messages pour l'envoi asynchrone - Transactional Email API Service For Developers | Mailgun","description":"La mise en file d'attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs, y compris pour l'envoi d'emails.","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\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/","og_locale":"fr_FR","og_type":"article","og_title":"Comment configurer des files d'attente de messages pour l'envoi asynchrone - Transactional Email API Service For Developers | Mailgun","og_description":"La mise en file d'attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs, y compris pour l'envoi d'emails.","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/","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 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/","name":"Comment configurer des files d'attente de messages pour l'envoi asynchrone - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-14T23:34:43+00:00","description":"La mise en file d'attente de messages est un outil int\u00e9ressant qui permet de cr\u00e9er des sites ou des services Web \u00e9volutifs, y compris pour l'envoi d'emails.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/#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\/fr\/blog\/email\/configurer-files-attente-messages-envoi-asynchrone\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/fr\/blog\/"},{"@type":"ListItem","position":3,"name":"Comment configurer des files d\u2019attente de messages pour l\u2019envoi asynchrone"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/fr\/#website","url":"https:\/\/www.mailgun.com\/fr\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !","publisher":{"@id":"https:\/\/www.mailgun.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/fr\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/#\/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\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20431\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media?parent=20431"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=20431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}