Bu makalemizde web sitelerinde sıklıkla başvurduğumuz bir konu olan mail gönderme işlemlerini ele alacağız.Mail gönderme işlemi .NET te System.Net.Mail; sınıfı ile çok kolay bir şekilde yapılabilmekte ancak bu işlemi uygulamamız üzerinde değil de veritabanında halletmek istiyorsak ve Oracle kullanıyorsak UTL_MAIL.SEND fonksiyonunu kullanmak mantıklı olacaktır.Özelikle belli zamanlarda sistemi yormadan bütün kullanıcılara mail atma işini veritabanı tarafında çözmek akılcı bir çözüm olacaktır. Bunu bir procedür yapıp job’a bağladığımızda istediğimiz saatte istediğimiz kullanıcılara atacak şekilde düzenleyebiliriz.
Oracle’da UTL_MAIL package’ı default olarak gelmemekte ve kendimiz bu package’ı eklemek durumundayız. Bu package’ı kullanılabilir hale getirme için yapmamız gerekenler :
Başlat-Çalıştır-cmd
Daha sonra C:> dizinine gelinir ve
C:>sqlplus sys as sysdba yazılarak sql programı çalıştırılır.
ve veritabanına admin olarak bağlanılır.
*** Sqlplus sorgularımızı çalıştırabileceğimiz bir arayüz.Siz bunun için farklı bir araçtan da faydalanabilirsiniz.
SQL> start C:oracleproduct10.2.0db_1RDBMSADMINutlmail.sql
package ve synonim yaratılır
SQL> start C:oracleproduct10.2.0db_1RDBMSADMINprvtmail.plb
Package body yaratılır.
Bu işlemleri illaki komut komut satırında yapmak zorunda değiliz Bu package’ın scriptlerini belirtilen dizinden
bulup Toad’tan da çalıştırabiliriz.Yaratıldığından emin olmak için SYS şeması altında Package’lara bakabiliriz.
Daha sonra smtp_out_server ‘ın mail serverını set etmemiz gerekiyor. Bunun içinde aşağıdaki scripti çalıştırmalıyız.
alter system set smtp_out_server = mailserverIP:25' scope=both;
Bunu da yaptıktan sonra artık bu package’ı kullanacak userımıza hak vermemiz gerekiyor.Onu da aşağıdaki script ile verebiliriz.
grant execute on sys.utl_mail to Username;
Mail göndermeyi denemek için şunu yapabiliriz :
EXEC UTL_MAIL.SEND(Gönderen Maili','Alıcı Maili' ,NULL,NULL,'Subject','Mesaj' , 'text/plain; charset=us-ascii',NULL);
Çalışmıyorsa muhtemelen haklardan veya mail server ile alakalı bir problem olabilir.
Şimdi daha gerçekçi bir örnek yapalım.Örneğin Kullanıcı tablomuz olsun ve tabloda mail adresleri bulunsun. Bizden de kullanıcılara aylık bir bilgilendirme maili atmamız istendi diyelim.Bunu yapabilmek için once bir prosedür oluştururuz ve bu prosedür kullanıcı tablosundaki mail adreslerini toparlar.Bu mailin belirli tarihlerde atılmasını sağlamak için de Oracle JOB tanımlarız. Prosedür Scriptimiz
CREATE OR REPLACE PROCEDURE SEND_MAIL1 IS
pRecipient VARCHAR2(2500) := '';
pSubject VARCHAR2(100) := ' HATIRLATMA';
pMessage VARCHAR2(100) := 'BİZİ UNUTMAYIN‘;
crlf CONSTANT VARCHAR2(2):= CHR(13) || CHR(10);
mesg VARCHAR2(5000) := ' ';
BEGIN
for xtable in (select email from kullanici WHERE OTHER=1) loop
pRecipient := pRecipient || xtable.EMAIL || ';';
end loop;
mesg := 'Date: ' ||
TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss') || crlf ||
'From: ' || crlf ||
'Subject: '|| pSubject || crlf ||
'To: '||pRecipient || crlf || '' || crlf || pMessage;
UTL_MAIL.SEND(‘[email protected]’,pRecipient ,NULL,NULL,pSubject,mesg , 'text/plain; charset=us-ascii',NULL);
END;
JOB SCRİPTİMİZ : Bu scripti TOAD arayüzü üzerinden de create edebilirsiniz.
BEGIN SYS.DBMS_JOB.REMOVE(41); COMMIT; END;
DECLARE X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'SEND_MAIL1;'
,next_date => to_date('01.06.2009 00:00:00','dd/mm/yyyy hh24:mi:ss')
,interval => 'TRUNC(LAST_DAY(SYSDATE)) + 1'
,no_parse => FALSE);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
SYS.DBMS_JOB.BROKEN
(job => X,broken => TRUE);
COMMIT; END;
Sonuç olarak programlama tarafına hiç bir yük getirmeden veritabanına mail atma görevini yıkmayı başardırk.Yapması biraz zahmetli olsa da gayet kullanışlı.
Umarım Yararlı Olmuştur.Herkese iyi günler dilerim.