---
# System prepended metadata

title: E-Mail Gateway
tags: [abandon]

---

# 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.