Ich möchte die Konfiguration teilen, die ich ausgearbeitet habe, um AWS SES für ausgehende, abgelehnte (Bounce) und eingehende E-Mails zu nutzen. Der SES-Dienst hat durchaus seine Tücken, und es hat viel Ausprobieren gebraucht, um genau zu verstehen, wie er funktioniert. Dies ist eher ein Brain-Dump als eine Schritt-für-Schritt-Anleitung. Es sollte eigentlich nicht nötig sein, aber: Nutzung auf eigenes Risiko. Und lies auf keinen Fall niemals Code von anderen ungeprüft, den du implementierst.
Hintergrund:
Ich arbeite daran, Discourse in AWS zu deployen und so viele ihrer Dienste wie möglich zu nutzen, um Zuverlässigkeit und Redundanz sicherzustellen. Als Entwickler bin ich mit der Kommandozeile und Code wohler und wollte IaC-Automatisierung verwenden. Meine gesamte Umgebung wird mit Terraform deployed, aber ich habe versucht, im Web-Console durchzuklicken und die Dinge so gut wie möglich zu ordnen. IAM und Policy-Dokumente liegen außerhalb des Rahmens dieses Beitrags, aber ich habe an den Stellen hingewiesen, an denen sie benötigt werden.
Eine Postfix-Instanz zu betreiben, scheint für eine einzelne Anwendung übertrieben. Eine POP3-Postfachnutzung ist so sehr in den 90ern. Also bin ich dem AWS-Kaninchenbau gefolgt.
Ich habe einige extrem nützliche Beiträge gefunden, die mir bei meiner Suche geholfen haben:
- AWS SES / AWS Lambda mail receiver endpoint code?
- How to use Amazon SES for sending emails to users?
- Configure VERP to handle bouncing e-mails
Der mail-receiver-Container hat mir auch geholfen zu verstehen, wie Discourse Nachrichten verarbeitet:
- Configure direct-delivery incoming email for self-hosted sites with Mail-Receiver
- Update mail-receiver to the release version
Anfangs hatte ich erwartet, dass der AWS-Webhook-Endpoint eingehende Nachrichten verarbeiten würde, aber nach dem Durcharbeiten des Codes stellte sich heraus, dass dies nicht der Fall ist. Ich habe meinen Lambda-Empfängercode auf dem hervorragenden Beispiel von @dltj basierend. Ich habe mich entschieden, für die Zustellung von Nachrichten SNS anstelle von S3 zu verwenden.
Voraussetzungen
- AWS-Konto
- Grundlegende Kenntnisse in DNS und den e-mail-bezogenen Record-Typen
- Eine Domain (oder Subdomain), in der du Änderungen vornehmen kannst
Hinweise
- Alles, was dokumentiert ist, muss in derselben AWS-Region erstellt werden
- Fett kursivierter Text wie dieser sind deine implementierungsspezifischen Werte
- Kursivierter Text sind Namen von Variablen, festen Werten oder UI-Elementen
Schritte
-
Erstelle eine Simple Email Service (SES) Domain-Identität, your.domain, in einer der AWS-Regionen, die das Empfangen von E-Mails unterstützt
-
Verifiziere die Domain-Identität
-
Erstelle ein Simple Notification Service (SNS) Thema, feedback-sns-topic, für Feedback-Benachrichtigungen
a. Füge die ARN des feedback-sns-topic Themas zu deineraws_sns_topic_arn_allowlist-Einstellung hinzu. -
Konfiguriere die your.domain Domain-Identität
a. Aktiviere das Weiterleiten von E-Mail-Feedback
b. Konfiguriere Bounce- und Complaint-Feedback-Benachrichtigungen (nicht Delivery) so, dass sie das SNS-Thema feedback-sns-topic verwenden -
Erstelle eine Abonnement auf dem SNS-Thema feedback-sns-topic
a. Protokoll ist HTTPS (du nutzt hoffentlich nicht noch immer HTTP, oder?)
b. Setze den Endpoint auf https://your.domain/webhooks/aws (siehe VERP-Beitrag)
c. Stelle sicher, dass Raw Message Delivery deaktiviert ist -
Erstelle ein weiteres SNS-Thema, incoming-sns-topic, für eingehende E-Mails
-
Erstelle eine SES E-Mail-Empfangsregel-Sammlung, inbound-mail-set, falls es keine bestehende aktive gibt. Falls es eine gibt, nutze diese, da es nur eine aktive Regel-Sammlung geben kann
-
Erstelle eine Empfangsregel in der inbound-mail-set Empfangsregel-Sammlung
a. Setze die Empfängerbedingung auf your.domain
b. Füge eine Aktion hinzu, um an das SNS-Thema incoming-sns-topic zu veröffentlichen, mit Base64-Kodierung -
Erstelle einen API-Schlüssel in deiner Discourse-Instanz für den Benutzer system und gewähre die receive email-Aktion auf der email-Ressource
-
Erstelle ein Geheimnis in Secret Manager, email-handler-secret, mit den folgenden Schlüsseln und ihren jeweiligen Werten:
- api_endpoint - https://your.domain/admin/email/handle_mail
- api_key - aus Schritt 9
- api_username - system, es sei denn, du hast in Schritt 9 etwas anderes verwendet
-
Erstelle eine Lambda-Schicht, lambda-receiver-layer, für die python3.10-Laufzeitumgebung, die die Bibliotheken requests und aws-lambda-powertools enthält
-
Erstelle eine Lambda-Funktion, email-receiver-lambda, für die python3.10-Laufzeitumgebung mit dem Empfängercode:
# Copyright (c) 2023 Derek J. Lambert
#
# Es wird hiermit jeder Person, die eine Kopie dieses Softwareprodukts und der zugehörigen Dokumentationsdateien (die "Software") erhält, die Erlaubnis erteilt, kostenlos mit der Software umzugehen, einschließlich der Rechte zur Nutzung, Vervielfältigung, Änderung, Zusammenführung, Veröffentlichung, Verteilung, Unterlizenzierung und/oder des Verkaufs von Kopien der Software, sowie Personen, denen die Software zur Verfügung gestellt wird, dies zu tun, vorbehaltlich der folgenden Bedingungen:
#
# Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
#
# DIE SOFTWARE WIRD "WIE BEKAMMEN
