Amazon Simple Email Service (SES) Hakkında

Amazon web servisleri, biz programcıların hayatını kolaylaştıran pek çok servisi barındırıyor.
Servis listesi için buraya bakabilirsiniz. Bunlardan bizim işimize yarayacak olanları -en azından benim işime yarayacak olanları- sıralayacak olursam:
Ben bunlardan SES'i bayadır inceliyorum. Hani hepimize günlük olarak spam mailler gelir, işte şu kadar maili şu kadar liraya toplu olarak gönderiyoruz gibi. Hiç gerek yok.
Amazon SES bu sıkıntımızı gideren bir servis. Fiyatı da gönderim miktarı ile orantılı olarak değişiyor.
SES fiyat sayfasında da yazdığı gibi, 1000 mail 0.1$.
Kaba bir hesapla, 100.000 müşterinize ayda 2 defa mail gönderirseniz, aylık ödeyeceğiniz toplam ücret:
(100.000 x 2) / 1000 x 0.1 = 20$ ediyor. Oldukça makul.
SES'i kullanmanın diğer avantajları ise;
  • Sunucumuzun IP'sinin blackliste düşmesi gibi bir sıkıntı yaşamıyoruz,
  • Marketing işlemleri için kullanabiliyoruz, yani toplu mail gönderimi yapabiliyoruz,
  • Mailler yüksek oranda spame düşmeden iletiliyor,
  • Sunduğu API'ler sayesinde kullanımı son derece kolay,
  • .NET Framework email classları ile rahatlıkla mail gönderebiliyoruz,
Daha ne olsun. :)
Şimdi gelelim Amazon SES kurulumuna:
1. AWS (Amazon Web Services) hesabı açın (eğer bir hesabınız yoksa tabii)
2. AWS Management Console sayfasına gidin: 
3. Amazon Simple Email Service (SES) 'e tıklayın:
4. "Verify a New Sender" e tıklayın:
5. "Verify a New Email Address" butonuna tıklayın:
6. Eklediğiniz her mail adresi için size aşağıdaki gibi bir onay linki gönderilecektir. Mail hesaplarınıza teker teker giderek, gelen linke tıklayın ve mail hesabınızı onaylayın.
7. Mail adresinizi başarıyla onayladıktan sonra aşağıdaki sayfa ile karşılacaksınız.
8. Sıra domainimizi doğrulamada:

9. Şimdi hosting panelinize giderek yukarıda yazan bilgileri DNS editöründen domaininize tanımlayın. 
Bu noktada bir başkasından yardım almayı ya da hosting firmanıza danışmayı da tercih edebilirsiniz.
Domain doğrulamasının dışında bir de DKIM (DomainKeys Identified Mail) ayarı var. 
DKIM (DomainKeys Identified Mail) veya Türkçe karşılığı ile "Alan adı anahtarıyla e-posta kimlik doğrulaması"; phishing spoofing (sahtekarlık, kimlik hırsızlığı) gibi kötü niyetli maillerin ve email sahtekarlığının önüne geçmek için kullanılan domain adı ile emaili eşleştirme yöntemdir. Bu yöntemle kişi veya şirket emailin gerçekten kendisi tarafından gönderildiğini doğrulamaktadır.
Domain doğrulamada olduğu gibi size verilen 3 dns kayıt bilgisini aynı şekilde dns editöründe tanımlayabilirsiniz.
10. Eposta, domain (ve DKIM) doğrulamasından sonra SMTP ayarlarımızı almaya geldi sıra.
Şimdi de bir kullanıcı oluşturmak için "Create My SMTP Credientals" butonuna tıklayın.
Sonunda işlemimizi tamamladık.
Artık, elimizde SMTP server adresi, kullanıcı adı ve şifre var. Mail gönderirken SSL kullanıldığını da hatırlatmak isterim. 

E-Posta Gönderme Classı


namespace iTech
{
public class EPosta
{
    #region private
    string strFromAddress = "";
    string strFromName = "";
    string strServer = "";
    string strUser = "";
    string strPass = "";
    string strReplyTo = "";
    int portNo = 0;
    int ssl = 0;

    string konu;
    string mesaj;

