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:
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.
Ö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ı)
| Port | Servis | Açıklama |
|---|---|---|
25 | SMTP | Sunucular arası mail teslimi (inbound/outbound) |
587 | SMTP (Submission) | İstemci gönderimi, STARTTLS |
465 | SMTP (SSL) | İstemci gönderimi, doğrudan SSL (opsiyonel) |
993 | IMAP | SSL/TLS |
995 | POP3 | SSL/TLS |
80 / 443 | HTTP/HTTPS | IIS — autodiscover/autoconfig ve sertifika doğrulama |
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
- hMailServer Administrator → Domains → Add.
- Domain adını gir:
<domain>→ Save. - Eklenen domain altında Accounts → Add 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:
| Protokol | Port | Bağlantı güvenliği |
|---|---|---|
| IMAP | 993 | SSL/TLS |
| POP3 | 995 | SSL/TLS |
| SMTP | 587 | STARTTLS |
| SMTP | 25 | Sunucular arası teslim |
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:
- Settings → Protocols → SMTP → Advanced sekmesinde "Use STARTTLS if available" seçeneğini işaretle. Bu, karşı sunucu destekliyorsa giden bağlantıyı şifreler.
- 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.
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.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.
# 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"
autodiscover.<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).
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ı
- Bir RSA anahtar çifti üret (OpenSSL ile): özel anahtar sunucuda kalır, açık anahtar DNS'e yazılır.
- 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 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:
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.
_dmarc.<domain> TXT "v=DMARC1; p=none; rua=mailto:postmaster@<domain>; fo=1"
SPF=PASS, DKIM=PASS, DMARC=PASS satırlarını kontrol et.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çinautoconfig.<domain>— Thunderbird için
wacs.exe'yi yönetici olarak çalıştır.- Manuel host girişi seçeneğini kullanarak tüm
mail.<domain>veautoconfig.<domain>isimlerini tek sertifikada topla. - win-acme bunları IIS sitesine bağlar (443 binding) ve zamanlanmış görevle otomatik yeniler.
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:
dism /online /enable-feature /featurename:IIS-ASPNET45 /all iisreset
*.ashx (SimpleHandlerFactory-Integrated-4.0) satırı görünmelidir.Web sitesi ve Application Pool
- IIS'te autodiscover/autoconfig dosyalarını barındıracak bir site oluştur (örn. fiziksel yol
C:\domains\mail\www). - Sitenin Application Pool'unu: .NET CLR v4.0, Managed pipeline = Integrated yap. ("No Managed Code" ise
.ashxçalışmaz.) - 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.
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.
<%@ 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:
<?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>
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).
<%@ 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; } } }
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.
Yeni Domain Ekleme — Kontrol Listesi
Kod ve site hiç değişmez. Her yeni domain için yalnızca şunlar yapılır:
- 1DNS:
mail+autoconfigA kayıtları,MX,SPF,_autodiscover._tcpSRV (Bölüm 5). - 2DKIM + DMARC kayıtları (Bölüm 6).
- 3Sertifika: SAN listesine
mail.<domain>+autoconfig.<domain>ekle, win-acme'yi yeniden çalıştır (Bölüm 7). - 4IIS: bu iki isim için 443 binding ekle (SNI işaretli, aynı sertifika).
- 5hMailServer: domaini ve hesapları ekle (Bölüm 3).
- 6Test: Bölüm 11'deki adımlarla doğrula.
Sorun Giderme
| Belirti | Olası neden | Çözüm |
|---|---|---|
.ashx → 404 | ASP.NET 4.x kurulu değil | dism /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 yok | ASP.NET IIS'e kayıtlı değil | Yukarıdaki DISM komutu; gerekirse aspnet_regiis -i |
/autodiscover.xml 404, .ashx çalışıyor | URL Rewrite Module yok | URL Rewrite 2.1'i kur |
| İstemci sertifika uyarısı | İsim sertifikada yok | SAN'a mail/autoconfig.<domain> ekle, yenile |
| Gmail "şifrelenmedi" uyarısı | Giden STARTTLS kapalı | SMTP → Advanced → "Use STARTTLS if available" |
| Yeni Outlook yanlış sunucu öneriyor | Bulut önbelleği / eski sağlayıcı kaydı | Eski sağlayıcı kaydını kaldır; klasik Outlook ile test et |