Cloudflare
Email Workers
MIME
Automação
Serverless

E-Mail-Routing + Worker: Verarbeiten Sie E-Mails programmgesteuert am Edge

Das Weiterleiten von E-Mails an einen Worker statt an eine Zieladresse verändert völlig die Möglichkeiten, die Sie mit eingehenden E-Mails machen können.

E-Mail-Routing + Worker: Verarbeiten Sie E-Mails programmgesteuert am Edge

Die meisten Tutorials zum E-Mail-Routing von Cloudflare zeigen, wie man contato@seudominio.com an ein Gmail-Konto weiterleitet. Dies löst den einfachsten Anwendungsfall – verbirgt jedoch den interessantesten Teil des Dienstes. Wenn Sie eine E-Mail an einen Worker statt an eine Zieladresse weiterleiten, wird die E-Mail zu Daten: Sie lesen den Absender, den Betreff, die Kopfzeilen und den gesamten Text und entscheiden, was mit all dem in einer JavaScript-Funktion geschehen soll, die am Edge ausgeführt wird. Dies verändert erheblich die Möglichkeiten, die ohne Ihre eigene E-Mail-Infrastruktur realisierbar sind.

Der E-Mail-Verarbeiter und was Sie erhalten

Die Grundstruktur eines E-Mail-Workers verwendet einen Export namens email innerhalb des Standardobjekts:

