# E-Mail Gateway
###### tags: `abandon`
Organizasyon ihtiyaç duyduğu mail gönderimini sağlayan mikro servis kümesidir.
## Temel Hedefler
* Hizmetini RestAPI olarak sunması.
* Bağımsız veritabanı ve loglama yapısına sahip olması.
* Hem tekil hem toplu halde mail gönderme yetenegine sahip olması.
* Mail açılma takibi yapabilmesi.
* Kampanyalar için mail gönderim izini hem bankamızdan hem İYS üzerinden kontrol edebilmesi.
## Teknoloji
* .Net Core Service Application
* Templating Engine : FW Templşating Engine + https://github.com/lunet-io/scriban
* Tanımlar ve talepler için veri tabanı olarak SQL Server kullanılır.
* LOG kayıtları için ELK kullanılır.
## Dağıtım Listeleri Tanımları
Kulanıcıya gönderilecek tüm epostalar bir dağıtım listesi üzerinden gönderilir. Dağıtım listelerine ilgili mail templateler bağlanır. Dağıtım listesine sadece veri ile kayıt açılarak mail gönderimi sağlanır.
**deliver-method** dağıtım listesine bir e-posta gönderlerinin hemen mi (solo) yoksa *frequency* süresi kadar toplanıp birleştirilerek mi (digest) gönderileceğini belirler.
**frequency** CRON formatında mail gönderim frekans tanımıdır. Boş geçilmesi durumunda her zaman delivery method solodur.
**body-template** eğer dağıtım solo ise master içine her bir mail için oluşturulur. Eğer gönderim digest ise o zaman body tempalate repeater içerisinde her bir mail gönderim kaydı için çalışır.
**type** alanı içeriği tanımlar.
- Eğer içerik bir pazarlama kampanyası ise **campaign** seçilir. Örneğik kredi kampanyası, kişiye özel kredi limit bilgisi, özel dönem kampanya mailleri gibi. Bu tip mail gönderiminde iletişim izni kontrolü sağlanır.
- Eğer içerik kişiye özel bir bilgilendirme ise **private-info** seçilir. Örneğin ektreler, hesap kesim bilgisi, fatura ödeme bilgisi gibi içerikler bu sınıfta değerlendirilebilir.
- Eğer içerik genel bir bilgilendirme ise **public-info** seçilir. Örneğin şube açılışı, banka iletişim bilgisi değişimi gibi içerikler bu sınıfta değerlendirilebilir.
- Eğer içerik yasal bir bilgilendirme ise **legal** seçilir. Örneğin BDDK bilgilendirmeleri, vergi değişim bildirimi gibi içerikler bu sınıfta değerlendirilebilir.
- Eğer içerik güvenlik doğrulaması ise **OTP** seçilir. Örneğin internet bankacılığı girişi bu sınıfta değerlendirilebilir
```json
{
"name": "debit-card-periodic-transaction-mail-distribution-list",
"deliver-method": "digest | solo",
"frequency ": "0 10 * * 1-5",
"to": "{{user.primary-email}}",
"cc": "{{user.emails | array.map 'email' }}",
"bcc": "",
"master-template": "debit-card-periodic-transaction-mail-master-digest",
"subject-template": "debit-card-periodic-transaction-mail-subject-digest",
"body-template": "debit-card-periodic-transaction-mail-content-body",
"type": "private-info",
"attachments": [
{
"render": "pdf",
"file-name":"list.pdf",
"template": "debit-card-periodic-transaction-list-html"
},
{
"render": "html",
"file-name":"gdpr.html",
"template": "gdpr-info-html"
}
]
}
```
#### E-Posta Gönderim Kaydı
Her bir dağıtım listesinde yapılan her gönderimin kaydı tutulur. Her bir gönderim kaydında göderiö detayları bulunur.
**status-info** içerisinde gönderimle ilgili aksiyonlar ve zamanlar bulunur.
Olası aksiyonlar;
- "request": Gönderim talebilinin yapılması
- "send": Gönderimin yapılması
- "load": İçeriğin kullanıcı ekranına yüklenmesi (pixel tetilşemesi)
- "not-delivered": Gönderim başarısız olması
- "read-by-click": İçerik içerisinde bir linke tıklanması durumunda tıklandığı zaman (link relay)
```json
{
"to": "ugkaratas@gmail.com",
"cc": "ukaratas@rocketmail.com, ukaratas@burgan.com.tr",
"bcc": "",
"distribution-list": "debit-card-periodic-transaction-mail-distribution-list",
"status-info": [
{
"action": "request",
"times-tamp": "2019-11-22T13:20:00"
},
{
"action": "send",
"times-tamp": "2019-11-22T13:20:00"
},
{
"action": "loaded",
"times-tamp": "2019-11-22T13:20:00"
},
{
"action": "read-by-client",
"times-tamp": "2019-11-22T13:20:00"
}
],
"subject": "Savgili Ugur",
"body": "<html>Savgili Ugur</html>",
"attachments": [
{
"id": "d9a4bbc4-cca6-443e-b490-e48fc983f586",
"file-name": "gdpr",
"type": "pdf | html"
}
]
}
```
## Gönderim Talebi
Gönderim talebi sadece *render* amaçlı veri kümesini taşır.
**render-data** templating için kullanıcak verileri taşır. Free format JSON olarak gönderilir.
**source-data** sadece raporlama amaclı loglama icin kullanilir. Free format JSON olarak gonderilebilir.
```json
{
"distribution-list": "debit-card-periodic-transaction-mail-distribution-list",
"render-data": {
"user": {
"primary-email": "ukaratas@rocketmail.com",
"emails": [
{
"email": "ukaratas@burgan.com.tr",
"is-validated-by-customer": true,
"is-validated-by-link": true
},
{
"email": "ukaratas@hotmail.com",
"is-validated-by-customer": true,
"is-validated-by-link": false
}
]
},
"transaction": {...}
},
"render-data-to-log": {...}
"source-data": {
"Application": "Pusula",
"Method": "Debit Card Transaction"
}
}
```
## Tanım Servisleri
### GET : /email/definition/{page-index}/{page-size}
Servisi ile sorgulanan tüm dağıtım listelerine erişilir.
#### Query Parameter
```
"name": "debit-card-periodic-transaction%"
```
**name** parametresinde SQL Like benzeri parçalı arama yapılabilir.
### POST: /email/definition/
Servisi ile var olan bir kaydı güncelleyebilir veya yeni bir kayıt oluşturulabilir. Distribution list kaydı body olarak post edilir.
## Gönderim Servisleri
### POST: /email/send/
Servisi ile var olan bir e-posta gönderimi yapılır. Post parametresi array kabulu yaptığı için toplu gönderim talepleride bu servis üzerinden yapılır.
:::info
:bulb: Gönderim öncesinde İYS kontrolü yapılmalıdır.
*İYS kontrolünde önce İYS kontrol edilir ve banka veri tabanı İYS verisi ile güncellenir.*
:::
### POST: /email/query/{distribution-list}/{page-index}/{page-size}
Servisi ile gönderilen tüm e-posta kayıtlarına erişilir. Kayıtlar SQL Server üzerinde tutulur.
```JSON
{
"query": {
"match": {
"source-data.customerCN": "38552069008"
}
}
}
```
## Destek Servisleri
### Get: /email/pixel/{id}
Servisi ile pixel kodu tetiklenir. Id olarak mail icin oluşturulmuş tekil id verilir.
### Get: /email/redirect/{id}/{url}
Servisi ile link yonlendirmesi yapilir. Id olarak mail icin oluşturulmuş tekil id verilir. Mail olusturulurken icinde oluşan tüm linkler replace edilerek bu servis üzerinden yönlendirme yapılır.