
Bir önceki makalede Operator oluşturma konusunu ele almıştık. Bu makalede ise Database Mail konfigürasyonunu yapmış olacağız. Mail konfigürasyonu yapmadan önce sql server üzerinde mail yapısının aktif olup olmadığını kontrol edelim.
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
reconfigure
sp_configure'Database Mail XPs',1
reconfigure
Ya da aşağıdaki diğer etkinleştirme kodu kullanılır. ‘Database Mail XPs’ değeri 0 ise 1 yapmaktadır. Show advanced options’dan kontrol etmemize gerek yoktur.
IF EXISTS (
SELECT 1 FROM sys.configurations
WHERE NAME = 'Database Mail XPs' AND VALUE = 0)
BEGIN
PRINT 'Enabling Database Mail XPs'
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE
EXEC sp_configure 'Database Mail XPs', 1;
RECONFIGURE
END
Aktif hala gelmezse aşağıdaki gibi hata ile karşılaşırız. Yukarıdaki konfigürasyonu yapmazsak bile Database Mail konfigürasyonu yaparken bir uyarı ekranı gelir. Bu uyarı ekranı eğer sp_configure ayarı yapmamışsak Yes butonuna basarak aktif edebiliriz. İkisi de aynı yapıdır. Yukarıdaki ifadeleri gerek yoktur aslında paylaşmakta fayda var.
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.
Not-1: Express sürümünde sql agent olmadığı için database mail conf. bölümü yoktur.
Not-2: SQL Server’da mail gönderimi yapabilmek için SQL Server Agent servisi çalışır durumda olmalıdır. Çünkü mail gönderilecek operatörler sql agent sekmesi altında.
Not-3: Database Mail yapılandırması için sysadmin server role üyesi olmanız gerekir. Database Mail ile e-posta göndermek için msdb veritabanında DatabaseMailUserRole veritabanı rolünün konfigürasyon yapacağımız kullanıcının üye olması gerekmektedir. E -posta göndermek için, kullanıcı aynı zamanda DatabaseMailUserRole sunucu rolünün de üyesi olmalıdır. Bu role sayesinde Sysadmin sabit sunucu rolü ve msdb veritabanında db_owner rolü üyeleri otomatik olarak üyedir. Aslında normal loginler için bu yapı geçerlidir.

SSMS üzerinde Management sekmesi altında Database Mail’e sağ tıklayarak Configure Database Mail’a tıklıyoruz.

Gelen ekranda Skip this page in the future’ı seçip, Next ile bir sonraki adıma geçiyoruz.

Gelen ekranda Set up Database Mail by performing the following tasks’ı seçip Next diyoruz. Diğer kısımların açıklamasını yapacak olursak;
Aşağıdaki resimdeki ekran görüntüsü, SQL Server’ın e-posta bildirimleri göndermesini sağlayan Database Mail özelliğinin ayarlanması için kullanılır. Bu pencerede, yapılandırma yapmak için dört seçenek sunulmaktadır:
1.Set up Database Mail by performing the following tasks: Bu seçenek, Database Mail’i ilk kez kurmak için kullanılır. Üç adımı içerir: Yeni bir e-posta profili oluşturmak ve SMTP hesaplarını belirtmek. Profil güvenliğini belirlemek. Sistem parametrelerini yapılandırmak.
2. Manage Database Mail accounts and profiles: Bu seçenek, daha önce oluşturulmuş e-posta profillerini ve hesaplarını yönetmenize olanak tanır. Sonradan değişiklikleri bu kısımdan yaparız.
3. Manage profile security: Bu seçenek (şu an gri olduğu için seçilemez durumda), oluşturulmuş profillerin güvenlik ayarlarını değiştirmek için kullanılır. Profil oluşturduktan sonra aktif olacaktır.
4. View or change system parameters: Mevcut sistem parametrelerini görüntüleme veya değiştirme seçeneğidir. Bu sihirbazı kullanarak Database Mail’i kurabilir, mevcut ayarları değiştirebilir veya yapılandırabilirsiniz.

