Seçimlik Gecikmeler

Benim gibi, SMTP aktarım gecikmelerine konu edeceğiniz konaklar için biraz daha seçici davranmak isteyebilirsiniz. Örneğin, bu belgede daha önce açıklandığı gibi, DNS karalistelerinde bulunma durumunda ya da kesin bir redde konu olmayan ama doğrulama da yapılamayan selamlaşmalar sonucunda bu gecikmeleri uygulamaya karar verebilirsiniz.

Seçimlik gecikmelerin uygulayabilmek için acl_rcpt_to ACL'sindeki bazı sınamaları diğer ACL'lere taşımak gerekir. Böylelikle, sorunların işaretlerini gördüğümüz anda gecikmeleri uygulayabilir ve kalleş yazılımların eşzamanlama hataları verme ve başka sorunlarla karşılaşma talihsizliğini arttırmış oluruz.

Özellikle yapacaklarımız:

  • DNS sınamalarını acl_connect ACL'sine taşıyacağız.

  • Selamlaşma sınamalarını acl_helo ACL'sine taşıyacağız. Bir istisna: Bu noktada henüz selamlaşmanın olmayışını sınayamayız, çünkü bu ACL bir EHLO veya HELO komutunun varlığı halinde devreye girer. Bu sınamayı acl_mail_from ACL'sinde yapacağız.

  • Gönderici adresi sınamalarını acl_mail_from ACL'sine taşıyacağız.

