src/cluster_erp/modules/mail/ içindeki mail modülü, kullanıcının dış bir mail hesabını bağlamasına ve ürün içinde mail okuyup yazmasına izin verir. Bağlı hesapları, mesajların ve eklerin yerel önbelleğini, yöneticinin tanımladığı mail alan adlarını ve OAuth ile oturum açan sağlayıcılar için OAuth uygulamalarını tutar. Ayrıca diğer her modülün sistem e-postası göndermek için kullandığı SendTransactionalEmail sözleşmesini yanıtlar. Bu sayfa taşıma ve oturum açmayı yalnızca mekanizma düzeyinde anlatır.
Bir bakışta¶
| Öğe | Değer | Kaynak |
|---|---|---|
| Paket | src/cluster_erp/modules/mail/ |
klasör |
| Modül sınıfı | Module |
src/cluster_erp/modules/mail/module.py:18 |
name / version |
mail / 0.1.0 |
src/cluster_erp/modules/mail/module.py:19-25 |
| API öneki | /api/v1/mail (ModuleBase.api_prefix), require_app("mail") uygulama kapısıyla |
src/cluster_erp/core/module_base.py:37-38, src/cluster_erp/modules/mail/module.py:34-45 |
| Alt modüller | 4: accounts, domains, messages, providers; ayrıca transport.py, oauth.py, imap_verify.py, crypto.py, privacy_handlers.py |
klasör listesi |
| Tablolar | 5: mail_domains, mail_provider_configs, mail_accounts, mail_messages, mail_attachments |
dört models.py dosyasındaki __tablename__ |
| Metadata'daki varlıklar | entities içinde 3 anahtar |
src/cluster_erp/modules/mail/module.py:143-147 |
| Uçlar | Pakette 28 uç dekoratörü | @...router.get/post/put/patch/delete için grep |
| Aksiyonlar | 0 ActionMeta girdisi |
pakette grep "ActionMeta(" |
| Göçler | 4 dosya | metni beş tablo adından birini içeren migrations/versions/ dosyaları |
| Sözleşmeler | 3 tüketir, 0 üretir | "Olaylar ve sorgular" bölümüne bakın |
| Web uygulamasında varlık | Kendi ekranı olan sistem katalog uygulaması mail; Ayarlar altında mail ayarları |
src/cluster_erp/modules/app_store/catalog.json (mail girdisi), webapp/js/mail.js, webapp/js/mail-settings.js |
| Masaüstünde varlık | yalnızca genel bileşenler | src/cluster_erp/desktop/modules/ içinde mail klasörü yok |
Modül ne yapar¶
- Oturum açan kullanıcı için
google,microsoftveyaimaptüründe bir mail hesabı bağlar. Google ve Microsoft hesapları OAuth yetkilendirme kodu akışıyla bağlanır; IMAP hesapları bir adres ve uygulama parolasıyla bağlanır ve hesap kaydedilmeden önce gerçek bir oturum açmayla doğrulanır (src/cluster_erp/modules/mail/oauth.py:1-15,src/cluster_erp/modules/mail/imap_verify.py:1-8). - Bir hesabın gelen kutusunu yerel bir önbelleğe eşitler ve ekleri depoda tutar (
src/cluster_erp/modules/mail/messages/sync.py:1-3,src/cluster_erp/modules/mail/messages/sync.py:126-203). - Mail gönderir, taslakları eklerle saklar, mesajları okundu işaretler, çöp kutusuna taşır ve konuları gösterir (
src/cluster_erp/modules/mail/messages/routes.py:43-252). - Yöneticinin sunucu koordinatlarıyla mail alan adları tanımlamasına ve sağlayıcı başına OAuth uygulamaları kaydetmesine izin verir (
src/cluster_erp/modules/mail/domains/models.py:9-30,src/cluster_erp/modules/mail/providers/models.py:9-35). - Diğer modüller için platform SMTP ayarları üzerinden sistem e-postası gönderir (
src/cluster_erp/modules/mail/module.py:72-103).
Alt modüller¶
| Alt modül | Amaç | Ana varlıklar | Yönlendirici | Kaynak |
|---|---|---|---|---|
accounts |
Bağlı hesaplar, OAuth başlatma ve geri dönüş, IMAP bağlantısı | MailAccount |
/accounts |
src/cluster_erp/modules/mail/accounts/routes.py:30 |
domains |
Yöneticinin tanımladığı mail alan adları | MailDomain |
/domains |
src/cluster_erp/modules/mail/domains/routes.py:21 |
messages |
Önbellekteki mesajlar, taslaklar, ekler, eşitleme, gönderim | MailMessage, MailAttachment |
/messages |
src/cluster_erp/modules/mail/messages/routes.py:33 |
providers |
Sağlayıcı başına OAuth uygulamaları | MailProviderConfig |
/oauth-apps |
src/cluster_erp/modules/mail/providers/routes.py:27 |
Veri modeli¶
| Varlık | Tablo | Ana alanlar | Notlar | Kaynak |
|---|---|---|---|---|
MailDomain |
mail_domains |
name, kind, imap_host, imap_port, smtp_host, smtp_port, use_tls, is_active |
kind değeri google, microsoft veya imap |
src/cluster_erp/modules/mail/domains/models.py:9-30, src/cluster_erp/modules/mail/domains/schemas.py:11 |
MailProviderConfig |
mail_provider_configs |
provider, client_id, client_secret_enc, tenant, enabled |
sağlayıcı başına bir satır; gizli değer şifreli saklanır ve hiç döndürülmez | src/cluster_erp/modules/mail/providers/models.py:9-35 |
MailAccount |
mail_accounts |
user_id, provider, email_address, display_name, domain_id, sunucu koordinatları, şifreli belirteç ve parola sütunları, status, status_detail, last_sync_at |
bir kullanıcı birden çok hesap bağlayabilir | src/cluster_erp/modules/mail/accounts/models.py:13-55 |
MailMessage |
mail_messages |
account_id, folder, provider_message_id, thread_id, gönderen, alıcılar, subject, snippet, body_text, body_html, sent_at, is_read, has_attachments, konu başlıkları |
hesap ve sağlayıcı mesaj kimliğiyle anahtarlanan yerel ayna | src/cluster_erp/modules/mail/messages/models.py:13-57 |
MailAttachment |
mail_attachments |
message_id, filename, mime_type, size_bytes, provider_ref, storage_key, is_inline, content_id |
metadata; baytlar sağlayıcıdan alınır veya depoda tutulur | src/cluster_erp/modules/mail/messages/models.py:60-81 |
Sağlayıcı gizli değerleri, OAuth belirteçleri ve IMAP uygulama parolaları, bir sunucu ayarından anahtarlanan geri çözülebilir bir şifreyle saklanır ve yalnızca sağlayıcıyla konuşmak için çözülür (src/cluster_erp/modules/mail/crypto.py:1-49, src/cluster_erp/modules/mail/transport.py:1-12). Ayarlar ayarlar başvurusunda listelenir; gizli değer saklama ikinci faktör ve gizli değer saklama sayfasında anlatılır.
Hesap, sağlayıcı ve mesaj yolu¶
flowchart TD A["yönetici: sağlayıcı başına MailProviderConfig"] --> B["POST /accounts/oauth/provider/start"] D["yönetici: sunucu koordinatlı MailDomain"] --> I["POST /accounts/imap"] B --> C["sağlayıcı onayı, POST /accounts/oauth/callback"] C --> ACC["MailAccount: google veya microsoft"] I --> V["verify_imap_login"] V --> ACC2["MailAccount: imap"] ACC --> S["MailSyncService.sync_account"] ACC2 --> S S --> T["transport.fetch_inbox"] T --> M["MailMessage ve MailAttachment önbelleği"] M --> SEND["transport.send_message ile MailSyncService.send"]
Düz anlatımla:
- Yönetici bir sağlayıcının OAuth uygulamasını
/oauth-appsaltında kaydeder ve/domainsaltında mail alan adları tanımlayabilir (src/cluster_erp/modules/mail/providers/routes.py:27-66,src/cluster_erp/modules/mail/domains/routes.py:21-86). - Google veya Microsoft için kullanıcı akışı başlatır, sağlayıcıda onay verir ve geri dönüş ucuna döner. İmzalı, kısa ömürlü bir durum değeri akışı kullanıcıya ve sağlayıcıya bağlar. Ürün belirteçleri alır, kullanıcının sağlayıcı parolasını hiçbir zaman görmez (
src/cluster_erp/modules/mail/oauth.py:1-15,src/cluster_erp/modules/mail/accounts/routes.py:66-164). - IMAP için kullanıcı adresi ve bir uygulama parolasını gönderir; modül kaydetmeden önce gerçek bir oturum açma yapar (
src/cluster_erp/modules/mail/accounts/routes.py:166-183,src/cluster_erp/modules/mail/accounts/services.py:83-160). POST /messages/sync, gelen kutusunu sağlayıcı taşıması üzerinden alır ve önbelleğe ekler ya da günceller. Taşıma hatası hesap durumunu ayrıntıyla birlikteerroryapar; başarıconnectedvelast_sync_atdeğerlerini yazar (src/cluster_erp/modules/mail/messages/sync.py:126-203).- Süresi dolan erişim belirteçleri saklanan yenileme belirteciyle yenilenir ve şifreli olarak geri yazılır (
src/cluster_erp/modules/mail/messages/sync.py:83-124). - Gönderim bir mesaj kurar ve onu sağlayıcı taşımasına verir: IMAP hesapları SMTP ile, Google ve Microsoft kendi mail API'leriyle gönderir (
src/cluster_erp/modules/mail/transport.py:1-12,src/cluster_erp/modules/mail/messages/sync.py:205-286).
Ekranlar ve metadata¶
get_metadata, tek bir ayar bölümü olan Mail Ayarları ile bir Mail kenar çubuğu grubu tanımlar; bölümün tek sekmesi mail_domain olur (src/cluster_erp/modules/mail/module.py:119-142). Üç varlık mail_domain, mail_account ve mail_message şeklindedir (src/cluster_erp/modules/mail/module.py:143-147). Mail uygulaması ekranı web uygulamasının özel bir ekranıdır; bkz. mail ve profil ekranları.
Durum ve aksiyonlar¶
Modül hiçbir ActionMeta tanımlamaz. Hesap status (varsayılan connected) ve status_detail taşır (src/cluster_erp/modules/mail/accounts/models.py:48-49). Mesaj bir folder içinde durur, varsayılan inbox; taslaklar drafts, çöp kutusu trash kullanır (src/cluster_erp/modules/mail/messages/models.py:22, src/cluster_erp/modules/mail/messages/sync.py:331-348, src/cluster_erp/modules/mail/messages/sync.py:470-488).
İş kuralları¶
- Her mesaj ve hesap okuması oturum açan kullanıcıyla sınırlıdır (
src/cluster_erp/modules/mail/messages/sync.py:52-81,src/cluster_erp/modules/mail/accounts/services.py:169-184). - Taslağı atmak, taslakta ve eklerinde
deleted_at,deleted_byvedraft_discardednedenini doldurur (src/cluster_erp/modules/mail/messages/sync.py:331-347). - Çöpe atma, mesajı sağlayıcının çöp kutusuna ve yerel
trashklasörüne taşır (src/cluster_erp/modules/mail/messages/sync.py:470-488). - Hesabın bağlantısını kesmek, alan adı silmek veya OAuth uygulaması silmek
deleted_atalanını doldurur (src/cluster_erp/modules/mail/accounts/services.py:185-191,src/cluster_erp/modules/mail/domains/services.py:55-61,src/cluster_erp/modules/mail/providers/services.py:79-87). - Sistem posta kutusu SMTP yapılandırılmamışsa
not_configured, alıcı yoksano_recipientnedeniylesent=Falsebildirir.sent=True, SMTP sunucusunun mesajı kabul ettiği anlamına gelir; teslim edildiği anlamına gelmez (src/cluster_erp/modules/mail/module.py:72-103).
Olaylar ve sorgular¶
Modül 3 sözleşme tüketir ve hiç üretmez; sayım fleet modülü sayfasındaki gibi yapılmıştır. Tam liste sözleşmeler başvurusunda yer alır.
| Yön | Sözleşme sınıfı | İşleyici veya yayıcı | Kaynak |
|---|---|---|---|
| abone olur | SendTransactionalEmail |
_handle_transactional_email |
src/cluster_erp/modules/mail/module.py:47-53, src/cluster_erp/modules/mail/module.py:72-103 |
| abone olur | CollectSubjectData, AnonymiseSubject |
privacy_handlers.py |
src/cluster_erp/modules/mail/module.py:55-70 |
İntranet bildirim dağıtımı SendTransactionalEmail sözleşmesini çağıranlardan biridir (src/cluster_erp/modules/intranet/notify.py:91-99). Sistem postasının platform tarafı PDF ve sistem postası sayfasındadır.
İzinler¶
| İzin anahtarı | Kullanan | Kaynak |
|---|---|---|
mail_account.read, .connect, .delete |
hesaplar | src/cluster_erp/modules/mail/accounts/routes.py:33-200 |
mail_domain.read, .create, .update, .delete |
alan adları | src/cluster_erp/modules/mail/domains/routes.py:24-81 |
mail_provider.read, .update, .delete |
OAuth uygulamaları | src/cluster_erp/modules/mail/providers/routes.py:30-60 |
mail_message.read, .create, .update, .delete, .send, .sync |
mesajlar | src/cluster_erp/modules/mail/messages/routes.py:43-246 |
Gizlilik, saklama ve geçmiş¶
privacy_handlers.py, bir kişinin adreslerini taşıyan mesajları sayar. Anonimleştirme bir operatör kararıdır (include_correspondence); dahil edildiğinde kişinin adı ve adresi gönderen ve alıcı alanlarında, konu, özet ve gövdeler içinde değiştirilir (src/cluster_erp/modules/mail/privacy_handlers.py:1-11). Bkz. gizlilik ve ilgili kişi talepleri. Modülde retention_handlers.py yoktur. Değişiklikleri değişiklik geçmişi yakalar.
Analitik olgular¶
Bu modülde analytics_facts.py yoktur.
Ayarlar ve referans verileri¶
Mail alan adları ve OAuth uygulamaları, yöneticilerin tuttuğu modül referans verileridir (src/cluster_erp/modules/mail/domains/routes.py:21-86, src/cluster_erp/modules/mail/providers/routes.py:27-66). Gizli değerler hiç gösterilmez: GET /oauth-apps/ gizli değeri değil, gizli değerin girilip girilmediğini (has_secret) döndürür (src/cluster_erp/modules/mail/providers/models.py:9-16, src/cluster_erp/modules/mail/providers/schemas.py:6-15).
Testler¶
Ada göre (web-client/_e2e_mail*.mjs) ve tests/ içinde modules.mail için grep ile bulundu.
| Tür | Dosya | Kapsar |
|---|---|---|
| e2e | web-client/_e2e_mail.mjs, web-client/_e2e_mailapp.mjs |
mail ayarları ve mail uygulaması |
| e2e | web-client/_e2e_mail_drafts.mjs |
taslaklar ve ekler |
| pytest | tests/test_mail_transport.py |
sağlayıcı taşımasının ayrıştırma ve kurma işleri |
| pytest | tests/test_system_mail.py |
sistem posta kutusu |
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| mail account | MailAccount |
Bir kullanıcının ürüne bağladığı dış posta kutusu. | Mail hesabı | src/cluster_erp/modules/mail/accounts/models.py:13 |
| mail domain | MailDomain |
Sağlayıcı türü ve sunucu koordinatlarıyla yöneticinin tanımladığı alan adı. | Mail alan adı | src/cluster_erp/modules/mail/domains/models.py:9 |
| system mailbox | SendTransactionalEmail |
Uygulamanın kendi postası için kullandığı ve diğer modüllerin SendTransactionalEmail ile ulaştığı tek SMTP kimliği. |
sistem posta kutusu | src/cluster_erp/modules/mail/module.py:47-53 |
İlgili sayfalar¶
- Modüller dizini
- Mail ve profil ekranları
- PDF ve sistem postası
- İntranet bildirimleri ve tebligat
- Bu modülün API başvurusu
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.