IT Operasyon Kılavuzu · v1.0

Mail Sunucu Kurulumu ve
Otomatik İstemci Yapılandırması

hMailServer + IIS üzerinde, çok domainli bir mail altyapısının sıfırdan kurulumu; Outlook ve Thunderbird'ün domaini girip parolayı yazınca otomatik yapılandırılması.

Platform: Windows Server + IIS Mail: hMailServer İstemci: Outlook + Thunderbird Protokol: IMAP · POP3 · SMTP
01

Giriş ve Mimari

Bu rehber, tek bir Windows sunucu üzerinde birden fazla domain için e-posta hizmeti veren bir altyapının kurulumunu anlatır. Hedef, son kullanıcının istemcisine yalnızca e-posta adresi + parola girmesi; sunucu adı, port ve şifreleme ayarlarının otomatik gelmesidir.

Bunu sağlayan iki standart vardır: Outlook için Autodiscover, Thunderbird ve benzerleri için Mozilla autoconfig. İkisi de bir web sunucusunun (IIS) domaine özel ayarları XML olarak döndürmesine dayanır. Aşağıdaki akış, bir istemcinin hesabı nasıl otomatik bulduğunu özetler:

İstemci Outlook / Thunderbird kullanici@<domain> DNS SRV: _autodiscover → mail.<domain> autoconfig.<domain> IIS · mail.<domain> autodiscover.ashx config-v1.1.ashx → XML ayar döndürür hMailServer IMAP 993 · POP3 995 SMTP 587 SSL/STARTTLS 1· sorgu 2· yönlendirme 3· /autodiscover 4· ayarlar 5· istemci IMAP/POP3/SMTP ile mail.<domain> sunucusuna bağlanır

Bileşenler: hMailServer e-postayı saklar ve IMAP/POP3/SMTP servislerini sunar; IIS autodiscover/autoconfig XML'ini üretir; DNS istemciyi doğru sunucuya yönlendirir; SSL sertifikası tüm bağlantıları şifreler.

02

Ön Gereksinimler

