D ile günlük

Zaman kullanımı, elektronik posta göndermek

Bu makalede vibe.d ile nasıl elektronik posta gönderebileceğimizi öğreneceğiz

Zaman kullanımı

Bu makalede vibe.d kullanarak nasıl elektronik posta gönderebileceğimizi öğreneceğiz.

Ancak, sizin de bilebileceğiniz dünya üzerinde kullanılan farklı zaman dilimleri ve farklı zaman biçemleri bulunuyor. Elektronik posta gönderebilmek için kullandığımız zaman dilimini farklı bir zaman biçemine çevirmek gerekiyor.

Bu nedenle ilk önce D dilinin ve vibe.d kütüphanesinin, farklı zaman biçemlerini nasıl ele aldığına bakabiliriz.

Bu derste en başa sarıp ilk örneğimize geri dönüyoruz.

Hatırlarsanız ilk örneğimizde bir html sayfasına sadece basit metin biçiminde Merhaba Dünya yazdırmıştık.

Şimdi yeni örneğimize bakalım.

import vibe.vibe;
import std.stdio;

void zaman(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    auto sayfa = q{
        <html>
        <head>
          <title>Zaman sayfası</title>
        </head>
        <body>
          <p>Merhaba</p>
        </body>
        </html>};

    yanıt.writeBody(sayfa, "text/html; charset=UTF-8");
}

void main()
{
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8000;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, &zaman);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Yazılım kaynağına baktığımızda ilk örneğimizdeki gibi writeBody kullandık. Burada sayfa sadece düz metinden oluşuyor.

Tek fark burada writeBody işlevine gönderdiğimiz ikinci seçenekle düz metin yerine bir html belgesi oluşturmasını söyledik.

Şimdiye kadar nasıl derleme yapılacağını öğrendiğinizi düşünerek, ileriki aşamalarda derleme komutlarını, ya da sunucu adresini uzun uzun yazmayabilirim.

Uygulamayı dub ile derleyip, çalıştırınız. http://localhost:8000 adresini açtığımızda, tahmin ettiğimiz gibi ekrana merhaba yazdı.

Ama bu sefer bizim için düz bir metin belgesi yerine bir html sayfası oluşturdu. Sayfa kaynağına bakalım.

D dili ve vibed kütüphanesi ile zaman kullanımı

Sizin de görebileceğiniz üzere sayfada boşluklar var.

Daha iyisini yapabiliriz.

Kaynak kütüğü değiştiriyoruz.

import vibe.vibe;
import std.stdio;

string hizala (string metin)
{
    string içerik = stripLeft(metin.dup,"\n\t");
    return içerik.outdent;
}

void zaman(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    auto sayfa = q{
        <html>
        <head>
          <title>Zaman sayfası</title>
        </head>
        <body>
          <p>Merhaba</p>
        </body>
        </html>};

    yanıt.writeBody(sayfa.hizala, "text/html; charset=UTF-8");
}

void main()
{
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8000;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, &zaman);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Burada hizala işlevi yeni satır, tab gibi karakterleri bir dizgeden çıkarıyor.

Ama burada çok ilginç bir kullanım var.

    yanıt.writeBody(sayfa.hizala, "text/html; charset=UTF-8");

D programlama dili ile işlevleri zincirleme olarak kullanabiliyoruz. İstersek aşağıdaki gibi yazabiliriz.

   yanıt.writeBody(hizala(sayfa),"text/html; charset=UTF-8");

Tekrardan uygulamayı derleyip, sunucu adresini açıyoruz.

Sayfa kaynağına baktığımızda bu sefer istediğimiz gibi sayfa kaynağının hizalandığını görebilirsiniz.

D dili ve vibed kütüphanesi ile zaman kullanımı

Sunucu üzerinde zaman ve saati göstermek

İlk önce basit bir örnek üzerinden başlayalım.

import vibe.vibe;
import std.stdio;

string hizala (string metin)
{
    string içerik = stripLeft(metin.dup,"\n\t");
    return içerik.outdent;
}

void zaman(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    auto zaman = Clock.currTime();

    auto sayfa = q{
        <html>
        <head>
          <title>Zaman sayfası</title>
        </head>
        <body>
          <p>Zaman = %s</p>
        </body>
        </html>};

    yanıt.writeBody(sayfa.hizala.format(zaman), "text/html; charset=UTF-8");
}