    MailAddressCollection to;
    MailAddressCollection cc;
    MailAddressCollection bcc;
    #endregion

    #region public

    public string StrFromAddress
    {
        get { return strFromAddress; }
        set { strFromAddress = value; }
    }

    public string StrFromName
    {
        get { return strFromName; }
        set { strFromName = value; }
    }

    public string StrServer
    {
        get { return strServer; }
        set { strServer = value; }
    }

    public string StrUser
    {
        get { return strUser; }
        set { strUser = value; }
    }

    public string StrPass
    {
        get { return strPass; }
        set { strPass = value; }
    }

    public string StrReplyTo
    {
        get { return strReplyTo; }
        set { strReplyTo = value; }
    }

    public int PortNo
    {
        get { return portNo; }
        set { portNo = value; }
    }

    public bool Ssl
    {
        get { return (ssl == 1) ? true : false; }
        set { ssl = value ? 1 : 0; }
    }

    public string Mesaj
    {
        get { return mesaj; }
        set { mesaj = value; }
    }

    public string Konu
    {
        get { return konu; }
        set { konu = value; }
    }

    #endregion

    #region constructors

    /// 
    /// Bilgiler web.config ten okunacak
    /// 
    public EPosta()
    {
        if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["epostaFromAddress"].ToString()))
        {
            strFromAddress = ConfigurationManager.AppSettings["epostaFromAddress"].ToString();
            strFromName = ConfigurationManager.AppSettings["epostaFromName"].ToString();
            strServer = ConfigurationManager.AppSettings["epostaServer"].ToString();
            strUser = ConfigurationManager.AppSettings["epostaUser"].ToString();
            strPass = ConfigurationManager.AppSettings["epostaPass"].ToString();
            strReplyTo = ConfigurationManager.AppSettings["epostaReply"].ToString();
            portNo = Convert.ToInt32(ConfigurationManager.AppSettings["epostaPort"].ToString());

            try
            {
                ssl = Convert.ToInt32(ConfigurationManager.AppSettings["epostaSSL"].ToString());
            }
            catch (Exception)
            {
                ssl = 0;
            }
        }
    }

    /// 
    /// Bilgileri elle ayarla
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public EPosta(string strFromAddress, string strFromName, string strServer,
                    string strUser, string strPass, string strReplyTo, int portNo, bool ssl)
    {
        this.strFromAddress = strFromAddress;
        this.strFromName = strFromName;
        this.strServer = strServer;
        this.strUser = strUser;
        this.strPass = strPass;
        this.strReplyTo = strReplyTo;
        this.portNo = portNo;
        this.Ssl = ssl;
    }

    #endregion

    #region private methods

    private MailAddressCollection To
    {
        get { return to; }
        set { to = value; }
    }

    private MailAddressCollection Bcc
    {
        get { return bcc; }
        set { bcc = value; }
    }

    private MailAddressCollection Cc
    {
        get { return cc; }
        set { cc = value; }
    }

    #endregion

    #region public methods
    public void EkleTo(string eposta)
    {
        if (To == null)
            To = new MailAddressCollection();
        To.Add(eposta);
    }

    public void EkleBcc(string eposta)
    {
        if (Bcc == null)
            Bcc = new MailAddressCollection();
        Bcc.Add(eposta);
    }
    public void EkleCc(string eposta)
    {
        if (Cc == null)
            Cc = new MailAddressCollection();
        Cc.Add(eposta);
    }

    public void Gonder()
    {
        try
        {
            int mailAdet =
                (To == null ? 0 : To.Count)
                +
                (Bcc == null ? 0 : Bcc.Count)
                +
                (Cc == null ? 0 : Cc.Count);
            if (mailAdet == 0)
                throw new Exception("Gönderilecek eposta adresi belirtilmedi");

            MailMessage msg = new MailMessage();
            msg.BodyEncoding = System.Text.Encoding.UTF8;
            msg.IsBodyHtml = true;

            msg.Subject = Konu;
            msg.Body = Mesaj;

            msg.ReplyTo = new MailAddress(strReplyTo);

            msg.From = new MailAddress(strFromAddress, strFromName);

            if (To != null)
                foreach (MailAddress mail in To)
                    msg.To.Add(mail);

            if (Cc != null)
                foreach (MailAddress mail in Cc)
                    msg.CC.Add(mail);

            if (Bcc != null)
                foreach (MailAddress mail in Bcc)
                    msg.Bcc.Add(mail);

            SmtpClient smtp = new SmtpClient(strServer, portNo);
            smtp.Timeout = 1000000000;
            //smtp.UseDefaultCredentials = false;
            NetworkCredential nc = new NetworkCredential(strUser, strPass);
            smtp.Credentials = (ICredentialsByHost)nc.GetCredential(strServer, portNo, "Basic"); // AuthTypes: "Basic", "NTLM", "Digest", "Kerberos", "Negotiate"
            //smtp.Credentials = nc;
            if (ssl == 1)
                smtp.EnableSsl = true;

            smtp.Send(msg);
        }
        catch (Exception)
        {
            throw;
        }
    }
    #endregion
}
}
Bu class ı kullanabilmek için şu namespaceleri tanımlıyoruz:
using System;
using System.Configuration;
using System.Net;
using System.Net.Mail;
Peki bu classı nasıl kullanabiliriz. 3 değişik şekilde kullanabilirsiniz.
1) Bilgileri web.config ten okuyarak:
try
{
    // bilgiler web.config ten okunacak
    EPosta eposta = new EPosta();

    eposta.Konu = txtKonu.Text;
    eposta.Mesaj = txtMesaj.Text.Replace(Environment.NewLine, "
");

    eposta.EkleTo(txtTo.Text);

    eposta.Gonder();

    lblSonuc.Text = "Eposta gönderildi";
}
catch (Exception ex)
{
    lblSonuc.Text = ex.Message;
}
web.config e şu satırları ekliyoruz:

 
 
 
 
 
 
 
 
 
 
2) Bilgileri constructordan vererek:
try
{
    // bilgileri elle ver
    EPosta eposta = 
        new EPosta("abc@xyz.com", "iTech", 
                    "mail.xyz.com", "abc@xyz.com", 
                    "sifre", "abc@xyz.com", 1234, false);

    eposta.Konu = txtKonu.Text;
    eposta.Mesaj = txtMesaj.Text.Replace(Environment.NewLine, "
");

    eposta.EkleTo(txtTo.Text);

    eposta.Gonder();

    lblSonuc.Text = "Eposta gönderildi";
}
catch (Exception ex)
{
    lblSonuc.Text = ex.Message;
}
3) Bilgileri public properties aracılığıyla vererek:
try
{
    // bilgileri elle veriyoruz
    EPosta eposta =
                new EPosta
                {
                    StrFromAddress = "abc@xyz.com",
                    StrFromName = "itech",
                    StrServer = "mail.xyz.com",
                    StrUser = "abc@xyz.com",
                    StrPass = "sifre",
                    StrReplyTo = "abc@xyz.com",
                    PortNo = 1234
                };
    eposta.Konu = txtKonu.Text;
    eposta.Mesaj = txtMesaj.Text.Replace(Environment.NewLine, "
");

    eposta.EkleTo(txtTo.Text);

    eposta.Gonder();

    lblSonuc.Text = "Eposta gönderildi";
}
catch (Exception ex)
{
    lblSonuc.Text = ex.Message;
}
Eğer Amazon'un sizin için belirlediği saniyede X mail, ve 24 saatte Y mail limitlerini arttırmak isterseniz, "Request Production Access" sayfasına gidip buradaki formu doldurmanız gerekmektedir.
Unutmadan söyleyeyim, Amazon SES servisini (ve diğer servisleri) kullanmaya başlamadan önce Amazon sizden kredi kartı bilgilerinizi istemektedir. Ay sonunda toplam ücreti kredi kartından otomatik çekiyor.

Yorumlar

Bunu göndermek için linux sunucuya bir şey kurmak gerekiyor mu acaba?

Bu blogdaki popüler yayınlar

TERMINAL SERVICES UNLIMITED

Uzak Masaüstü Bağlantı Geçmişini Silmek

Putty Komut dizini