SQL Server ile Mail Nasıl Gönderilir?

Merve KÜÇÜKDOĞRU
Machine Learning Turkiye
8 min readJul 8, 2023

Herkese merhaba,

Bu yazımda sizlere “SQL Server ile Mail Nasıl Gönderilir?” konusunu tüm detayları ile anlatmaya çalışacağım.

SQL Server’da mail göndermemiz gereken durumlarda (stok azalması, sipariş işlemleri, üyelik aktivasyonu, Job hata bilgilendirmesi vb.) Database Mail’i kullanabiliriz.

Konu başlıklarımız sırası ile aşağıdaki gibidir:

  1. SQL Server’da Database Mail Nasıl Enable Yapılır?
  2. SQL Server’da Yeni Profil Nasıl Oluşturulur?
  3. Database Mail ile Test Maili Nasıl Gönderilir?
  4. Database Mail ile Log Kayıtlarına nasıl bakılır?
  5. sp_send_dbmail prosedürü ile Mail Gönderme Nasıl Yapılır?
  6. SQL Server’da tanımlı Profil, Hesap ve Sunucular Nasıl Listelenir?

Hazırsanız başlayalım.

1. SQL Server’da Database Mail Nasıl Enable Yapılır?

SQL Server’da mail göndermeyi aktif etmek için aşağıdaki kod satırları ile mail gönderimini aktif hale getiririz.

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE
GO

Mail göndermeyi aktif hale getirmediğimizde aşağıdaki şekilde hata alırız.

SQL Server blocked access to procedure 'dbo.sp_send_dbmail' of component 
'Database Mail XPs' because this component is turned off as part of the
security configuration for this server. A system administrator can enable
the use of 'Database Mail XPs' by using sp_configure. For more information
about enabling 'Database Mail XPs', search for 'Database Mail XPs' in
SQL Server Books Online.

2. SQL Server’da Yeni Profil Nasıl Oluşturulur?

SQL Server’da mail gönderimi yapabilmek için “SQL Server Agent” servisi çalışır durumda olmalıdır.

Mail gönderimi yapabilmek için profil, hesap ve sunucu gerekmektedir.

Object Explorer → Management → Database Mail → Configure Database Mail seçeneği seçilerek profil eklemeye başlayabiliriz.

Karşımıza gelen ekranda Next butonuna tıklayarak ilerleyebiliriz.

✔ “Set up Database Mail by performing the following tasks:” seçeneğini seçtiğimizde yeni bir profil, hesap, mail sunucusu kurulumuna başlarız.

✔ “Manage Database Mail accounts and profiles” seçeneği ile yeni bir profil, hesap ekleyebilir; daha önce tanımladığımız hesap ve profilleri görüntüleyebilir, düzenleyebilir ya da silebiliriz.

Yeni bir profil, hesap ve sunucu ekleyeceğimiz için varsayılan olarak seçili gelen seçenek devam edebiliriz.

İlk olarak yeni ekleyeceğimiz profilin isim ve açıklama alanını doldururuz. Daga sonra yeni bir hesap eklemek için “Add” butonuna tıklarız.

“New Database Mail Account” ekranında ki bilgileri aşağıdaki şekilde doldurabiliriz.

☑ E-mail address: SQL Server Database Mail’de kullanılacak mail adresi

☑ Display Name: Mail’de görünmesini istediğimiz isim

☑ Reply e-mail: Tanımlayacağımız hesaptan göndereceğimiz maillere yanıt vermek için kullanılacak e-mail adresi

☑ Server name: SMTP sunucu adı

☑ Port number: SMTP sunucularında kullanılan port numarası (SMTP sunucularında 25 ya da 587, SSL ile mail göndermek istediğimizde 465 portu kullanılır.)

📌 Burada dikkat etmemiz gereken Gmail hesabımızda 2 adımlı doğrulama aktif ise Gmail hesap ayarlarından uygulama şifresi almalıyız.

Mail hesabımızı tanımladık, OK butonuna tıklayarak bir sonraki aşamaya geçebiliriz.

Next butonuna tıklayarak bir sonraki aşamaya geçeriz. Eklediğimiz profilin herkese açık olmasını istiyorsak “public” yapmamız gerekir. Kişiye özel profil tanımı yapmak istediğimizde ise “private” profil kullanırız.

“Next” butonuna tıklayarak işlemimize devam edebiliriz.

Herhangi bir ayar yapmadan “Next” butonuna tıklayarak devam edebiliriz.