void main()
{
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8000;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, &zaman);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Bu örnekte önceki örnekten farklı olarak format ifadesiyle bir dizgeyi biçimlendiriyoruz.

Bu örnekte sayfa isimli metinde %s gördüğü yere bizim zaman değişkenini koyuyor. %s in s kısmı bu değişkenin bir "string" yani dizge olduğunu belirtiyor.

Eğer C'nin printf işlevini kullandıysanız ikisi arasında benzerlik olduğunu görebilirsiniz.

Uygulamayı derleyip çalıştırdığımızda ve sunucu adresini açtığımızda aşağıdakine benzer bir çıktı görebiliriz.

Zaman = 2021-Jan-28 21:21:26.1904194

Eğer saati de göstermek istersek zaman işlevinde ufak bir değişiklik yapabiliriz. Sadece zaman işlevinde değişiklik olduğu için bu sefer sadece zaman işlevini gösteriyorum.

void zaman(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    auto zaman = Clock.currTime();
    auto saat = zaman.hour;
    auto dakika = zaman.minute;
    auto saniye = zaman.second;

    auto sayfa = q{
        <html>
        <head>
          <title>Zaman sayfası</title>
        </head>
        <body>
          <p>Zaman = %s</p>
          <p>Saat = %s : %s : %s </p>
        </body>
        </html>};

    yanıt.writeBody(sayfa.hizala.format(zaman, saat, dakika, saniye), "text/html; charset=UTF-8");
}

Sunucu çıktısına baktığınızda artık saatin de gösterildiğini görebilirsiniz.

D ve vibed kullanarak sunucu saatini gösterme

Zaman biçemini dönüştürmek

Yapacağımız işi özetlersek üç aşamadan oluşuyor.

  • Zamanı öğren
  • Zaman bilgisine zaman dilimi bilgisini ekle
  • Zaman bilgisini elektronik posta için uygun olan istediğimiz biçime dönüştür.

Gene sadece zaman işlevinde değişiklik yapıyoruz.

void zaman(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    auto zaman = Clock.currTime();
    auto saat = zaman.hour;
    auto dakika = zaman.minute;
    auto saniye = zaman.second;
    auto zamanDilimi = PosixTimeZone.getTimeZone("Asia/Istanbul");
    auto yeniZaman = Clock.currTime(zamanDilimi);
    auto istediğimizZaman = yeniZaman.toRFC822DateTimeString();

    logInfo("Zaman dilimi = %s %s", zamanDilimi.name, zamanDilimi.stdName);

    auto sayfa = q{
        <html>
        <head>
          <title>Zaman sayfası</title>
        </head>
        <body>
          <p>Zaman = %s</p>
          <p>Saat = %s : %s : %s </p>
          <p>Zaman dilimi ve zaman = %s </p>
          <p>İstediğimiz zaman = %s </p>
        </body>
        </html>};

    yanıt.writeBody(sayfa.hizala.format(zaman, saat, dakika, saniye,
                                        yeniZaman, istediğimizZaman), "text/html; charset=UTF-8");
}

Zaman dilimi ile kullanmak istediğimiz zaman dilimini İstanbul olarak seçtik.

Burada zamana, zaman dilimi bilgisi eklendiğinde nasıl göründüğünü gösterebilmek için yeniZaman isimli bir değişken oluşturduk.

En son olarak da elektronik postalar için uygun zamana istediğimizZaman isimli değişkeni kullanarak dönüşüm yapıyoruz.

Sunucu çıktısını aşağıda görebilirsiniz.

D ve vibed kullanarak elektronik posta zaman biçimine dönüşüm

Elektronik posta göndermek

En basit elektronik posta gönderen uygulama şu şekilde olabilir.

import vibe.vibe;

string zamanıGetir()
{
    auto zamanDilimi = PosixTimeZone.getTimeZone("Asia/Istanbul");
    auto zaman = Clock.currTime(zamanDilimi);
    return zaman.toRFC822DateTimeString();
}

void elektronikPostaGönder (string sunucu, ushort kapı)
{
    auto smtpAyarları = new SMTPClientSettings(sunucu, kapı);
    smtpAyarları.connectionType = SMTPConnectionType.startTLS;
    smtpAyarları.tlsValidationMode = TLSPeerValidationMode.none;
    smtpAyarları.authType = SMTPAuthType.login;
    smtpAyarları.username = "kullanici@gmail.com";
    smtpAyarları.password = "şifre";
    auto ePosta = new Mail;
    ePosta.headers["From"] = "<gonderen@gmail.com>";
    ePosta.headers["To"] = "<alici@gmail.com>";
    ePosta.headers["Subject"] = "Elektronik posta";
    ePosta.bodyText = "Elektronik posta göndermesi denemesi yapıyoruz.";
    sendMail(smtpAyarları, ePosta);
}