Next dedikten sonra bir uyarı ekranı karşımıza gelmektedir. The Database Mail feature is not available. Would you like to enable this feature ifade ile karşılaşırsak Yes diyiyoruz.
Makalenin başında belirtmiştim sp_configure‘den Database Mail etkinleştirilmemişse, aşağıdaki ekranı göreceksiniz. Etkinleştirmek için Yes‘e tıklamanız yeterli. Zaten etkinleştirilmişse, bu ekran görünmeyecektir.

Gelen ekranda Profil Name’den bir isim verip daha sonra SMTP accounts ayarlarını yapacağımız yer olan Add kısmına tıklıyoruz. Bir profil altında 1’den fazla Account Name oluşturulabilir.

Gelen ekranda Account Name kısmında Accounts’a bir isim veriyoruz. Konfigürasyon yapmadan önce aşağıdaki bölümlerin ne işe yaradığını açıklayalım.
Aşağıdaki ekran görüntüsü, SMTP e-posta hesabı için gerekli bilgileri girmeniz isteniyor.
Account name: E-posta hesabınız için bir isim belirtiyoruz. Örneğin, “MailAccount” olarak belirtilmiş.
Description: Bu e-posta hesabının ne için kullanılacağını açıklayın. Örnekte “Mail Gönderme Hesabıdır” olarak belirtilmiş.
Outgoing Mail Server (SMTP) (Giden Posta Sunucusu) kısmında ise aşağıdaki konfigürasyonlar yapılır.
E-mail address: Mail gönderilecek e-posta belirtilmesi gerekmektedir. Bu yapı mail altında oluşturulmuş bir group’da olabilir.
Display name: E-postaları alan kişilere gönderici olarak hangi ismin görüneceğini belirtiriz. Her hangi bir şey yazılmasada olur.
Reply e-mail: Tanımlayacağımız hesaptan göndereceğimiz maillere yanıt vermek için kullanılacak e-mail adresi.
Server name: E-posta göndermek için kullanılan SMTP sunucusunun adını belirtiyoruz. Bu yapı kurumunuzdaki posta sunucusuda olabilir.
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.
Security This server requires a secure connection (SSL): E-posta sunucusunun SSL güvenli bağlantısı gerektirip gerektirmediğini seçebiliriz.
SMTP Authentication (SMTP Kimlik Doğrulama) kısmında ise 3 seçenek karşımıza çıkmaktadır.
Windows Authentication using Database Engine service credentials: SQL Server’ın kendi hizmet kimlik bilgilerini kullanarak kimlik doğrulama database mail yaptığımız local kullanıcı.
Basic authentication: Kullanıcı adı ve parola ile kimlik doğrulama. Bu seçenek seçildiğinde, kullanıcı adı ve parola girilmelidir. Mail adresi şifresinin girilmesi hataya sebebiyet vermektedir. Burada gmail hesabından güvenli uygulama şifresi almanız gerekmektedir.
Anonymous authentication: Kimlik doğrulama yapılmadan bağlantı kurulur.
Not: Şunu belirtmek gerekir. Basic Aut. Kısmında mail adresi ve şifresini yazdığımızda bağlandığımızı söyler. Böyle bir işlem hataya sebebiyet vermektedir.
Bu ayarları yaparak SQL Server’ın, yapılandırılmış bir SMTP sunucusu üzerinden e-posta gönderebilmesini sağlayabilirsiniz.

Yukarıdaki işlemleri onayladıktan sonra OK butonuna basıyoruz. Gelen ekranda Next deyip bir sonraki aşamaya geçiyoruz. Basic Aut. Kısmına mail adresimin gerçek şifresini yazmış oldum.!!!(Makalenin sonunda bu yanlış’ı düzeltilmiş olacağız.)

