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.

Reklamlar

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

Henüz yorum yapılmamış.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s