Profil, hesap ve sunucu kurulumumuz tamamlandı. “Finish” butonuna tıklayarak ilerleyebiliriz.

Bütün işlemlerimiz “Success” olduğunda işlemimiz tamamlanmıştır. “Close” butonuna tıklayarak ekranı kapatabiliriz.

Mail gönderebilmememiz için bütün ayarlarımız tamamlandı.

3. Database Mail ile Test Maili Nasıl Gönderilir?

Management → Database Mail → Send Test E-Mail seçeneğini seçerek test mail gönderme ekranını açabiliriz.

Karşımıza gelen ekranda To kısmına mail göndereceğimiz adres, Body kısmına mailde görmek istediğimiz içeriği yazarız ve “Send Test E-mail” butonuna tıklarız.

Mail kuyruğa alındı, OK butonuna tıklayarak ekranı kapatabiliriz.

Şimdi gelen kutumuzu kontrol edebiliriz. 😊

4. Database Mail ile Log Kayıtlarına nasıl bakılır?

SQL Server’da gönderilen maillerin başarılı ya da başarısız olduğunu kontrol etmek için log kayıtlarına bakabiliriz.

Management → Database Mail → View Database Mail Log seçeneğini seçerek bütün log kayıtlarını görüntüleyebiliriz.

Mail gönderimi başarısız olduğunda burada ki hata mesajını inceleyerek gerekli düzenlemeleri yapabiliriz.

5. sp_send_dbmail prosedürü ile Mail Gönderme Nasıl Yapılır?

SQL Server’da mail göndermek istediğimizde sp_send_dbmail prosedürünü kullanabiliriz.

Prosedürde kullanılan bazı parametreler aşağıdaki gibidir:

1. [@profile_name]

✔ sysname veri türündedir.

✔ Mailin gönderileceği profilin adıdır.

✔ Varsayılan değeri NULL’ dur.

✔ profile_name belirtilmediğinde kullanıcı için tanımlı özel(private) profil varsayılan olarak kullanılır, özel profil yoksa profile_name zorunlu olarak belirtilmelidir.

2. [@recipients]

✔ recipients parametresi VARCHAR(MAX) veri türündedir.

✔ Maillin gönderileceği alıcı mail adresleridir. Birden fazla mail gönderileceğinde “;” ile mail adresleri yazılır.

✔ Opsiyonel bir parametredir. recipients parametresi belirtilmediğinde @copy_recipients ya da @blind_copy_recipients parametrelerinden bir tanesi belirtilmek zorundadır. Aksi takdirde mail hata verecektir.

3. [@subject]

✔ NVARCHAR(255) veri türündedir.

✔ Gönderilecek mailin konusudur.

✔ Herhangi bir konu belirtmediğimizde varsayılan olarak “SQL Server Message” konu başlığı geçerli olur.

4. [@body]

✔ NVARCHAR(MAX) veri türündedir.

✔ Mailin içerik kısmıdır.

✔ Varsayılan değeri NULL’ dur.

5. [@body_format]

✔ VARCHAR(20) veri türündedir.

✔ Varsayılan format “TEXT”’tir.

Örnek olarak TEXT formatında bir mail gönderelim.

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

BEGIN

SET @FullName = (SELECT CONCAT(c.FirstName, ' ', c.LastName)
FROM Hrms.Person.Customers c WHERE Id=1)
SET @Email = (SELECT c.Email FROM Hrms.Person.Customers c WHERE Id=1)
SET @ActivationCode=RAND()*55000+10000
SET @Message = CONCAT('Sayın ', @FullName,
', Sisteme kayıt için gerekli tek kullanımlık şifreniz: ', @ActivationCode,
' Tek kullanımlık şifrenizi kimseyle paylaşmayınız!!!');

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Medium SQL Server Mail',
@recipients=@Email,
@body=@message,
@subject='Sistem Hesabı Aktifleştirme Kodu'

END

Mail kuyruğa eklendi, gelen kutumuzu kontrol edebiliriz.

HTML formatında bir mail göndermek istediğimizde kod aşağıdaki şekilde olacaktır.

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

BEGIN

