E-posta ve bildirim
E-posta
Ayarlar
AACP → Sistem → Sistem Ayarları → E-posta (yetki: system.settings.manage) altında SMTP tanımlanır:
| Ayar | Varsayılan |
|---|---|
mail.enabled |
kapalı (yapılandırmadan e-posta gönderilmez) |
mail.smtp_host / mail.smtp_port |
boş / 587 |
mail.smtp_encryption |
tls |
mail.smtp_user / mail.smtp_password |
boş (parola şifreli saklanır) |
mail.from_email / mail.from_name |
boş |
Ayarların yanında bir test e-postası gönderme düğmesi vardır.
Gönderim: kuyrukla
CpMailerService::sendHtml() e-postayı gönderim kuyruğuna koyar; HTTP isteği SMTP sunucusunu beklemez. Gerçek teslimat arka planda (Messenger işçisi) yapılır. Test e-postası ve işçi işleyicileri ise anında gönderir (sendNow).
$log = $mailer->sendHtml('kullanici@example.com', 'Konu', '<p>Merhaba</p>', 'Merhaba');
Hizmeti kullanmadan önce canSend() ile sistemin gönderime hazır olup olmadığına bakın (mail.enabled kapalıysa yapılandırma eksiktir).
Günlük ve yeniden gönderim
Her giden e-posta denemesi cp_mail_logs tablosuna yazılır (alıcı, konu, durum, hata). AACP'deki e-posta günlüğünden başarısız bir e-posta yeniden gönderilebilir (resend). Günlükler mail.log_retention_days (90 gün) sonra temizlenir.
E-posta şablonları
Sistemin gönderdiği e-postaların metni kod içinde sabit değildir; AACP → Sistem → E-posta şablonları ekranından düzenlenir. Şablonlar:
- Dile göre ayrıdır: her şablonun her dil için konusu, HTML gövdesi ve düz metin karşılığı olabilir.
- Açılıp kapatılabilir.
- Sıfırlanabilir: bir şablonun satırı silinince yeniden gönderilen sürüm kodla gelen varsayılana döner (çeviri anahtarları sonsuza dek yedek olarak kalır).
Çekirdeğin gönderdiği e-postalar: hesap doğrulama, hoş geldin, yönetici onayı bekleniyor, onaylandı, kimlik değişikliği başvurusu ve sonucu, ve iki bildirim zarfı.
Yer tutucular
Gövdede ICU yer tutucuları ({name}) ve [tür:özellik] token'ları ([site:name], [user:mail]) kullanılabilir. Her şablon tanımı, gönderen kodun hangi yer tutucuları geçtiğini söyler; ekran bunları listeler.
E-posta HTML'i site HTML'i değildir: tablo ve satır içi stil ister, ki bunlar zengin metin temizleyicisinin sildiği şeylerdir. Şablon düzenleme yeteneği zaten SMTP sunucusunu değiştirme yetkisiyle aynı seviyededir (system.settings.manage), bu yüzden burada temizleme yapılmaz.
Modül kendi şablonlarını ekler
Modülün e-postalarını AACP'ye tanıtmak için MailTemplateProviderInterface uygulanır; etiketlendiği için çekirdek modülün adını bilmek zorunda kalmaz:
final class ShopMailTemplates implements MailTemplateProviderInterface
{
public function mailTemplates(): array
{
return [new MailTemplateDefinition(key: 'shop.order_paid', labelKey: 'shop.mail.order_paid', /* varsayılan çeviri anahtarları, yer tutucular */)];
}
}
Bildirimler
Bildirim, bir kullanıcıya bir olayı haber verme sistemidir (yorum geldi, içerik onaylandı gibi). Tek giriş noktası NotificationDispatcher::dispatch():
$dispatcher->dispatch('blog.comment.reply', $recipient, ['title' => $post->getTitle()], actor: $author);
Kurallar:
- Uygulama içi bildirim isteğin içinde yazılır, çünkü rozetin hemen güncellenmesi gerekir.
- E-posta her zaman kuyruğa konur, bildirim gönderimi SMTP beklemez.
Bildirim türleri
Her tür bir olay anahtarı (eventKey), etiket anahtarı ve sahip modül taşır. Çekirdek türleri tanıtır; modüller contributions.yaml ile kendi türlerini ekler. Kullanıcı hesap ayarlarında hangi türleri açık/kapalı yapacağını görür.
Kanallar
| Kanal | Davranış |
|---|---|
| Uygulama içi | Kullanıcının bildirim kutusuna yazılır |
| E-posta (anında) | Olay olunca kuyruktan |
| E-posta (özet) | Günlük ya da haftalık özet olarak toplanır |
Özet e-postalar NotificationDigestTask görevi ile üretilir. Kanal arayüzü (NotificationChannelInterface) ile yeni kanal (ör. SMS, Slack) eklenebilir; arayüzü uygulayan sınıf services.yaml ile etiketlenir.
Kullanıcı tercihleri
NotificationPreferenceResolver, olay × kullanıcı tercih matrisinden hangi kanalların çalışacağına karar verir. Kullanıcı bildirim e-postalarını açıp kapatabilir (notif_mail_enabled) ve modu seçer: anında, günlük ya da haftalık.
| Ayar | Varsayılan |
|---|---|
notification.enabled |
açık |
notification.digest.enabled |
açık |
Hesap alanı
Bildirim tercihleri, hesap sayfasına bir hesap profil uzantısı (NotificationPreferenceExtension) olarak eklenir. Başka modüller de aynı kalıpla (AccountProfileExtensionInterface) hesap sayfasına kendi bölümlerini ekleyebilir.