Veritabanı yöneticileri veya yazılım geliştiriciler olarak sistemlerimizin bizimle konuşmasını isteriz. Stokların kritik seviyeye düşmesi, planlanmış bir yedekleme işinin (Job) hata vermesi, yeni bir üyelik aktivasyonu veya bir müşterinin sipariş vermesi gibi durumlarda anlık bilgilendirme mailleri hayati önem taşır.

SQL Server, Database Mail mimarisi sayesinde harici bir uygulamaya ihtiyaç duymadan, doğrudan T-SQL kodları veya SQL Server Agent üzerinden e-posta göndermemize olanak tanır.

Bu rehberimizde, SQL Server üzerinden e-posta gönderim altyapısını sıfırdan nasıl kuracağınızı ve dinamik e-postaları nasıl hazırlayacağınızı adım adım inceliyoruz.

Yol Haritamız:

  1. SQL Server'da Database Mail Özelliğini Aktif Etme (Enable)
  2. Arayüz (GUI) ile Yeni Profil ve SMTP Hesabı Oluşturma
  3. Database Mail ile İlk Test Mailini Gönderme
  4. Mail Durumlarını ve Log Kayıtlarını İnceleme
  5. sp_send_dbmail Prosedürü ile Dinamik Mail Gönderme Örnekleri (Text & HTML)
  6. SQL Server'daki Mail Ayarlarını T-SQL ile Listeleme

1. SQL Server'da Database Mail Nasıl Aktif Edilir?

SQL Server'da güvenlik yapılandırmaları gereği Database Mail bileşeni varsayılan olarak kapalı gelir. Eğer aktifleştirmeden mail göndermeye çalışırsanız, sistem size Database Mail XPs bileşeninin kapatıldığına dair bir güvenlik engeli hatası verecektir.

Bu özelliği etkinleştirmek için SQL Server Management Studio (SSMS) üzerinde yeni bir sorgu penceresi açıp aşağıdaki T-SQL kod bloklarını çalıştırmanız yeterlidir:

SQL


-- Gelişmiş seçenekleri görünür yapıyoruz
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO

-- Database Mail özelliğini aktif hale getiriyoruz
EXEC sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE;
GO

2. Arayüz Kullanarak Yeni Profil ve SMTP Hesabı Oluşturma

Sistemimizin e-posta gönderebilmesi için arka planda bir SMTP sunucusuna, bu sunucuya erişecek bir hesaba ve bu hesapları kapsayan bir profile ihtiyacı vardır.

Önemli Not: İşlemlere başlamadan önce SQL Server Agent servisinizin bilgisayarınızda veya sunucunuzda "Running" (Çalışıyor) durumunda olduğundan emin olun.

Adım Adım Kurulum:

  1. Object Explorer panelinden sırasıyla Management -> Database Mail klasörüne gelin. Sağa tıklayarak Configure Database Mail seçeneğini seçin.
  2. Karşınıza çıkan sihirbaz penceresinde Next butonuna basarak ilerleyin.
  3. Set up Database Mail by performing the following tasks seçeneğini işaretleyip devam edin (Bu seçenek sıfırdan yeni profil ve hesap kurmanızı sağlar).
  4. New Profile ekranında profilinize bir ad (Örn: Medium SQL Server Mail) ve açıklama yazın. Ardından hemen altta bulunan Add... butonuna tıklayarak ilişkili SMTP hesabını oluşturmaya başlayın.
  5. New Database Mail Account ekranını SMTP servis sağlayıcınızın (Gmail, Outlook veya Şirket SMTP sunucunuz) bilgilerine göre doldurun:
  6. Email Address: Mailin gönderileceği asıl adres.
  7. Display Name: Alıcının gelen kutusunda göreceği isim (Örn: Sistem Bildirimleri).
  8. Server Name: SMTP sunucu adresi (Örn: smtp.gmail.com).
  9. Port Number: Genellikle 587 veya SSL için 465.
  10. Kimlik Doğrulama (Authentication): Temel kimlik doğrulamayı seçerek mail adresinizi ve şifrenizi girin. *(Eğer Gmail kullanıyorsanız ve 2 Adımlı Doğrulama aktifse, buraya normal şifrenizi değil Google Hesap ayarlarından alacağınız "Uygulama Şifresi"*ni girmelisiniz).
  11. Hesabı ekledikten sonra profil penceresine geri döneceksiniz. Next diyerek ilerleyin. Karşınıza gelen pencerede profilinizi Public (Herkese Açık) veya Private (Kişiye Özel) yapabilirsiniz. Genel sistem bildirimleri için Public yapıp işaretlemeniz önerilir.
  12. Sonraki adımları varsayılan ayarlarla geçip Finish butonuna basarak sihirbazı tamamlayın. Tüm adımların karşısında Success yazısını gördüyseniz kurulum başarıyla tamamlanmıştır.

