bublliodocs
Αρχιτεκτονική

Αποστολή email

Οι σημερινές διαδρομές αποστολής email, τα όριά τους και η κατεύθυνση εξέλιξής τους.

ΚλήσηΕφαρμογήΜεταφορές
Δοκιμή αυτοματοποίησης και χειροκίνητης αυτοματοποίησηςΣε αναμονή μέσω της βάσης δεδομένων, τότε Django send_mailGlobal backend, αυτή τη στιγμή κονσόλα
Endpoint δοκιμής λογαριασμού emailΤο organizations/services/email_service.py ανοίγει μια σύνδεση SMTPΟ λογαριασμός SMTP του επιλεγμένου οργανισμού
Το email ελέγχου ρυθμίσεων πρώτης εκτέλεσηςorganizations/services/email_service.py στέλνει ένα μήνυμαΜη αποθηκευμένες ρυθμίσεις SMTP που παρέχονται στη φόρμα ρύθμισης
Πρόσκληση χώρου εργασίαςΣε αναμονή, στη συνέχεια αποστέλλονται από έναν εργαζόμενοΕνεργός προκαθορισμένος λογαριασμός SMTP του οργανισμού πρόσκλησης
Πρόσκληση εγκατάστασης-adminΣε αναμονή, στη συνέχεια αποστέλλονται από έναν εργαζόμενοΥπολειπόμενος λογαριασμός εγκατάστασης SMTP
Επαναφορά κωδικού πρόσβασηςΣε αναμονή, στη συνέχεια αποστέλλονται από έναν εργαζόμενοΕγκατάσταση fallback SMTP λογαριασμό, ή το παγκόσμιο backend όταν κανένα δεν έχει ρυθμιστεί

Τα μηνύματα email λογαριασμού συναλλαγών χρησιμοποιούν μια επώνυμη διάταξη Bubllio για workspace και προσκλήσεις εγκατάστασης-admin, επαναρυθμίσεις κωδικού πρόσβασης και μηνύματα δοκιμών SMTP. Κάθε μήνυμα είναι multipart: responsive HTML για τους σύγχρονους πελάτες και ένα απλό κείμενο fallback για προσβασιμότητα και περιοριστικούς πελάτες.

Η επεξεργάσιμη πηγή είναι email_templates/src/transactional.mjml. Χτίστε το με:

cd email_templates
npm ci
npm run build

Η κατασκευή γράφει src/organizations/templates/emails/transactional.html. Δέστε τόσο την πηγή MJML και συντάχθηκε HTML. Η παραγωγή διαβάζει το μεταγλωττισμένο πρότυπο Django, έτσι ο κόμβος και η MJML δεν είναι εξαρτήσεις του χρόνου παραγωγής. Το CI ξαναχτίζει το πρότυπο και αποτυγχάνει όταν η δεσμευμένη HTML είναι ξεπερασμένη.

Η διαδρομή αυτοματοποίησης εκτυπώνει email στο τερματικό με ρυθμίσεις check-in. Αποθηκευμένοι ή μη αποθηκευμένοι λογαριασμοί SMTP επιχειρούν μια πραγματική αποστολή δικτύου. Οι δοκιμές χρησιμοποιούν χλευασμένα ή δοκιμαστικά όρια email.

Οι λογαριασμοί του οργανισμού SMTP υλοποιούνται

Οι ιδιοκτήτες και οι διαχειριστές διαχειρίζονται λογαριασμούς μέσω του API; εξουσιοδοτημένο προσωπικό μπορεί να χρησιμοποιήσει Django admin. Η πρώτη λειτουργία frontend μπορεί να δημιουργήσει έναν προαιρετικό λογαριασμό SMTP. Πριν ολοκληρωθεί η ρύθμιση, το frontend μπορεί να στείλει ένα πραγματικό email δοκιμής μέσω POST /api/v1/setup/smtp-test/ χρησιμοποιώντας μη αποθηκευμένες ρυθμίσεις και έναν παραλήπτη που παρέχεται από τον χειριστή. Η δοκιμή δεν επιμένουν διαπιστευτήρια ή switch emails automation σε SMTP. Μια επιτυχής απάντηση σημαίνει ότι ο εξυπηρετητής SMTP αποδέχτηκε το μήνυμα· η παράδοση πρέπει ακόμα να ελεγχθεί στα εισερχόμενα.