Aşağıdaki resimde , veritabanı kullanıcılarının veya rollerinin posta profillerine erişimini belirleyebilirsiniz.
Public Profiles: Bu sekmede, veritabanındaki tüm kullanıcılar tarafından erişilebilecek genel posta profilleri listelenir.
Profile Name: “MailProfile” adlı bir profil oluşturulmuş.
Public: “MailProfil” profilinin herkese açık bir profil olup olmadığını seçmek için bir onay kutusu var. Bu kutucuğun işaretlenmesi gerekiyor.
Default Profile: Bu ekranda veritabanındaki posta profillerini genel veya özel olarak belirleyebilir ve bir profilin varsayılan profil olup olmadığını ayarlayabilirsiniz. Eğer bu profilin tüm veritabanı kullanıcıları tarafından kullanılabilir olmasını istiyorsanız, Public kutusunu işaretleyebilir ve varsayılan yapmak istiyorsanız Yes olarak ayarlayabilirsiniz.
Not: No global profile is configured. Specify a profile name in the @profile_name parameter. şeklinde hata ile karşılaşıyorsak bu Default profil yapısının No olarak seçilmesinden dolayıdır.
İşlemlerimiz tamamladıktan sonra Next deyip bir sonraki ekrana geçiyoruz.

Gelen ekranda sonra karşımıza mail parametreleri ile ilgili kısım gelmektedir Next ile devam etmeden ne işe yaradıklarına değinelim.
Account Retry Attempts: Bu parametre, SQL Server’ın bir e-posta gönderme işlemi başarısız olduğunda kaç defa yeniden deneyeceğini belirtir. Ekranda bu sayı “1” olarak ayarlanmış, yani başarısız e-posta gönderimi için yalnızca bir kez daha deneme yapılacaktır.
Account Retry Delay (seconds): Yeniden deneme işlemi öncesinde ne kadar süre bekleneceğini saniye cinsinden belirtir. Bu ayar “60” saniye olarak belirlenmiş, yani bir başarısız denemenin ardından 60 saniye sonra ikinci bir deneme yapılacaktır.
Maximum File Size (Bytes): Bir e-postaya eklenebilecek dosyanın maksimum boyutunu belirtir. Bu ayar 1.000.000 byte (yaklaşık 1 MB) olarak ayarlanmış.
Prohibited Attachment File Extensions: Güvenlik nedeniyle, e-posta ekine eklenemeyecek dosya uzantılarını belirtir. Bu durumda, “.exe”, “.dll”, “.vbs”, ve “.js” uzantılarına sahip dosyaların e-postaya eklenmesi yasaklanmıştır.
Database Mail Executable Minimum Lifetime (seconds): Database Mail işleminin minimum ne kadar süre boyunca çalışacağını saniye cinsinden belirtir. Bu ayar 600 saniye (10 dakika) olarak belirlenmiştir.
Logging Level: Hangi ayrıntı seviyesinde günlük (log) tutulacağını belirtir. Bu ayar “Extended” (Genişletilmiş) olarak belirlenmiş, yani daha fazla ayrıntı kaydedilecektir. Bu seçenek, sorun giderme sırasında daha fazla bilgi sağlar. Bu parametreler, SQL Server üzerinden e-posta gönderim süreçlerini optimize etmek ve güvenliği sağlamak amacıyla yapılandırılmıştır.

Gelen ekranda gerekli kontroller yapıldıktan sonra Finish denilip işlemler sonlandırılır.


Aşağıdaki kod blog’uylada mail gönderme işlemini yapabiliriz.
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'MailProfile',
@recipients = 'sqlegitim23@gmail.com',
@body = 'The database mail configuration was completed successfully.',
@subject = 'Automated Success Message';
GO
Mail’ın kuyruğa alındığını belirtiyor. Buradan gönderme işleminin başarılı olduğunu anlayabiliriz.

Not: Yukarıdaki scripte bulunan msdb.dbo.sp_send_dbmail prosedürünü çalıştırdığınızda No global profile is configured. Specify a profile name in the @profile_name parameter. hatasını alıyorsanız. ilgili profil’in default profil olan bölümün Yes yapılması gerekmektedir.