Bununla birlikte, evvelce açıkladığımız sebeplerle, asıl reddi RCPT TO: komutunu alana dek yapmayacağız. Bunu gerçekleştirmek için önceki ACL'lerdeki deny deyimlerini warn deyimlerine dönüştüreceğiz ve RCPT TO: komutunu alana kadar hata iletilerini ve uyarıları saklamak için Exim'in genel amaçlı ACL değişkenlerini kullanacağız. Şöyle ki:

  • Teslimatı reddetmeye karar verirsek, gönderilecek 550 yanıtlarında kullanmak üzere hata iletisini saklamak için $acl_c0 veya $acl_m0 değişkenini kullanacağız:

    • Eğer gerekli koşullar bir posta teslimatından önce sağlanmışsa (örn, acl_connect veya acl_helo ACL'sinde), bağlantı boyunca değer saklayabilen $acl_c0 değişkenini kullanacağız.

    • Posta aktarımı başladıktan sonra (örn. MAIL FROM: komutundan sonra), $acl_c0 içeriğini iletilere özel değişken olan $acl_m0'a kopyalayacağız ve bu noktadan sonra bu değişkeni kullanacağız. Böylece, bu ileti ile belirlenmiş bir durum, aynı bağlantıdan alınan daha sonraki iletilerden etkilenmemiş olacak.

    Ayrıca, benzer şekilde, günlükleme iletilerini $acl_c1 veya $acl_m1 değişkeninde saklayacağız.

  • Eğer, kesin reddine karar verilecek yeterli koşulların sağlanmadığı bir durumla karşılaşırsak, $acl_c1 veya $acl_m1 değişkeninde sadece bir uyarı iletisi saklayacağız. Posta aktarımı başladığında (örn, acl_mail_from ACL'sinde), bu değişkenin içeriğini ileti başlığına da ekleyeceğiz.

  • Daha sonraki sınamaların (SpamAssassin taraması gibi) sonuçlarına bakmaksızın bir iletiyi kabul etmeye karar verirsek, durum belirtecini $acl_c0 veya $acl_m0 değişkeninde saklayacak ama $acl_c1 ve $acl_m1 değişkenlerini boş bırakacağız.

  • Her ACL'nin başlangıcında ve acl_mail_from ACL'sinde, o anki zaman damgasını $acl_m2 değişkenine atayacağız. ACL'nin sonunda ise, $acl_c1 veya $acl_m1 değişkeninin varlığına bakıp zaman damgasındaki değerden başlayarak 20 saniyelik gecikmeyi dolduracak şekilde SMTP aktarım gecikmesini uygulayacağız.

Kullandığımız değişkenleri bir tablo halinde özetlersek:

Tablo 4A..1. ACL bağlantı/ileti değişkenlerinin kullanımı

Değişkenler:$acl_[cm]0 boş$acl_[cm]0 dolu
$acl_[cm]1 boş(Henüz bir karar yok)Postayı kabul ediyoruz
$acl_[cm]1 doluBaşlığa bir uyarı ekliyoruzPostayı reddediyoruz

Bu yaklaşıma bir örnek olarak, selamlaşma ile ilgili iki sınama yapacağız; birinde karşı taraf kendini IP adresi ile tanıtırsa postayı reddedeceğiz, diğerinde ise doğrulanabilir olmayan bir isim belirtirse bir uyarıyı kayda alacağız. Önceden, bu iki sınamayı acl_rcpt_to ACL'sinde yapmıştık, şimdi acl_helo ACL'sine alacağız.

acl_helo:
  # Gecikme uygularken başlangıç olarak kullanmak üzere o anki zaman
  # bilgisini kaydediyoruz.
  warn
    set acl_m2  = $tod_epoch

  # Posta yerel SMTP üzerinden alınmışsa (yani, TCP/IP bağlantısı
  # ile gelmiyorsa), kabul ediyoruz. Bunu boş bir konak alanını
  # sınayarak yapacağız. Ayrıca, postalarını rölelediğimiz
  # konaklardan gelen postaları da kabul edeceğiz.
  #
  accept
    hosts       = : +relay_from_hosts

  # Karşı taraf selamlaşmayı IP adresi ile yaparsa, $acl_c0'a red
  # iletisini, $acl_c1'e ise günlük iletisini kaydedeceğiz. Bunları
  # daha sonra "deny" deyiminde kullanacağız. Bu değişkenlerin varlığı
  # göndericinin oyalanacağını belirtecek.
  #
  warn
    condition   = ${if isip {$sender_helo_name}{true}{false}}
    set acl_c0  = Message was delivered by ratware
    set acl_c1  = remote host used IP address in HELO/EHLO greeting

  # Selamlaşmada doğrulaması başarısız olursa, acl_c1'e bir uyarı iletisi
  # kaydedeceğiz. Bu iletiyi daha sonra ileti başlığına ekleyeceğiz.
  # Bu değişkenin varlığı göndericinin oyalanacağını belirtecek.
  #
  warn
    condition   = ${if !def:acl_c1 {true}{false}}
    !verify     = helo
    set acl_c1  = X-HELO-Warning: Remote host $sender_host_address \
                  ${if def:sender_host_name {($sender_host_name) }}\
                  incorrectly presented itself as $sender_helo_name
    log_message = remote host presented unverifiable HELO/EHLO greeting.

  #
  # ... bu örnek için diğer sınamaları atlıyoruz ...
  #

  # Bağlantıyı kabul ediyoruz ama $acl_c1'de bir ileti varsa, göndericiyi
  # 20 saniye oyalıyoruz.
  accept
    set acl_m2  = ${if def:acl_c1 {${eval:20 + $acl_m2 - $tod_epoch}}{0}}
    delay       = ${if >{$acl_m2}{0}{$acl_m2}{0}}s

Sonra, acl_mail_from ACL'sinde iletileri $acl_c{0,1}'den $acl_m{0,1} değişkenlerine aktaracağız. Ayrıca, $acl_c1 içeriğini ileti başlığına ekleyeceğiz.

acl_mail_from:
  # Gecikme uygularken başlangıç olarak kullanmak üzere o anki zaman
  # bilgisini kaydediyoruz.
  warn
    set acl_m2  = $tod_epoch

  # Posta yerel SMTP üzerinden alınmışsa (yani, TCP/IP bağlantısı
  # ile gelmiyorsa), kabul ediyoruz. Bunu boş bir konak alanını
  # sınayarak yapacağız. Ayrıca, postalarını rölelediğimiz
  # konaklardan gelen postaları da kabul edeceğiz.
  #
  accept
    hosts     = : +relay_from_hosts

  # $acl_c0 ve $acl_c1 değişkenleri bu SMTP aktarımı sırasında yapılmaya
  # çalışılacak her teslimat için kullanılacak red ve/veya uyarı iletilerini
  # içeriyor olacak (böyle bir durum varsa). Bu değişkenlerin içeriklerini
  # $acl_m{0,1} iletiye özel değişkenlere aktaracağız ve $acl_m1'deki uyarıyı
  # ileti başlığına ekleyeceğiz. (Bir red durumunda, $acl_m1 artık bir günlük
  # kaydı içeriyor olacak, ama iletiyi bununla değil başlığındaki kayıtla
  # reddedeceğiz.)
  #
  warn
    set acl_m0  = $acl_c0
    set acl_m1  = $acl_c1
    message     = $acl_c1


  #
  # ... bu örnek için diğer sınamaları atlıyoruz ...
  #

  # Bağlantıyı kabul ediyoruz ama $acl_c1'de bir ileti varsa, göndericiyi
  # 20 saniye oyalıyoruz.
  accept
    set acl_m2  = ${if def:acl_c1 {${eval:20 + $acl_m2 - $tod_epoch}}{0}}
    delay       = ${if >{$acl_m2}{0}{$acl_m2}{0}}s

Kalan değişiklikler için Tamamlanmış ACL'ler bölümüne bakınız.