void gönder(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    elektronikPostaGönder("smtp.gmail.com", 587);
    yanıt.writeBody("Elektronik posta gönderildi");
}

void main()
{
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8000;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, &gönder);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Elektronik posta gönderme kısmında gönderen, alıcı, konu, içerik gibi elektronik posta bilgilerini girdik.

Bunun yanı sıra SMTP ayarlarını yaptık. SMTP basit ileti gönderim kuralları anlamına geliyor.

SMTP bağlantısını şifrelemek için SSL ya da TLS gibi şifreleme yöntemleri kullanılıyor.

Bu arada bu örnekte Gmail sunucularını kullandık.

Ancak şu noktanın altını çizmek istiyorum.

Youtube geçenlerde Profesör Sucharit Bhakdi isimli bir bilim adamının açıklamalarını yayından kaldırdı. Bu da gösteriyor ki internet ortamında gerçek bir iletişim özgürlüğünden bahsetmek mümkün değil.

Düşünün ki 50 yıl bir sahada çalışmış ve mesleğinin en üst noktalarına gelmiş bir bilim adamının yaptığı açıklamalar yayından kaldırılıyor.

Bu da Google, Youtube, Gmail gibi uygulamaların küreselcilerin hizmetinde çalışan sunucu uygulamaları olduğunu ortaya koyuyor.

Günümüzde Çekce, Kürtçe, Sloven dilinde arama motorları var. Türkçe neden yok?

Bu konu üzerinde de durup düşünmek gerekiyor.

Bu nedenle bu uygulamayı deneysel bir seçenek olarak kabul etmekte fayda var.

Eğer elektronik posta gönderirken bir hata ile karşılaşırsanız bu Gmail sunucularındaki bazı güvenlik ayarlarından kaynaklanıyor.

Dikkat ederseniz daha önce zamanla ilgili öğrendiğimiz bilgileri kullanarak zamanıGetir isimli ufak bir işlev yazdık.

Eğer elektronik posta gönderme başarılı olduysa ana sayfayı açtığınızda işlemin başarılı olduğuna dair bir ileti görmelisiniz.

Elektronik posta gönderen uygulamamızın son halini aşağıda bulabilirsiniz.

import vibe.vibe;

string zamanıGetir()
{
    auto zamanDilimi = PosixTimeZone.getTimeZone("Asia/Istanbul");
    auto zaman = Clock.currTime(zamanDilimi);
    return zaman.toRFC822DateTimeString();
}

void elektronikPostaGönder (string sunucu, ushort kapı)
{
    auto smtpAyarları = new SMTPClientSettings(sunucu, kapı);
    smtpAyarları.connectionType = SMTPConnectionType.startTLS;
    smtpAyarları.tlsValidationMode = TLSPeerValidationMode.none;
    smtpAyarları.authType = SMTPAuthType.login;
    smtpAyarları.username = "kullanici@gmail.com";
    smtpAyarları.password = "şifre";
    auto ePosta = new Mail;
    ePosta.headers["Date"] = zamanıGetir();
    ePosta.headers["Sender"] = "alanadi.com İletişim <kullanici@alanadi.com>";
    ePosta.headers["From"] = "<gonderen@gmail.com>";
    ePosta.headers["To"] = "<alici@gmail.com>";
    ePosta.headers["Subject"] = "Elektronik posta testi";
    ePosta.headers["Content-Type"] = "text/plain;charset=utf-8";
    ePosta.bodyText = "Bu iletide さいごの果実 gibi unicode harfleri\n kullanabiliyoruz. \\n ile bir sonraki satıra geçebiliriz.";
    sendMail(smtpAyarları, ePosta);
}

void gönder(HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    elektronikPostaGönder("smtp.gmail.com", 587);
    yanıt.writeBody("Elektronik posta gönderildi");
}

void main()
{
    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8000;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, &gönder);
    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Görebileceğiniz üzere elektronik posta gönderirken unicode karakterleri de kullanabiliyoruz.

Elektronik postanın, gönderilme zamanını belirlemek için daha önce yazdığımız zamanıGetir isimli işlevi kullandık.

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.