export default { async email(message, env, ctx) { // message.from — endereço do remetente // message.to — endereço de destino no seu domínio // message.headers — objeto Headers com todos os cabeçalhos RFC 2822 // message.raw — ReadableStream com a mensagem completa } }

message.from und message.to sind Strings mit Adressen. message.headers ist ein Standard-Web-API-Header-Objekt – Sie greifen auf message.headers.get('subject') oder message.headers.get('x-mailer') auf die gleiche Weise zu, wie Sie es in einem Fetch-Handler tun würden. message.raw ist ein ReadableStream mit der gesamten RFC 2822-Nachricht, einschließlich Headern und Text, mit Unterstützung für Nachrichten bis zu 25 MB.

Es stehen vier Aktionen zur Verfügung: message.forward(address) zum Weiterleiten an eine verifizierte Adresse, message.reply(response) zum Antworten, message.setReject(reason) zum Ablehnen der Nachricht mit einer Fehlermeldung oder einfach zurückkehren, ohne etwas anzurufen – wodurch die Nachricht stillschweigend verworfen wird. Sie können kombinieren: Nach Absender filtern, einige weiterleiten, andere ablehnen und den Rest verarbeiten.

Die MIME-Parsing-Lücke

Hier ist der Punkt, den die Dokumentation diskret erwähnt: Es gibt keinen integrierten MIME-Parser. message.raw gibt Ihnen den Rohstrom. Wenn Sie den Betreff mit UTF-8-Kodierung, den Textkörper im Klartext, das alternative HTML oder die Anhänge extrahieren möchten, müssen Sie das MIME selbst analysieren – oder eine Bibliothek verwenden.

postal-mime funktioniert gut in der Workers-Umgebung. Standardmäßig wird der Stream verbraucht, in ArrayBuffer konvertiert und an den Parser übergeben:

import PostalMime from 'postal-mime'; const raw = await new Response(message.raw).arrayBuffer(); const parsed = await new PostalMime().parse(raw); // parsed.subject, parsed.text, parsed.html, parsed.attachments

parsed.attachments ist ein Array von Objekten mit filename, mimeType und content (ArrayBuffer). Sie können den Inhalt in einem R2-Bucket speichern, Metadaten aus einem NF-e in XML extrahieren oder eine PDF-Datei an eine Extraktions-API übergeben. Die Workers-Laufzeit unterstützt dies ohne zusätzliche Konfiguration außer dem Importieren der Bibliothek.

Die Kosten für die Nutzung des gesamten Streams sind Speicher. Bei Nachrichten mit großen Anhängen nahe der 25-MB-Grenze laden Sie alles in den Arbeitsspeicher. In den meisten Fällen stellt dies kein Problem dar, bei großvolumigen Pipelines ist es jedoch eine Überwachung wert.

Muster, deren Erstellung hier sinnvoll ist

Automatische Erstellung von Support-Tickets. Die E-Mail kommt an, Sie extrahieren den Absender, den Betreff und den Text, stellen eine Nutzlast zusammen und posten sie an die Linear API, Zendesk, Notion oder ein anderes Tool, das Ihr Team verwendet. Das Ticket wird nun mit dem vollständigen Kontext angezeigt, ohne dass jemand etwas kopieren und einfügen muss. Für Teams, die E-Mail-Anfragen erhalten, aber mit Tools zur Problemverfolgung arbeiten, entfällt dadurch ein ständiger manueller Schritt.

Erfassung von Rechnungen und Steuerdokumenten. Sie erstellen eine dedizierte Adresse – nfe@seudominio.com – und jeder Lieferant, der NF-e per E-Mail sendet, lässt den XML- oder PDF-Anhang automatisch verarbeiten: Metadaten werden extrahiert, Datei wird in R2 gespeichert, Datensatz wird in D1 erstellt. Der Arbeiter tut, was ein Mensch tun würde, ohne jedoch die E-Mail öffnen zu müssen.

Filterung vor der Weiterleitung. Wenn Catch-All aktiviert ist, erfasst *@seudominio.com Spam, der an zufällige Adressen in Ihrer Domain gesendet wird. Ein Mitarbeiter kann den Absender anhand einer im KV gespeicherten Liste bekannter problematischer Domänen überprüfen, prüfen, ob der Betreff typische Spam-Muster enthält, und message.setReject('spam detectado') anrufen, bevor er an Ihren Posteingang weiterleitet. Es ist kein vollständiger Spam-Filter, aber er reduziert den Lärm ohne zusätzliche Kosten.

Warnungen und Benachrichtigungen neu formatiert. Überwachungstools – Grafana, PagerDuty, CI-Tools – senden E-Mail-Benachrichtigungen in Formaten, die auf einem Telefon nicht immer lesbar sind. Ein Mitarbeiter fängt diese E-Mails ab, extrahiert die relevanten Informationen aus dem Text und postet per Webhook eine formatierte Nachricht in einem Slack- oder Discord-Kanal. Die ursprüngliche E-Mail kann verworfen oder als Archiv weitergeleitet werden.

Was funktioniert nicht so, wie Sie denken?

message.reply() existiert und funktioniert, aber die Antwort kommt von noreply@cloudflare.com. Wenn Sie möchten, dass der Empfänger eine automatische Antwort erhält, die scheinbar von suporte@seudominio.com kommt, muss der Worker einen ausgehenden SMTP-Dienst aufrufen – Resend, Mailgun, SES – und dabei die erforderlichen Header übergeben. Email Routing hat keinen Zugriff auf den ausgehenden Stream Ihrer Domain.

Wenn der Worker eine nicht abgefangene Ausnahme auslöst, wird die E-Mail mit Fehler 500 abgelehnt. Es gibt keinen automatischen Wiederholungsversuch und keine Warteschlange für unzustellbare Nachrichten. Jede Logik, die möglicherweise fehlschlägt, erfordert Try/Catch mit explizitem Fallback – typischerweise message.forward() auf eine manuelle Triage-Adresse, wenn bei der Verarbeitung ein Fehler auftritt. Dieses Verhalten in der Produktion mit abgelehnten Kunden-E-Mails zu entdecken, ist eine unangenehme Erfahrung.

Wo ist es sinnvoll, über die Weiterleitung hinauszugehen?

Wenn E-Mail-Routing für Sie nur ein Alias für Gmail ist, werden Sie Workers niemals berühren und müssen dies auch nicht tun. Wenn Ihr Team Workers jedoch bereits für andere Zwecke nutzt – APIs, Cron-Jobs, Integrationen – passt Email Worker in dieselbe Infrastruktur mit denselben KV-, D1-, R2-Bindungen und externen Diensten. Sie fügen dem Stapel kein neues Stück hinzu; Sie fügen einen Triggertyp zu einer bereits vorhandenen Umgebung hinzu.

Der richtige Zeitpunkt, mit der einfachen Weiterleitung aufzuhören, ist, wenn Sie bemerken, dass jemand im Team mehr als ein- oder zweimal pro Woche E-Mails öffnet, um Informationen in ein anderes System zu kopieren. Wenn das Muster wiederholbar ist und die Daten in der E-Mail enthalten sind, löst der Worker das Problem in kürzerer Zeit, als die manuelle Aufgabe in einem Monat in Anspruch nehmen würde.

Lesen Sie auch