Database mail üzerine sağ tıklayıp “Send test e-mail” kısmını seçelim.

Gelen ekranda mailin gönderileceği profil ismini, hangi mail adresine gönderim yapılacağı ve mailin içeriğinin geldiği bir mesaj kutucuğu ile karşılaşıyoruz. Bu kısımda send test e-mail diyerek mailimizin düşüp düşmediğinin kontrolünü yapalım.

Yukarıdaki yapılanmadan sonra Send test e-mail diyerek test mailimizi yolluyoruz. Aşağıdaki ekranda başarılı ise Ok butonuna basabiliriz. İşlemimiz başarısız ise Troubleshoot.. kısmına tıklanıp çözüm yollarına bakabiliriz.

Gönderim işleminden sonra aşağıdaki hata mesajını almış oldum. Mail log’larına baktığımda almış olduğum hata mesajları aşağıda görülmektedir.

Birinci almış olduğum hata aşağıda belirtilmektedir.
Message
The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2024-10-01T23:47:59). Exception Message: Could not connect to mail server. (This is usually a temporary error during hostname resolution and means that the local server did not receive a response from an authoritative server).
İkinci almış olduğum hata aşağıda belirtilmektedir.
Message
The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2024-10-02T00:10:03). Exception Message: Cannot send mails to mail server. (The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first. For more information, go to).
Msdb veritabanının altında aşağıdaki komutu çalıştırırsak mail log kayıtlarıyla ilgili bilgi dönmektedir.
SELECT * FROM msdb.dbo.sysmail_event_log;

Troubleshoot.. kısmına tıklayıp microsoft’un önerdiği ayarları yapmaya çalışıyorum. Zaten çoğunu makalenin başında yapmıştık.
Uzun araştırmalar sonucunda Hata mesajını nereden kaynaklandığını bulmuş oldum.
ÇÖZÜM
Araştırmalarımın neredeyse hepsinde Authentication bölümünde tanımlanan adresin gmail hesabı ve günlük hayatta gmail için kullandığımız şifrenin yazılması gerektiğini söylüyor. Ama burada gmail hesabımızdan sadece bu test işlemi için bir şifre almamız gerekiyor. Hata aldığımız kısım aşağıdaki resimde görülmektedir.

Aşağıdaki adımlar izlenir.
İlk başta mail konfigürasyon için tanımlamış olduğumuz Gmail Hesab’ına giriş yapılır.

Daha sonra hesabımızın olduğu kısımda Google Hesabınızı yönetin seçeneğine tıklanır.

Google hesabımızda Uygulama şifreleri yazılır. İngilizce kullanıyorsanız App password yazılması gerekmektedir.
Not: Uygulama şifresi oluşturmak için Google Hesabınızda 2 Adımlı Doğrulama‘yı etkinleştirmiş olmanız gerekir.

Bu yapı için bizden ilgili hesabımızın şifresini tekrardan sormaktadır. Şifremizi girip tekrardan giriş yapıyoruz.

Yukarıda Gmail şifremizi girdikten sonra Gelen ekranda uygulamamıza özel bir şifre alma bölümü karşımıza çıkmaktadır. Bu bölüm daha az güvenli ve hesabımızın herhangi bir uygulama içinde çalışacağını söylemektedir.

Uygulama adını kendi yapımıza uygun bir şekilde belirledikten sonra oluştur seçeneği ile uygulama bazlı bir şifre almış olacağız. Uygulama adı bölümü rastgele bir şeyde yazılabilir.

Database mail konfigürasyon ekranına yapıştıracağımız 16 karakterli bir şifre veriyor. Bu şifre bizim gmail şifremiz değil uygulama için verilmiş olan bir şifre..

Yukarıda bize verilen 16 karakterli şifremizi alıp Database Mail konfigürasyon ekranına yapıştırıyoruz. Oluşturmuş olduğumuz Profilden düzenleme yapmak için aşağıdaki bölüme çıklanır.

