4. check_host() İşlevi

check_host() işlevi SPF kayıtlarını alır, onları çözümler ve belli bir konağın belirtilen kimlikle posta gönderme izninin olup olmadığını saptamak için onları yorumlar. Bu sınamayı uygulayan posta alıcılarının check_host() işlevini burada açıklandığı gibi doğru olarak değerlendirmeleri gerekir *ZORUNLU*.

Gerçeklenimler, bütün durumlarda sonuçlar aynı kalmak üzere, burada tanımlanmış kurallı algoritmadan farklı bir algoritma kullanabilirler *SEÇİMLİK*.

4.1. Bağımsız değişkenler

check_host() işlevi şu bağımsız değişkenleri alır:

<ip>

Postayı teslim etmeye çalışan SMTP istemcisinin IP adresi, IPv4 veya IPv6.

<alan>

Peşinde koşulan yetkilendirme bilgisini sağlayan alan; başlangıç olarak, "MAIL FROM" veya "HELO" kimliğinin alan kısmı.

<gönderici>

"MAIL FROM" veya "HELO" kimliği.

<gönderici>'nin alan kısmı, check_host() ilk olarak değerlendirirken, normal olarak <alan> bağımsız değişkeni ile aynıdır. Bununla birlikte, ardışık değerlendirmeler için bu genellikle doğru olmayacaktır (bkz, "include").

check_host() işlevinin asıl gerçeklenimleri ek bağımsız değişkenlere ihtiyaç duyabilir.

4.2. Sonuçlar

check_host() işlevi Sonucun Yorumlanması bölümünde açıklanan çeşitli sonuçlardan birini döndürebilir. Sonuca bağlı olarak, eylem alıcının yerel politikasına göre saptanır.

4.3. İlk İşlem

Eğer <alan> bozuksa (63 karakterden uzun, sonda olmayan sıfır uzunluk, vs.) veya tamamen nitelenmiş alan adı değilse ya da DNS sorgusu "alan mevcut değil" (RCODE 3) diye bir sonuç döndürüyorsa, check_host() işlevi anında "None" sonucunu döndürür.

Eğer <gönderici> bir yerel kısım içermiyorsa, yerel kısmın "postmaster" olduğu varsayılır.

4.4. Kayıt Arama

Kayıtların nasıl yayınlandıklarına bağlı olarak (bkz, Yayınlama), TXT, SPF veya her ikisinin de sorgulanması, <alan> için bir DNS sorgusu yapılmasını gerektirir. Eğer sorgu, TXT ve SPF özkaynak kayıtlarının her ikisi için de yapılıyorsa, sorgular aynı anda yapılabilir *SEÇİMLİK*.

Eğer yapılan tüm DNS sorguları bir sunucu başarısızlığı (RCODE 2) veya başka bir hata (RCODE 0 veya 3 dışında) ya da bir zamanaşımı döndürüyorsa, check_host() işlevi anında "TempError" sonucu ile çıkar.

4.5. Kayıtların Seçilmesi

Bir sürüm bölümü ile başlayan kayıtlar:

kayıt         = sürüm terimler *BOŞLUK
sürüm         = "v=spf1"

Sorgu tarafından döndürülen kayıtlarla başlayarak, kayıt seçimi iki adımda gerçekleşir:

  1. Açıkça "v=spf1" şeklinde bir sürüm bölümü ile başlamayan kayıtlar iptal edilir. sürüm bölümünün bir BOŞLUK veya kayıt sonu ile sonlandığına dikkat ediniz. "v=spf10" içeren sürüm bölümlü bir kayıt uygun değildir ve iptal edilmelidir.
  2. Küme içinde SPF türünde bir kayıt varsa, TXT türündeki tüm kayıtlar iptal edilir.

Bu adımlardan sonra, kalan tam olarak tek bir kayıt olmalı ve değerlendirme yapılmalıdır. Eğer iki veya daha fazla kayıt kalıyorsa, check_host() işlevi anında "PermError" sonucu ile çıkar.

Hiçbir eşleşen kayıt dönmezse, bir SPF istemcisinin alanın bir SPF bildirimi yapmadığını varsayması gerekir *ZORUNLU*. SPF işlemi durmalı ve "None" dönmelidir *ZORUNLU*.

4.6. Kayıt Değerlendirme

SPF kaydı seçildikten sonra, check_host() işlevi kaydı çözümler ve o an ki sınama için bir sonuç bulmak için yorum yapar. Eğer bir sözdizimi hatası varsa, check_host() işlevi anında "PermError" sonucu ile çıkar.

Gerçeklenimler çözümlemek için önce kaydın tümünü seçebilir ve eğer kayıt sözdizimsel olarak iyi biçimlenmemişse "PermError" döndürebilirler *SEÇİMLİK*. Yine de, tüm durumlarda, kaydın herhangi bir yerinde bir sözdizimi hatası saptanmış olmalıdır *ZORUNLU*.