Kuruluma başlamadan önce sunucuda aşağıdakilerin hazır olması gerekir:

  • Windows Server (2016 veya üzeri) ve yönetici erişimi.
  • IIS rolü kurulu; ayrıca ASP.NET 4.x, .NET Extensibility 4.x, ISAPI Extensions, ISAPI Filters bileşenleri (Bölüm 8'de kurulumu anlatılıyor).
  • URL Rewrite Module 2.1 (Microsoft'tan ücretsiz indirilir).
  • hMailServer son sürüm kurulum dosyası.
  • İlgili domainlerin DNS yönetim paneline erişim.
  • Sunucunun sabit (statik) genel IP'si: <SUNUCU_IP>

Açılması gereken portlar (güvenlik duvarı)

PortServisAçıklama
25SMTPSunucular arası mail teslimi (inbound/outbound)
587SMTP (Submission)İstemci gönderimi, STARTTLS
465SMTP (SSL)İstemci gönderimi, doğrudan SSL (opsiyonel)
993IMAPSSL/TLS
995POP3SSL/TLS
80 / 443HTTP/HTTPSIIS — autodiscover/autoconfig ve sertifika doğrulama
03

hMailServer Kurulumu

hMailServer'ı kur, kurulum sırasında veritabanı olarak yerleşik SQLite'ı (tek sunucu için yeterli) seçebilir ve bir yönetici parolası belirleyebilirsin.

Domain ekleme

  1. hMailServer Administrator → DomainsAdd.
  2. Domain adını gir: <domain>Save.
  3. Eklenen domain altında AccountsAdd ile her kullanıcı için hesap oluştur: kullanici@<domain> + parola.

Protokolleri etkinleştir

Settings → Protocols altında IMAP, POP3 ve SMTP servislerinin etkin olduğundan emin ol. Advanced → TCP/IP ports bölümünde aşağıdaki bağlantı uçlarının tanımlı olması gerekir:

ProtokolPortBağlantı güvenliği
IMAP993SSL/TLS
POP3995SSL/TLS
SMTP587STARTTLS
SMTP25Sunucular arası teslim
Sertifika bağlamaSSL'li portların (993/995/587/465) çalışması için Bölüm 7'de oluşturacağın sertifikayı Settings → Advanced → SSL certificates altında tanımlayıp ilgili TCP/IP portlarına bağlaman gerekir.
04

Giden E-posta ve TLS

Sunucu dışarıya mail teslim ederken bağlantıyı şifrelemezse, alıcı (örn. Gmail) "şifrelenmedi" uyarısı gösterir. Bunu önlemek için:

  1. Settings → Protocols → SMTP → Advanced sekmesinde "Use STARTTLS if available" seçeneğini işaretle. Bu, karşı sunucu destekliyorsa giden bağlantıyı şifreler.
  2. Settings → Protocols → SMTP → Delivery of e-mail sekmesindeki "Local host name" alanına sunucunun gerçek adını yaz: mail.<domain>. Boş bırakılırsa makine adı (örn. sağlayıcının varsayılanı) HELO ismi olarak kullanılır ve teslim itibarını düşürür.
ÖnemliSunucunun genel IP'si için ters DNS (PTR) kaydının da mail.<domain> ile eşleşmesini sağla (sunucu sağlayıcısının panelinden). HELO adı, ileri DNS (A) ve PTR'nin hizalı olması spam'e düşmeyi büyük ölçüde önler.
05

DNS Kayıtları (her domain için)

Her domain için aşağıdaki kayıtları DNS panelinde oluştur. <domain> ve <SUNUCU_IP> yerine gerçek değerleri koy.

DNS — bölge kayıtları
# Mail sunucusu ve istemci otomatik yapılandırma
mail.<domain>                  A      <SUNUCU_IP>
autoconfig.<domain>            A      <SUNUCU_IP>
<domain>                       MX     10 mail.<domain>

# Outlook Autodiscover yönlendirmesi (A kaydı DEĞİL, sadece SRV)
_autodiscover._tcp.<domain>    SRV    0 0 443 mail.<domain>

# Gönderen doğrulaması (SPF)
<domain>                       TXT    "v=spf1 ip4:<SUNUCU_IP> ~all"
Dikkatautodiscover.<domain> için A kaydı oluşturma. O isim sertifikada bulunmadığından, Outlook oraya gidip sertifika hatası alır. Outlook'u mail.<domain>'e yalnızca SRV kaydı yönlendirir.

Thunderbird, Outlook'tan farklı olarak SRV kullanmaz; doğrudan autoconfig.<domain> adresini sorgular. Bu yüzden hem mail.<domain> hem autoconfig.<domain> A kayıtları gereklidir ve ikisi de sertifikada yer almalıdır (Bölüm 7).

06

DKIM ve DMARC

SPF tek başına yeterli değildir. Maillerin spam'e düşmemesi ve domainin taklit edilememesi için DKIM (imza) ve DMARC (politika) kayıtlarını da ekle.

DKIM — hMailServer tarafı

  1. Bir RSA anahtar çifti üret (OpenSSL ile): özel anahtar sunucuda kalır, açık anahtar DNS'e yazılır.
  2. hMailServer Administrator → Settings → Advanced → DKIM Signing bölümünde özel anahtar dosyasının yolunu, selektörü (örn. default) ve domaini tanımla.
OpenSSL — DKIM anahtarı üretimi
openssl genrsa -out dkim_private.pem 2048
openssl rsa -in dkim_private.pem -pubout -out dkim_public.pem

DKIM — DNS kaydı

Açık anahtarı (dkim_public.pem içeriğinden başlık/satır sonları çıkarılmış hali) tek satır olarak ekle:

DNS — DKIM TXT
default._domainkey.<domain>   TXT   "v=DKIM1; k=rsa; p=<ACIK_ANAHTAR>"

DMARC — DNS kaydı

Başlangıçta gözlem modu (p=none) önerilir; raporları izleyip her şey doğruysa quarantine veya reject'e yükseltirsin.

DNS — DMARC TXT
_dmarc.<domain>   TXT   "v=DMARC1; p=none; rua=mailto:postmaster@<domain>; fo=1"
Doğrulama: Bir test maili Gmail'e gönderip "Orijinali göster" ile SPF=PASS, DKIM=PASS, DMARC=PASS satırlarını kontrol et.
07

SSL Sertifikası (win-acme)

Hem mail bağlantıları (993/995/587) hem de autodiscover/autoconfig geçerli (kendinden imzalı olmayan) bir sertifika ister. win-acme ile Let's Encrypt'ten ücretsiz, otomatik yenilenen bir SAN sertifikası alınır.

Sertifikanın her domain için iki ismi kapsaması gerekir:

  • mail.<domain> — IMAP/POP3/SMTP ve Outlook için
  • autoconfig.<domain> — Thunderbird için
  1. wacs.exe'yi yönetici olarak çalıştır.
  2. Manuel host girişi seçeneğini kullanarak tüm mail.<domain> ve autoconfig.<domain> isimlerini tek sertifikada topla.
  3. win-acme bunları IIS sitesine bağlar (443 binding) ve zamanlanmış görevle otomatik yeniler.
hMailServer'a bağlamawin-acme sertifikayı Windows sertifika deposuna kurar. hMailServer'ın bunu kullanması için sertifikayı SSL certificates altında tanımlayıp IMAP/POP3/SMTP portlarına ata. Yenileme sonrası hMailServer servisini yeniden başlatan bir betik (win-acme post-renewal script) eklemek pratiktir.
08

IIS Yapılandırması

ASP.NET 4.x kurulumu

Autodiscover/autoconfig .ashx handler'ları ASP.NET ister. Kurulu değilse .ashx istekleri 404 döner. Yönetici komut isteminde:

CMD (Yönetici) — ASP.NET 4.x
dism /online /enable-feature /featurename:IIS-ASPNET45 /all
iisreset
Doğrulama: IIS Manager → site → Handler Mappings listesinde *.ashx (SimpleHandlerFactory-Integrated-4.0) satırı görünmelidir.

Web sitesi ve Application Pool

  1. IIS'te autodiscover/autoconfig dosyalarını barındıracak bir site oluştur (örn. fiziksel yol C:\domains\mail\www).
  2. Sitenin Application Pool'unu: .NET CLR v4.0, Managed pipeline = Integrated yap. ("No Managed Code" ise .ashx çalışmaz.)
  3. URL Rewrite Module'ün kurulu olduğundan emin ol.

HTTPS binding'leri (SNI)

Her mail.<domain> ve autoconfig.<domain> ismi için siteye 443 binding ekle: Type = https, host adını yaz, SAN sertifikasını seç ve "Require Server Name Indication" (SNI) işaretle. Böylece tüm domainler aynı siteye, dolayısıyla aynı handler'a düşer.

09

Autodiscover (Outlook)

Aşağıdaki handler, gelen e-postanın domainini kendisi çözer ve mail.<domain> ayarlarını döndürür. Tek dosya tüm domainlere hizmet eder; yeni domain eklerken değişmez. Dosyayı sitenin köküne autodiscover.ashx olarak kaydet.

autodiscover.ashx
<%@ WebHandler Language="C#" Class="Autodiscover" %>
// Her domain kendi mail.<domain> sunucusuna baglanir.
// Domain once e-postadan, yoksa host basligindan turetilir.
using System;
using System.IO;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;

public class Autodiscover : IHttpHandler {
    public void ProcessRequest(HttpContext ctx) {
        ctx.Response.ContentType = "application/xml";
        ctx.Response.ContentEncoding = Encoding.UTF8;

        string body = "";
        using (var r = new StreamReader(ctx.Request.InputStream, Encoding.UTF8))
            body = r.ReadToEnd();

        string email = "";
        var m = Regex.Match(body, "<EMailAddress>\\s*(.*?)\\s*</EMailAddress>", RegexOptions.IgnoreCase);
        if (m.Success) email = m.Groups[1].Value.Trim();

        string domain = "";
        if (email.Contains("@")) domain = email.Substring(email.IndexOf("@") + 1);
        if (string.IsNullOrEmpty(domain)) {
            string host = ctx.Request.Url.Host;
            domain = Regex.Replace(host, "^(mail|autodiscover|autoconfig)\\.", "", RegexOptions.IgnoreCase);
        }
        domain = Regex.Replace(domain, "[^a-zA-Z0-9.\\-]", "");
        string server = "mail." + domain;
        string e = HttpUtility.HtmlEncode(email);

        ctx.Response.Write(
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<Autodiscover xmlns=\"http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006\">\n" +
"  <Response xmlns=\"http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a\">\n" +
"    <Account><AccountType>email</AccountType><Action>settings</Action>\n" +
"      <Protocol><Type>IMAP</Type><Server>" + server + "</Server><Port>993</Port>\n" +
"        <LoginName>" + e + "</LoginName><SSL>on</SSL><SPA>off</SPA><AuthRequired>on</AuthRequired></Protocol>\n" +
"      <Protocol><Type>POP3</Type><Server>" + server + "</Server><Port>995</Port>\n" +
"        <LoginName>" + e + "</LoginName><SSL>on</SSL><SPA>off</SPA><AuthRequired>on</AuthRequired></Protocol>\n" +
"      <Protocol><Type>SMTP</Type><Server>" + server + "</Server><Port>587</Port>\n" +
"        <LoginName>" + e + "</LoginName><Encryption>TLS</Encryption><SPA>off</SPA><AuthRequired>on</AuthRequired><UsePOPAuth>on</UsePOPAuth></Protocol>\n" +
"    </Account></Response></Autodiscover>");
    }
    public bool IsReusable { get { return true; } }
}

web.config (rewrite)

Outlook ayarları /autodiscover/autodiscover.xml yolundan POST ile ister. Bu yolu handler'a yönlendir:

web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite><rules>
      <rule name="autodiscover" stopProcessing="true">
        <match url="^autodiscover/autodiscover\.xml$" />
        <action type="Rewrite" url="autodiscover.ashx" />
      </rule>
      <rule name="autoconfig" stopProcessing="true">
        <match url="^mail/config-v1\.1\.xml$" />
        <action type="Rewrite" url="config-v1.1.ashx" />
      </rule>
    </rules></rewrite>
  </system.webServer>
</configuration>
10

Autoconfig (Thunderbird)

Thunderbird, https://autoconfig.<domain>/mail/config-v1.1.xml adresini sorgular. Aşağıdaki handler'ı sitenin köküne config-v1.1.ashx olarak kaydet (yukarıdaki web.config'teki ikinci rewrite kuralı bu yolu yönlendirir).

config-v1.1.ashx
<%@ WebHandler Language="C#" Class="AutoConfig" %>
using System; using System.Web; using System.Text; using System.Text.RegularExpressions;

public class AutoConfig : IHttpHandler {
    public void ProcessRequest(HttpContext ctx) {
        ctx.Response.ContentType = "application/xml";
        ctx.Response.ContentEncoding = Encoding.UTF8;

        string email = ctx.Request.QueryString["emailaddress"] ?? "";
        string domain = email.Contains("@")
            ? email.Substring(email.IndexOf("@") + 1)
            : Regex.Replace(ctx.Request.Url.Host, "^(mail|autoconfig|autodiscover)\\.", "", RegexOptions.IgnoreCase);
        domain = Regex.Replace(domain, "[^a-zA-Z0-9.\\-]", "");
        string s = HttpUtility.HtmlEncode("mail." + domain);

        ctx.Response.Write(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<clientConfig version=\"1.1\"><emailProvider id=\"" + domain + "\">\n" +
"  <domain>" + domain + "</domain><displayName>" + domain + "</displayName>\n" +
"  <incomingServer type=\"imap\"><hostname>" + s + "</hostname><port>993</port>\n" +
"    <socketType>SSL</socketType><authentication>password-cleartext</authentication><username>%EMAILADDRESS%</username></incomingServer>\n" +
"  <incomingServer type=\"pop3\"><hostname>" + s + "</hostname><port>995</port>\n" +
"    <socketType>SSL</socketType><authentication>password-cleartext</authentication><username>%EMAILADDRESS%</username></incomingServer>\n" +
"  <outgoingServer type=\"smtp\"><hostname>" + s + "</hostname><port>587</port>\n" +
"    <socketType>STARTTLS</socketType><authentication>password-cleartext</authentication><username>%EMAILADDRESS%</username></outgoingServer>\n" +
"</emailProvider></clientConfig>");
    }
    public bool IsReusable { get { return true; } }
}
11

Test ve Doğrulama

1. Handler doğrudan çalışıyor mu?

Tarayıcıda aç: https://mail.<domain>/autodiscover.ashx → boş XML iskeleti dönmeli.

  • İndirme penceresi / boş sayfa → App Pool "No Managed Code" (Bölüm 8).
  • 404 → ASP.NET 4.x kurulu değil (Bölüm 8).

2. Rewrite yolları

  • https://mail.<domain>/autodiscover/autodiscover.xml (Outlook)
  • https://autoconfig.<domain>/mail/config-v1.1.xml?emailaddress=test@<domain> (Thunderbird)

3. İstemci testi

Outlook veya Thunderbird'de hesap ekle; yalnızca e-posta + parola gir. Outlook, SRV yönlendirmesinde bir kerelik "mail.<domain> bu hesabı yapılandırsın mı?" onayı sorar — izin verilince ayarlar otomatik gelir.

Ek araç: Microsoft Remote Connectivity Analyzer → "Outlook Autodiscover" testi ile sunucu tarafını doğrulayabilirsin.
12

Yeni Domain Ekleme — Kontrol Listesi

Kod ve site hiç değişmez. Her yeni domain için yalnızca şunlar yapılır:

  • 1
    DNS: mail + autoconfig A kayıtları, MX, SPF, _autodiscover._tcp SRV (Bölüm 5).
  • 2
    DKIM + DMARC kayıtları (Bölüm 6).
  • 3
    Sertifika: SAN listesine mail.<domain> + autoconfig.<domain> ekle, win-acme'yi yeniden çalıştır (Bölüm 7).
  • 4
    IIS: bu iki isim için 443 binding ekle (SNI işaretli, aynı sertifika).
  • 5
    hMailServer: domaini ve hesapları ekle (Bölüm 3).
  • 6
    Test: Bölüm 11'deki adımlarla doğrula.
13

Sorun Giderme

BelirtiOlası nedenÇözüm
.ashx → 404ASP.NET 4.x kurulu değildism /online /enable-feature /featurename:IIS-ASPNET45 /all + iisreset
.ashx indiriliyor / boşApp Pool "No Managed Code"App Pool → .NET CLR v4.0, Integrated
Handler Mappings'te *.ashx yokASP.NET IIS'e kayıtlı değilYukarıdaki DISM komutu; gerekirse aspnet_regiis -i
/autodiscover.xml 404, .ashx çalışıyorURL Rewrite Module yokURL Rewrite 2.1'i kur
İstemci sertifika uyarısıİsim sertifikada yokSAN'a mail/autoconfig.<domain> ekle, yenile
Gmail "şifrelenmedi" uyarısıGiden STARTTLS kapalıSMTP → Advanced → "Use STARTTLS if available"
Yeni Outlook yanlış sunucu öneriyorBulut önbelleği / eski sağlayıcı kaydıEski sağlayıcı kaydını kaldır; klasik Outlook ile test et
Not"Yeni Outlook for Windows" hesabı bazen Microsoft bulutu üzerinden kurar ve kendi tahminini SRV'nin önüne koyabilir. Bu durumda klasik Outlook veya Thunderbird ile test, sunucu tarafının doğru çalıştığını teyit eder.