3. Database Mail ile İlk Test Mailini Gönderme

Yaptığımız ayarların doğru çalışıp çalışmadığını test etmek oldukça kolaydır.

  1. Database Mail klasörüne tekrar sağ tıklayın ve bu kez Send Test E-Mail... seçeneğini seçin.
  2. Açılan pencerede Database Mail Profile kısmından az önce oluşturduğunuz profili seçin.
  3. To: kısmına kendi kişisel mail adresinizi yazın, test başlığı ve içeriği ekleyip Send Test E-Mail butonuna basın.

Mailiniz başarıyla kuyruğa gönderilecektir. Şimdi gelen kutunuzu kontrol edebilirsiniz!

4. Mail Log Kayıtlarına Nasıl Bakılır?

Eğer test mailiniz gelen kutunuza ulaşmadıysa veya ilerleyen süreçlerde maillerin gidip gitmediğinden şüphelenirseniz, SQL Server'ın tuttuğu log kayıtlarını inceleyebilirsiniz.

Database Mail klasörüne sağ tıklayıp View Database Mail Log seçeneğine tıkladığınızda açılan ekranda, gönderilemeyen maillerin altında yatan sunucu ve port tabanlı hataları detaylıca görebilir, buna göre aksiyon alabilirsiniz.

5. sp_send_dbmail Prosedürü ile Kod Üzerinden Mail Gönderme

Arayüzle uğraşmadan, doğrudan yazdığınız scriptlerin, trigger'ların veya job'ların içerisinden mail tetiklemek için msdb.dbo.sp_send_dbmail sistem saklı yordamını (stored procedure) kullanırız.

Sık kullanılan parametreleri şunlardır:

  1. @profile_name: Maili gönderecek profilin adı.
  2. @recipients: Alıcıların mail adresleri (Birden fazla ise araya ; konur).
  3. @subject: Mailin konusu.
  4. @body: Mailin içeriği.
  5. @body_format: İçeriğin türü (TEXT veya HTML).

Örnek 1: Düz Metin (TEXT) Formatında Dinamik Şifre Gönderimi

Aşağıdaki örnekte veritabanındaki bir müşterinin bilgilerini çekerek ona özel tek kullanımlık bir aktivasyon kodu üretiyor ve düz metin olarak gönderiyoruz:

SQL


DECLARE @FullName VARCHAR(100)
, @Email VARCHAR(65)
, @ActivationCode INT
, @Message VARCHAR(MAX);

BEGIN
-- Müşteri bilgilerini alıyoruz
SELECT @FullName = CONCAT(FirstName, ' ', LastName), @Email = Email
FROM Hrms.Person.Customers WHERE Id = 1;

-- Rastgele 5 haneli kod üretiyoruz
SET @ActivationCode = RAND() * 55000 + 10000;

-- Dinamik mesaj içeriği oluşturuluyor
SET @Message = CONCAT('Sayın ', @FullName,
', Sisteme kayıt için gerekli tek kullanımlık şifreniz: ', @ActivationCode,
'. Lütfen bu şifreyi kimseyle paylaşmayınız!!!');

