Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Oracle ile mail gönderme UTL_MAIL.SEND fonksiyonu

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.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.

SQL> start C:oracleproduct10.2.0db_1RDBMSADMINutlmail.sql

package ve sysnonim 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(‘mail@hotmail.com’,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;

Umarım Yararlı Olmuştur.Herkese iyi günler dilerim.

May 7, 2009 - Posted by | Oracle | , , , ,

No comments yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s