GET    /api/v1/organizations/<organization_id>/email-accounts/
POST   /api/v1/organizations/<organization_id>/email-accounts/
GET    /api/v1/organizations/<organization_id>/email-accounts/<account_id>/
PATCH  /api/v1/organizations/<organization_id>/email-accounts/<account_id>/
DELETE /api/v1/organizations/<organization_id>/email-accounts/<account_id>/
POST   /api/v1/organizations/<organization_id>/email-accounts/<account_id>/test/

Το σώμα δοκιμής είναι { "recipient": "person@example.com" }. Μια επιτυχημένη προσπάθεια καταγράφει last_tested_at και καθαρίζει last_test_error. Μια εξαίρεση αποστολής αποθηκεύεται ως μια περικομμένη συμβολοσειρά στο last_test_error· δεν είναι πλήρως αποστειρωμένη. Η άμεση απόκριση αποτυχίας HTTP είναι γενική και χρησιμοποιεί την κατάσταση 502. Αντιμετώπιση αποθηκευμένων διαγνωστικών ως δυνητικά ευαίσθητα. Τα πεδία κωδικού πρόσβασης γράφονται μόνο μέσω του API και κρυπτογραφούνται σε ηρεμία.

Ένας ιδιοκτήτης ή ο διαχειριστής μπορεί να θέσει σε αναμονή μια πρόσκληση workspace όταν είτε ένας ενεργός workspace προεπιλεγμένος SMTP λογαριασμός υπάρχει ή η εγκατάσταση fallback ρυθμιστεί κατά την πρώτη ρύθμιση υπάρχει. Ο χώρος εργασίας SMTP κερδίζει· το fallback χρησιμοποιείται μόνο όταν το workspace δεν έχει ενεργό προεπιλογή. Μια αποτυχία ουράς/βάσης δεδομένων γυρίζει πίσω την πρόσκληση.Μια μεταγενέστερη αποτυχία SMTP καταγράφεται στο εξωτερικό κουτί και επαναπροσλαμβάνεται. Ο σύνδεσμος πρόσκλησης χρησιμοποιεί BUBLLIO_APP_URL, το οποίο πρέπει να οριστεί στη δημόσια προέλευση frontend σε εφαρμογές.

Παραλαβή και ανάκτηση του ιστορικού

Συναλλακτικά μηνύματα email και αυτοματοποίηση τρέχει χρήση Celery με RabbitMQ. PostgreSQL αποθηκεύει την έγκυρη γραμμή outbox; RabbitMQ φέρει μόνο UUID του. Τα ενδεικτικά πρόσκλησης κρυπτογραφούνται στο εξωτερικό κουτί και αφαιρούνται μετά από επιτυχή χειρισμό. Οι workers δοκιμάζουν ξανά αποτυχίες με αυξανόμενες καθυστερήσεις μέχρι έξι προσπάθειες. Το Celery Beat αναδημοσιεύει τις οφειλόμενες σειρές και ανακτά θέσεις εργασίας των οποίων η κλειδαριά των εργαζομένων έγινε παρωχημένη.

Η παράδοση είναι τουλάχιστον μία φορά: ένας worker μπορεί να τελειώσει μια εξωτερική αποστολή και συντριβή πριν τη σήμανση πλήρης, έτσι ώστε ένα σπάνιο αντίγραφο email είναι δυνατόν. Επανατοποθετούνται, γίνονται δεκτά, ή λήγουν προσκλήσεις ελέγχονται και πάλι πριν από την αποστολή. Τα πλήκτρα δοκιμής SMTP παραμένουν συγχρονισμένα έτσι ώστε ο χειριστής να λαμβάνει ένα άμεσο αποτέλεσμα συνδεσιμότητας.

Ο διαχειριστής εγκατάστασης μπορεί να προβάλει ή να αντικαταστήσει τον εφεδρικό λογαριασμό από τις ρυθμίσεις λογαριασμού στην εφαρμογή React. Αυτό χρησιμοποιεί /api/v1/organizations/installation-settings/ και περιορίζεται σε ενεργούς Django υπερχρήστες. Ποτέ δεν επιστρέφει τον αποθηκευμένο κωδικό πρόσβασης. Η αποθήκευση ενός νέου κωδικού πρόσβασης το κρυπτογραφεί εκ νέου με το πρωτεύον κλειδί στο BUBLLIO_EMAIL_ENCRYPTION_KEYS.