-- Mail gönderme prosedürünü tetikliyoruz
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Medium SQL Server Mail',
@recipients = @Email,
@body = @Message,
@subject = 'Sistem Hesabı Aktifleştirme Kodu';
END

Örnek 2: HTML ve CSS Tasarımlı Profesyonel Mail Gönderimi

Alıcıya çok daha şık, kurumsal bir e-posta ulaştırmak istiyorsak @body_format = 'HTML' parametresini kullanarak inline CSS ile zenginleştirilmiş HTML tasarımları gönderebiliriz:

SQL


DECLARE @FullName VARCHAR(100)
, @Email VARCHAR(65)
, @ActivationCode INT
, @Message VARCHAR(MAX);

BEGIN
SELECT @FullName = CONCAT(FirstName, ' ', LastName), @Email = Email
FROM Hrms.Person.Customers WHERE Id = 1;

SET @ActivationCode = RAND() * 55000 + 10000;

-- HTML şablonu oluşturuluyor
SET @Message = CONCAT('
<html>
<head>
<style>
.username { color: red; }
#activation-box {
font-size: 14px;
border: 1px solid #0752F7;
background-color: #4374E0;
color: #FFFFFF;
padding: 10px;
width: 400px;
}
</style>
</head>
<body>
<div id="activation-box">Aktivasyon İşlemi Bildirimi</div>
<p>Sayın <strong class="username">', @FullName, ',</strong></p>
<p>Sisteme kayıt için gerekli tek kullanımlık şifreniz: <b>', CONVERT(VARCHAR, @ActivationCode), '</b></p>
<p>Güvenliğiniz için şifrenizi kimseyle paylaşmayınız.</p>
</body>
</html>');

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Medium SQL Server Mail',
@recipients = @Email,
@subject = 'Sistem Hesabı Aktifleştirme Kodu (HTML)',
@body = @Message,
@body_format = 'HTML';
END

Hatta bu HTML yapısını daha da genişleterek içerisine veritabanından çektiğiniz sipariş detaylarını bir <table> içerisine basabilir, şirket logonuzu veya ürün görsellerinizi <img src="..."> etiketleriyle mail gövdesine ekleyebilirsiniz.

6. Mevcut Mail Ayarlarını T-SQL ile Sorgulama

Veritabanında daha önceden hangi profillerin tanımlandığını, hangi hesapların hangi SMTP sunucularını kullandığını arayüzleri tek tek açmadan, sistem tablolarına msdb veritabanı üzerinden doğrudan sorgu atarak öğrenebilirsiniz.

Tanımlı Profilleri Listeleme:

SQL


SELECT profile_id, name, description FROM msdb.dbo.sysmail_profile;

Tanımlı SMTP Hesaplarını Listeleme:

SQL


SELECT account_id, name, email_address, display_name, replyto_address
FROM msdb.dbo.sysmail_account;

Hangi Profilin Hangi Hesabı Kullandığını Görme:

SQL


SELECT profile_id, account_id, sequence_number FROM msdb.dbo.sysmail_profileaccount;

SMTP Sunucu ve Port Bilgilerini Görme:

SQL


SELECT account_id, servertype, servername, port, username FROM msdb.dbo.sysmail_server;

Özet

SQL Server üzerinde Database Mail yapılandırmasını tamamladıktan sonra süreç tamamen sizin yaratıcılığınıza ve iş ihtiyaçlarınıza kalıyor. İster otomatik raporlama sistemleri kurun, ister kritik veri değişimlerinde anlık uyarı mekanizmaları (Trigger tabanlı) geliştirin; sp_send_dbmail iş yükünüzü hafifletmek için her zaman elinizin altında olacaktır.

Sorularınızı ve karşılaştığınız hataları yorumlar kısmında paylaşabilirsiniz. Güvenli ve stabil veritabanları dilerim!