{"id":20483,"date":"2026-09-14T23:35:09","date_gmt":"2026-09-14T23:35:09","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/nachrichten-warteschlange-asynchroner-versand-einrichten\/"},"modified":"2026-09-14T23:35:09","modified_gmt":"2026-09-14T23:35:09","slug":"nachrichten-warteschlange-asynchroner-versand-einrichten","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/","title":{"rendered":"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Die Nachrichten-Warteschlange ist ein interessantes Tool, das uns bei der Erstellung skalierbarer Websites oder Web-Dienste unterst\u00fctzt. Eine Nachrichten-Warteschlange erm\u00f6glicht Anwendungen die asynchrone Kommunikation, indem sie Nachrichten untereinander austauschen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Grunde genommen sind Nachrichten-Warteschlangen ziemlich einfach. Ein Prozess, der sogenannte Producer, ver\u00f6ffentlicht Nachrichten in einer Warteschlange, wo sie gespeichert werden, bis ein Consumer-Prozess bereit ist, diese abzurufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ver\u00f6ffentlichen von Nachrichten an einen Nachrichten-Broker ist ein sehr schneller Vorgang, den wir nutzen k\u00f6nnen, um unsere Web-Dienste zu beschleunigen. Wir k\u00f6nnen einige Aufgaben an Hintergrundprozesse delegieren, indem unser Web-Dienst stattdessen eine Nachricht an eine Warteschlange sendet. Anschlie\u00dfend k\u00f6nnen Consumer-Prozesse im Hintergrund diese Nachrichten abrufen und die delegierten Aufgaben bei Bedarf ausf\u00fchren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Leitfaden verwenden wir\u00a0<a href=\"https:\/\/www.rabbitmq.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\">RabbitMQ<\/a>\u00a0als Nachrichten-Broker. Wir integrieren RabbitMQ in eine Flask-Beispielanwendung, um den E-Mail-Versand an einen Hintergrundprozess auszulagern. Die Anwendung Flaskr kommt Ihnen vielleicht bekannt vor, wenn Sie bereits Folgendes abgeschlossen haben:\u00a0<a href=\"http:\/\/flask.pocoo.org\/docs\/0.12\/tutorial\/introduction\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Flask-Tutorial<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sehen wir uns unsere View-Funktion f\u00fcr die Anmeldung an:<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Aktuell pr\u00fcft die View-Funktion in der Datenbank, ob bereits ein Konto mit dieser E-Mail-Adresse existiert, und f\u00fcgt dann den neuen Nutzer zur Datenbank hinzu. Anschlie\u00dfend sendet die Ansicht sofort eine Willkommens-E-Mail an den Nutzer, bevor die Anfrage abgeschlossen wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei dieser Ansicht gibt es einige Punkte, die wir mit einer Nachrichten-Warteschlange verbessern k\u00f6nnen. Wir m\u00fcssen den Nutzer nicht auf eine Antwort warten lassen, w\u00e4hrend wir die Willkommens-E-Mail versenden. Es w\u00e4re besser, wenn wir dem Nutzer so schnell wie m\u00f6glich antworten k\u00f6nnten. Zudem ben\u00f6tigen wir eine M\u00f6glichkeit, den Versand der Willkommens-E-Mail zu wiederholen, falls er beim ersten Versuch aus irgendeinem Grund fehlschl\u00e4gt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fchren wir zun\u00e4chst eine Instanz von RabbitMQ in einem Docker-Container aus:<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">F\u00fcgen wir nun etwas Code hinzu, um beim Start unserer Anwendung eine Warteschlange zu initialisieren:<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Wir deklarieren eine Warteschlange namens \u201ewelcome_queue\u201c, \u00fcber die wir Nachrichten mit der E-Mail-Adresse, an die die Willkommens-E-Mail gesendet werden soll, an Worker senden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als N\u00e4chstes k\u00f6nnen wir unsere Anmeldeansicht so aktualisieren, dass sie eine Nachricht in der Warteschlange ver\u00f6ffentlicht, anstatt die Willkommens-E-Mail direkt zu versenden.<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Jetzt k\u00f6nnen wir unseren Worker-Code schreiben. Das Besondere an einer Nachrichten-Warteschlange ist, dass der Worker-Prozess \u00fcberall ausgef\u00fchrt werden kann. Er kann auf dedizierten Worker-Servern oder auch parallel zu Ihrem Web-Dienst laufen. So w\u00fcrde ein einfaches Worker-Skript aussehen:<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Wir sind fast fertig. Wir haben den Versand unserer Willkommens-E-Mail erfolgreich vom Web-Dienst entkoppelt. Jetzt fehlt nur noch, dass wir den Versand der Willkommens-E-Mail wiederholen k\u00f6nnen, falls dieser aus irgendeinem Grund fehlschl\u00e4gt. Eine clevere Methode, um eine Wiederholungslogik in Ihre Anwendung einzubauen, ist die Verwendung einer Dead-Letter-Warteschlange.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir f\u00fcgen eine zweite Warteschlange hinzu, die \u201eretry_queue\u201c, in der wir eine Nachricht vor\u00fcbergehend ablegen, falls ein Fehler beim E-Mail-Versand auftritt. Die Nachrichten in der Wiederholungs-Warteschlange erhalten ein Ablaufdatum in der Zukunft. Wir konfigurieren RabbitMQ so, dass eine Nachricht nach Ablauf dieser Frist zur\u00fcck in unsere Willkommens-Warteschlange verschoben wird. Dort kann sie von einem Worker abgerufen werden, um den E-Mail-Versand erneut zu versuchen:<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Und das war&#8217;s. Wir haben den asynchronen Versand mithilfe von RabbitMQ erfolgreich in unsere Anwendung integriert. Um das Quellcode-Repository mit dem vollst\u00e4ndigen und funktionierenden Beispiel herunterzuladen, besuchen Sie\u00a0<a href=\"https:\/\/github.com\/dmend\/mg-async-flaskr\" target=\"_tabs\" rel=\"noopener noreferrer\">mein GitHub-Repo<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abonnieren Sie den Blog, um weitere Leitf\u00e4den wie diesen zu erhalten. Sie erhalten jede Woche ein Update mit den neuesten Beitr\u00e4gen des Mailgun-Teams. Und falls Sie Mailgun noch nicht f\u00fcr den Versand, den Empfang und das Tracking der E-Mails Ihrer Anwendung nutzen, melden Sie sich einfach unten an.<\/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_f068faea89254453ab6899858a44087d\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Registrieren            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_f068faea89254453ab6899858a44087d\">\r\n                Loslegen ist ganz einfach. Und es ist kostenlos.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Erfahren Sie, was Sie mit der weltbesten Plattform f\u00fcr E-Mail-Zustellung alles erreichen k\u00f6nnen.<\/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>Die Nachrichten-Warteschlange ist ein interessantes Tool, das uns bei der Erstellung skalierbarer Websites oder Web-Dienste unterst\u00fctzt. Eine Nachrichten-Warteschlange erm\u00f6glicht Anwendungen die asynchrone Kommunikation, indem sie Nachrichten untereinander austauschen.<\/p>\n","protected":false},"author":13,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20483","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>Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Nachrichten-Warteschlangen sind ein interessantes Tool zur Erstellung skalierbarer Websites oder Web-Dienste, einschlie\u00dflich des E-Mail-Versands.\" \/>\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\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Nachrichten-Warteschlangen sind ein interessantes Tool zur Erstellung skalierbarer Websites oder Web-Dienste, einschlie\u00dflich des E-Mail-Versands.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/\" \/>\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\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/\",\"name\":\"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-14T23:35:09+00:00\",\"description\":\"Nachrichten-Warteschlangen sind ein interessantes Tool zur Erstellung skalierbarer Websites oder Web-Dienste, einschlie\u00dflich des E-Mail-Versands.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/#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\\\/de\\\/blog\\\/email\\\/nachrichten-warteschlange-asynchroner-versand-einrichten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/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\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten - Transactional Email API Service For Developers | Mailgun","description":"Nachrichten-Warteschlangen sind ein interessantes Tool zur Erstellung skalierbarer Websites oder Web-Dienste, einschlie\u00dflich des E-Mail-Versands.","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\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/","og_locale":"de_DE","og_type":"article","og_title":"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten - Transactional Email API Service For Developers | Mailgun","og_description":"Nachrichten-Warteschlangen sind ein interessantes Tool zur Erstellung skalierbarer Websites oder Web-Dienste, einschlie\u00dflich des E-Mail-Versands.","og_url":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/","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\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/","url":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/","name":"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-14T23:35:09+00:00","description":"Nachrichten-Warteschlangen sind ein interessantes Tool zur Erstellung skalierbarer Websites oder Web-Dienste, einschlie\u00dflich des E-Mail-Versands.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/#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\/de\/blog\/email\/nachrichten-warteschlange-asynchroner-versand-einrichten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"Nachrichten-Warteschlangen f\u00fcr den asynchronen Versand einrichten"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/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\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/20483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/20483\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=20483"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=20483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}