4.6.1. Terim Değerlendirme

İki tür terim vardır: mekanizmalar ve değiştiriciler. Bir kayıt, (aşağıda ABNF gösterimiyle belirtilmiş olarak) bunların bir listesini içerir.

terimler       = *( 1*BOŞLUK ( yönerge / değiştirici ) )

yönerge        = [ niteleyici ] mekanizma
niteleyici     = "+" / "-" / "?" / "~"
mekanizma      = ( tümü / dahili
                  / A / MX / PTR / IP4 / IP6 / mevcut )
değiştirici    = sevket / izahat / bilinmeyen-değiştirici
bilinmeyen-değiştirici = isim "=" makro-dizgesi

isim           = HARF *( HARF / RAKAM / "-" / "_" / "." )

Çoğu mekanizma isimden sonra bir ":" veya "/" karakterine izin verir.

Bir değiştirici daima hemen isimden sonra ve bir makro-dizgesinin parçası olabilen bir ":" veya "/" karakterinden önce bir eşit işareti ('=') içerir.

Bir "=", ":" veya "/" içermeyen terimler Mekanizma Tanımları bölümünde tanımlandığı gibi mekanizmalardır.

[RFC4234]'teki ABNF gösterimi tanımına göre mekanizma ve değiştirici isimleri harf büyüklüğüne duyarsızdırlar.

4.6.2. Mekanizmalar

Her mekanizma soldan sağa doğru ele alınır. Bir mekanizma yoksa, sonuç Öntanımlı Sonuç bölümünde belirtilmiştir.

Bir mekanizma değerlendirilirken şu üçünden biri oluşur: eşleşebilir, eşleşmeyebilir ya da bir hata oluşur.

Eşleşme olursa, işlem sona erer ve niteleyici değeri bu kaydın sonucu olarak döndürülür. Eşleşme olmazsa, işlem sonraki mekanizma ile devam eder. Bir hata oluşursa, mekanizma işlemi sonlanır ve hata değeri döndürülür.

Olası niteleyiciler ve döndürdükleri sonuçlar:

"+" Pass
"-" Fail
"~" SoftFail
"?" Neutral

Niteleyici isteğe bağlıdır ve öntanımlı değer "+"dır.

Bir mekanizma eşleşir ve niteleyici "-" (eksi) olursa, "Fail" sonucu döndürülür ve izahat-dizgesi İzahat (exp) bölümünde açıklandığı gibi hesaplanır.

Bellibaşlı mekanizmalar Mekanizma Tanımları bölümünde açıklanmıştır.

4.6.3. Değiştiriciler

Değiştiriciler birer mekanizma değildirler: bir eşleşme ya da eşleşmeme sonucunu döndürmezler. Ek bilgi sağlarlar. Değiştiriciler kaydın değerlendirmesini doğrudan etkilemeseler de, "redirect" değiştiricisi, tüm mekanizmalar değerlendirildikten sonra etkili olur.

4.7. Öntanımlı Sonuç

Eğer eşleşen bir mekanizma yoksa ve bir "redirect" değiştiricisi de belirtilmemişse, check_host() işlevi son yönerge olarak "?all" belirtilmiş gibi "Neutral" sonucu ile döner. Eğer bir "redirect" değiştiricisi belirtilmişse, check_host() işlevi Yönlendirilmiş Sorgu (redirect) bölümünde tanımlandığı gibi işlem yapar.

İşlemin açıkça sonlandırılabilmesi için kayıtların daima ya bir "redirect" değiştiricisi ya da bir "all" mekanizması içermesi gerektiğine *ÖNERİ* dikkat ediniz. Örnek:

v=spf1 +mx -all

veya

v=spf1 +mx redirect=_spf.example.com

4.8. Alan Belirtimi

Bu mekanizma ve değiştiricilerin bazılarının bir <alan-belirtimi> bölümü vardır. <alan-belirtimi> dizgesi bir makro oluşumudur (bkz, Makrolar). Sonuç dizgesi, tamamen nitelenmiş bir alan adının bilinen gösterim biçimindedir: noktalarla ayrılmış yaftalar dizisi. Bu alana belgenin devamında <hedef-ismi> denilecektir.

Bilginize

Makro yorumlamasının sonucu bir öncelemeye konu değildir. Bu bakımdan, bu oluşum bir DNS yaftasında meşru olan tüm karakterleri üretemez (örn, denetim karakterlerini). Yine de, bu oluşum, DNS'de kullanılan işe yarar yaftaları ("_spf" gibi) ve meşru konak isimlerini ifade etmek için yeterince güçlüdür.

Birçok mekanizma için <alan-belirtimi> isteğe bağlıdır. Sağlanmazsa, <hedef-ismi> olarak <alan> kullanılır.