SET @FullName = (SELECT CONCAT(c.FirstName, ' ', c.LastName)
FROM Hrms.Person.Customers c WHERE Id=1)
SET @Email = (SELECT c.Email FROM Hrms.Person.Customers c WHERE Id=1)
SET @ActivationCode=RAND()*55000+10000
SET @Message = CONCAT('
<html>
<head>
<style>
.username {
color: red;
}
#activation-code {
font-size: 14px;
border: 1px solid #0752F7;
background-color: #4374E0;
color: #FFFFFF;
margin: 10px 0;
width: 400px;
}
</style>
</head>
<body>
<div id="activation-code">Aktivasyon İşlemi</div>
Sayın <strong class="username">', @FullName, ',</strong><br/><br/>',
'Sisteme kayıt için gerekli tek kullanımlık şifreniz: <b>',
CONVERT(VARCHAR, @ActivationCode), '</b><br><br/>',
'Tek kullanımlık şifrenizi kimseyle paylaşmayınız!!!<br><br><br><br>
</body>
</html>'
)

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

END

HTML etiketleri kullanarak mail içeriğimize tablo, resim, link ekleyebiliriz.

Tablo ve görsel eklemek istediğimizde kodumuzu aşağıdaki şekilde düzenleyebiliriz.

DECLARE @FullName VARCHAR(100)
, @ProductName VARCHAR(200)
, @Piece INT
, @UnitPrice DECIMAL(12, 3)
, @Email VARCHAR(65)
, @ActivationCode INT
, @Message VARCHAR(MAX)

BEGIN

SET @FullName = (SELECT CONCAT(c.FirstName, ' ', c.LastName)
FROM Hrms.Person.Customers c WHERE Id=1)
SET @ProductName = 'Macbook Air 13'' M1 8gb 256gb Ssd Uzay Grisi Dizüstü Bilgisayar MGND3TU/A';
SET @Piece = 1;
SET @UnitPrice = 23.499;

SET @Email = (SELECT c.Email FROM Hrms.Person.Customers c WHERE Id=1)
SET @ActivationCode=RAND()*55000+10000
SET @Message = concat('
<html>
<head>
<style>
.username {
color: red;
}
.order-table {
width:100%;
text-align:center;
width: auto;
border-color:skyblue;
}
.order-img {
width:300px;
height:auto;
margin:0 15px 0 200px;
align:center;
}
</style>
</head>
<body>
Sayın <strong class="username">', @FullName, ';</strong><br/><br/>',
'<b>Siparişiniz alınmıştır. </b>
En kısa sürede kargoya verilecektir.<br><br>',
'Aldığınız ürünler aşağıdaki gibidir:<br><br>',
'<table class="order-table" border="1">
<thead>
<tr>
<th>Ürün Adı</th>
<th>Adet</th>
<th>Birim Fiyat</th>
<th>Toplam Fiyat</th>
</tr>
</thead>',
'<tbody>
<tr>
<td>', @ProductName, '</td>
<td>', @Piece, '</td>
<td>', @UnitPrice , ' TL', '</td>
<td>', @Piece, ' x ', @UnitPrice, ' = ', @UnitPrice * @Piece, ' TL</td>
</tr>
</tbody>
</table><br><br>',

'<a href="http://medium.com/@mervekucukdogru" target="_blank"><img class="order-img" src="https://cdn.dsmcdn.com/ty454/product/media/images/20220614/15/125590297/117920493/1/1_org_zoom.jpg" alt="Apple Macbook Air 13'' M1 8gb 256gb Ssd Uzay Grisi Dizüstü Bilgisayar MGND3TU/A" title="Apple Macbook Air 13'' M1 8gb 256gb Ssd Uzay Grisi Dizüstü Bilgisayar MGND3TU/A"></a>'
)

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Medium SQL Server Mail',
@recipients=@Email,
@subject='Sipariş Bilgilendirme',
@body=@message,
@body_format = 'HTML'

END

6. SQL Server’da tanımlı Profil, Hesap ve Sunucular Nasıl Listelenir?

▶ SQL Server’da tanımladığımız profilleri görmek için msdb.dbo.sysmail_profile tablosunu kullanırız.

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

▶ Tanımlı hesapları görmek istediğimizde msdb.dbo.sysmail_account tablosunu kullanırız.

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

▶ Hangi profilde hangi hesabın kullanıldığı görmek istediğimizde ise msdb.dbo.sysmail_profileaccount tablosu ile görüntüleyebiliriz.

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

▶ SQL Server’da kullanılan mail sunucusunu görmek istediğimizde ise msdb.dbo.sysmail_server tablosunu kullanabiliriz.

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

Zaman ayırıp okuduğunuz için teşekkür ederim. Umarım faydalı olmuştur. Bir sonraki yazıda görüşmek üzere…

Sağlıcakla kalın.😊

--

--