Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

🚀 Takeoff Mailer
A high-performance, resilient email consumer built in Rust to handle transactional email delivery for the TAKEOFF event.
This service implements a decoupled, event-driven architecture using RabbitMQ for reliable message delivery and Protobuf for strict schema enforcement.
🏗 System Architecture
The mailer is designed with a "Reliability First" philosophy to ensure no attendee ever misses a QR code or confirmation.
* Asynchronous Processing: Offloads email sending from the main API to a dedicated Rust worker.
* Protocol Buffers: Uses email.proto to ensure data integrity between the Node.js producer and Rust consumer.
* DLX (Dead Letter Exchange): Features an automated "Hospital" queue (email_failed_queue) for messages that fail after maximum retries or fail decoding.
🛠 Tech Stack
* Language: Rust (Tokio runtime)
* Broker: RabbitMQ (via lapin)
* Serialization: Google Protocol Buffers (prost)
* Monitoring: Datadog (Metrics/Traces) & Dozzle (Logs)
* Deployment: Docker / VPS
🚦 Getting Started
Prerequisites
* Rust 1.75+
* protoc (Protobuf Compiler)
* Docker & Docker Compose
Environment Variables
Create a .env file in the root directory:
AMQP_ADDR=amqp://guest:guest@localhost:5672/%2f
SMTP_RELAY=smtp.example.com
SMTP_USER=user@example.com
SMTP_PASS=password
RUST_LOG=info

Running Locally
* Start RabbitMQ:
docker compose up -d rabbitmq

* Run the Worker:
cargo run

🏥 Fault Tolerance & Recovery
This repo includes a built-in recovery "stitch" for handling failures:
The Dead Letter Pattern
If a message fails delivery 3 times, it is automatically routed to the email_failed_queue. This prevents "Poison Pill" messages from clogging the main pipeline.

📊 Observability
This service is fully instrumented for production visibility:
* Health Checks: Integrated with Docker health checks.
* Unified Tagging: Tags every log and metric with env:takeoff-prod and service:email-worker.
* Dashboard: Real-time throughput and error rates are monitored via Datadog.
📜 License
Distributed under the MIT License. See LICENSE for more information.
28 changes: 23 additions & 5 deletions src/template/registration_successful.html
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@
font-family: unset;
"
>
Date: February 28th, 2026
Date: March 21st, 2026
</li>
<li
style="
Expand Down Expand Up @@ -279,7 +279,7 @@
<ol style="margin-top: 0px">
<li>
Save the date and add it to your calendar (<a
href="https://calendar.google.com/calendar/event?action=TEMPLATE&amp;tmeid=NGQ5Y3M3YTdqaGR2YzF0OG10bzJtNTFra2ogb3BlbnNvdXJjZW5lc3RAbQ&amp;tmsrc=opensourcenest%40gmail.com"
href="https://calendar.google.com/calendar/event?action=TEMPLATE&amp;tmeid=MDgxZ2FhNm52bmRxdmxvdmk2cGg4MHNvNmogb3BlbnNvdXJjZW5lc3RAbQ&amp;tmsrc=opensourcenest%40gmail.com"
style="
color: #067df7;
text-decoration-line: none;
Expand All @@ -289,8 +289,26 @@
>)
</li>
<li>
Follow us on X (@OpenSourceNest) and Linkedin
for real-time updates, speaker announcements,
Follow us on<!-- -->
<a
href="https://x.com/OpenSourceNest"
style="
color: #067df7;
text-decoration-line: none;
"
target="_blank"
>X (@OpenSourceNest)</a
>
<!-- -->and<!-- -->
<a
href="https://www.linkedin.com/company/open-source-nest/"
style="
color: #067df7;
text-decoration-line: none;
"
target="_blank"
>Linkedin<!-- --> </a
>for real-time updates, speaker announcements,
and prep resources.
</li>
<li>
Expand Down Expand Up @@ -346,7 +364,7 @@
</tr>
</tbody>
</table>

<br />
<p
style="
font-size: 1.2rem;
Expand Down