Για κανονική εγκατάσταση παραγωγής, εισάγετε SMTP μία φορά στην πρώτη εγκατάσταση. Η ανάπτυξη συνθέτει τα αρχεία δεν απαιτούν διπλές τιμές DJANGO_EMAIL_*. Το παγκόσμιο email Django του backend παραμένει ένα προηγμένο fallback μόνο όταν δεν είναι διαθέσιμος αποθηκευμένος λογαριασμός εγκατάστασης.Οι χειριστές που τον χρειάζονται μπορούν να περάσουν αυτές τις ρυθμίσεις μέσω μιας συγκεκριμένης εγκατάστασης συνθέτουν παράκαμψη.

Ορισμός BUBLLIO_EMAIL_ENCRYPTION_KEYS πριν από την αποθήκευση κωδικών πρόσβασης. Δημιουργία ενός κλειδιού Fernet:

uv run python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

Κρατήστε το σε ένα μυστικό διαχειριστή ή αγνοείται .env. BUBLLIO_EMAIL_ENCRYPTION_KEY εξακολουθεί να υποστηρίζεται για τις υπάρχουσες εγκαταστάσεις ενός κλειδιού, αλλά νέες εφαρμογές θα πρέπει να χρησιμοποιούν τον πληθυντικό ορισμό.

Για να περιστρέψετε ένα κλειδί χωρίς να χάσετε αποθηκευμένα διαπιστευτήρια:

  1. Δημιουργία νέου κλειδιού.
  2. Ορισμός BUBLLIO_EMAIL_ENCRYPTION_KEYS=new-key,previous-key· το πρώτο κλειδί είναι πάντα χρησιμοποιείται για νέα κρυπτογράφηση και τα υπόλοιπα κλειδιά είναι αποκρυπτογραφημένα μόνο fallbacks.
  3. Κάνε πίσω στη βάση δεδομένων και τρέξε. uv run python src/manage.py rotate_email_encryption.
  4. Επαλήθευση μιας σύνδεσης SMTP, στη συνέχεια αλλαγή της ρύθμισης για να περιέχει μόνο τη νέα Κλειδί.

Η εντολή περιστροφής κλειδώνει τις καθορισμένες σειρές και χρησιμοποιεί μία συναλλαγή βάσης δεδομένων. Αν κάποια τιμή δεν μπορεί να αποκρυπτογραφηθεί, όλη η λειτουργία γυρίζει πίσω. Η απώλεια κάθε κλειδιού που μπορεί να αποκρυπτογραφήσει μια υπάρχουσα τιμή δεν είναι ανακτήσιμη. Ποτέ μην βάζετε κωδικούς πρόσβασης ή κλειδιά κρυπτογράφησης στον έλεγχο έκδοσης.

Επόμενη ενσωμάτωση: Επαναχρησιμοποίηση Django SMTP αποστολής

Προγραμματισμένο, δεν υλοποιήθηκε: αφήστε το send_email να επιλέξει έναν εξουσιοδοτημένο λογαριασμό που ανήκει στην οργάνωση του automation και να επαναχρησιμοποιήσει μια υπηρεσία αποστολής οργανισμού-ενημέρωσης. Καθορίστε την επιλογή λογαριασμού, την ανενεργή συμπεριφορά λογαριασμού και τη συμπεριφορά όταν δεν υπάρχει διαθέσιμος λογαριασμός. Η σήμανση ενός λογαριασμού is_default σήμερα δεν το συνδέει με αποστολή automation.

Αυτό μπορεί να χρησιμοποιήσει την υποστήριξη Django email backend και το υπάρχον κρυπτογραφημένο μοντέλο λογαριασμού. Δεν απαιτείται πρόσθετο πλαίσιο ή υπηρεσία παροχής υπηρεσιών. Οι ορισμοί πρέπει να αναφέρουν τα ID του λογαριασμού αναφοράς, να μην αντιγράφουν ποτέ τους κωδικούς πρόσβασης στη δράση JSON ή τα ωφέλιμο φορτίο.

Επιπλέον προσαρμογείς παρόχου είναι μια πιθανή μεταγενέστερη επέκταση. Προς το παρόν δεν υπάρχει γενική διεπαφή email_sender, ενσωμάτωση SDK του παρόχου, ή ρύθμιση επιλογής BUBLLIO_EMAIL_PROVIDER. Οι παλαιότερες προτάσεις φάσης αντικαθίστανται από αυτή την περιγραφή και την ροή εργασίας roadmap.