Gelen ekranda View,change,or delete an existing account kısmına tıklanır.

Gelen ekranda Basic Authentication bölümüne tıklanır.

Gmail hesabından aldığımız şifre Password kısmına yapıştırılır.

Yukarıdaki işlemleri yaptıktan sonra tekrardan Database Mail üzerine sağ tıklayarak send test e-mail’e tıklıyoruz. Gelen ekranda Mail’i hangi mail hesabına yollamak istiyorsak onu seçiyoruz.

Yukarıda bilgileri doldurduktan sonra Mail işleminin başarılı olduğunu aşağıdaki test mailinde görmekteyim.

Dikkat ederseniz gönderici adresi bizim Mail profilde tanımladığımız adres tüm maillerde başka bir profil seçilmediği durumda gönderen sqlegitim23 olacaktır. Yukarıdaki örnektede kendimize mail göndermiş olduk.

Bazı kaynaklar SQL Agent altında database mail’ın aktif edilmesi gerektiğini söylüyor. Bu doğru olmayan bir işlem bu değer disable olmasına rağmen mailimiz başarılı bir şekilde gelmiş oldu. Yukarıdaki örneğimizde bizim aşağıdaki konfigürasyondan bağımsız haraket ediyoruz. Aşağıdaki yapının aktif edilmesi oluşturduğumuz Operator’un bu mail yapısı üzerinden mail almış olacaktır.


Şu unutulmaması gerekir. Başlangıçta profil oluşturarak kullanıcıya Mail gönderen hesabı belirlemiş olduk. Aşağıdaki resimde database mail profil başka bir mail adresinin profil adresi kime yollamak istiyorsak TO kısmına o mail adresi yazılır. Yani aşağıdaki resimde 123 profil altında tanımlanan mail adresinden sqlegitim23 hesabına mail atmış olduk.

Aşağıdaki resimde de görüldüğü gibi farklı profil altında oluşturulmuş farklı kullanıcı ile sqlegitim23’e mail göndermiş olduk.

Mail konfigürasyonumuzun tam kurulumunu yukarıda yapmış olduk. Operator’un alert veya sql bazında herhangi bir işlemden haberdar olabilmesi için SQL Agent altında düzenleme yapılması gerekmektedir. Bu işlem için SQL Server Agent sağ tıklanıp Properties kısmına gelelim. Alert System üzerine gelerek oluşturduğumuz Enable mail profile durumunu aktif hale getirelim ve hangi profil üzerinden işlemlerimizi gerçekleştireceğimiz seçelim.
Operatörler’e mail yollanacağı zaman aşağıdaki mail profilini kullanacaklar. Bu değişikliği yaptıktan sonra SQL Server Agent‘ı Restart ediyoruz. Yoksa mail işlemi operatörler için gerçekleşmez.


Not: Bazı makalelerde mail konfigürasyonu için aşağıdaki resimdeki 2 ayarın açılması gerektiğini söylüyor. Bende bu kısımlar kapalı olmasına rağmen sorunsuz bir şekilde çalışıyor.

Görmeniz açısından paylaşıyorum. Yukarıdaki resimdeki Tüm ayarları görüntüleyin bölümüne girilir. Gelen ekranda Yönledirme ve POP/IMAP’ı etkileştirin kısmı işaretlenir. Bende görmüş olduğunuz gibi kapalı bir sıkıntı yaşamadım.

İkinci yapılaması gereken hesap yönetiminden aşağıda resimde bulunan yerin aktif edilmesi gerekmektedir.


Bu makalede Sql Server’da Database Mail konusunu uygulamalı bir şekilde görmüş olduk. Başka bir makalede görüşmek üzere.
“O halde gücünüzün yettiği kadar Allah’tan korkun, dinleyin, itaat edin, kendi iyiliğinize olarak harcayın. Kim nefsinin cimriliğinden korunursa işte onlar kurtuluşa erenlerdir.” Teğabun-16