UTL_MAIL basit ve etkili çözüm UTL_MAIL paketini kullanarak Oracle PL/SQL ile e-Posta gönderme uygulaması. Ümit Varol / Diveya Bilgi Sistemleri 15/12/2009 - İstanbul
İçerik e-Posta nedir, nasıl çalışır ? Örnek e-Posta senaryosu. UTL_MAIL nedir, nasıl çalışır. Örnek Kod. Notlar. İstanbul'10 20 Mayıs 2010
e-Posta ? e-Posta nedir ? e-Posta nasıl çalışır? Bunu bilmiyorsanız, bu sunumu ve çalışmayı bırakın, alfabeden tekrar başlayın. e-Posta nasıl çalışır? e-Posta temelde inanılamayacak kadar basit bir yapıya sahiptir. Göndermek istediğiniz e-Posta içeriği, e-Posta sunucunuzda bir metin dosyası olarak saklanır. e-Posta sunucunuz, karşı tarafın sunucusu ile konuşur, tıpkı bir FTP uygulaması daha önce sakladığı dosyayı karşı tarafa ulaştırır. e-Postanın alıcısı kendi sunucusuna bağlandığında bu dosya açılarak içeriği kendisine teslim edilir. Tabi ki bu iş içinde bazı protokoller ve birkaç detay daha var. İstanbul'10 20 Mayıs 2010
e-Posta Nasıl Çalışır? Yazdığınız e-Postanın saklanmasını ve sağlıklı bir şekilde e-Posta alıcısının sunucusuna kadar ulaşmasını sağlayan iletişim protokolü SMTP’dir. SMTP (Simple Mail Transfer Protocol) Port 25 üzerinden çalışır. Size gelen e-Posta dosyalarını tekrar içeriğe dönüştüren ve sunucunuzdan bilgisayarınıza çekip okumanızı sağlayan protokol ise POP3 veya IMAP’dir. POP3 (Post Office Protocol) Port 110 üzerinden çalışır. IMAP (Internet Mail Access Protocol) Port 143 üzerinden çalışıar. İstanbul'10 20 Mayıs 2010
Örnek ePosta Senaryosu Bizim amacımız bir e-Posta göndermek, bu nedenle kapsamımız SMTP ile mesajımızı karşı tarafa iletmek. Bizim posta adresimiz : gonderen@adres.com Mesaj Başlığımız : Otomatik Uygulama Uyarısı İstanbul'10 20 Mayıs 2010
UTL_SMTP Nedir? PL/SQL ile uygulama geliştirenler e-Posta göndermek için Oracle 8i veritabanı sürümünden beri UTL_SMTP paketini kullanılmaktadır. UTL_SMTP paketi, e-Posta alışverişinde kullanılan bir standart olan SMTP üzerinde çalışmanızı sağlayan fonksiyonlar içerir. SMTP (Simple Mail Transfer Protocol, Basit Posta Aktarım Protokolü) UTL_SMTP ile bir e-Posta göndermek için normal hayattaki bir e-Posta gönderme oturumu adımları taklit edilir. Önce, UTL_SMTP.OPEN_CONNECTION fonksiyonu ile belirli bir bağlantı noktası numarasını kullanılarak bir e-Posta sunucusuna bağlantı kurulur. Bir kez başarılı bir bağlantı kurulduğunda, UTL_SMTP.HELO prosedürü ile sunucuya HELO ( "merhaba") mesajı göndererek posta oturumu başlar. Sırasıyla, gönderen posta kutusunu tanımlamak için UTL_STMP.MAIL, alıcı posta adresini tanımlamak için UTL_SMTP.RCPT ve mesaj metnini tanımlamak için UTL_SMTP.DATA fonksiyonları kullanılır. UTL_SMTP.QUIT ile oturum sona erdirilir. İstanbul'10 20 Mayıs 2010
UTL_Mail Nedir? 10g sürümü ile birlikte UTL_Mail adında yeni bir paket geldi ! Bu yeni paket bir öncekinden farklı olarak tek satırda, basitçe posta göndermenize olanak sağlar. UTL_MAIL.SEND (Gönderen, AlıcıListesi, CC, BCC, Konu, Mesaj, mime_type, Öncelik) Bu fonksiyondaki Öncelik değişkeni PLS_INTEGER tipindedir, diğer tüm değişkenler ise VARCHAR2 tipindedir. UTL_Mail paketi, son derece kolay yazılabilen yapısı ile popüler e-Posta gönderme yöntemi olmuştur. İstanbul'10 20 Mayıs 2010
UTL_Mail Nedir? Tabi ki bu tek satırlık büyük avantaj, bir sistem yöneticiniz var ise ve gerekli ön ayarları sizin için yaptı ise geçerli! Eğer böyle bir şansınız yok ise bir defalığına yapmanız gereken ayarlar için takip etmeniz gereken yol şu şekilde : Öncelikle system DBA olarak Logon olun, CONN sys/password AS SYSDBA İlk Adım, Aşağıdaki iki script’i kullanarak UTL_MAIL paketini yükleyin: @$ORACLE_HOME/rdbms/admin/utlmail.sql @$ORACLE_HOME/rdbms/admin/prvtmail.plb İkinci Adım, Bu paket için PUBLIC veya belirleyeceğiniz kullanıcı için Grant yetkisi verin. GRANT execute ON utl_mail TO <schema_name>; (veya) GRANT execute ON utl_mail TO PUBLIC; Son Adım, RDBMS tanımlama dosyası init.ora içinde SMTP_OUT_SERVER parametresini SMTP sunucusunu gösterecek şekilde tanımlayınız. ALTER SYSTEM SET smtp_out_server=’smtp.domain.com’ SCOPE=SPFILE; SHUTDOWN IMMEDIATE STARTUP Not: SMTP_OUT_SERVER tanımlamasındaki SCOPE parametresi 3 değer alabilir. memory (Sadece çalışan oturum için geçerli olmasını sağlar) spfile (Daha çok tercih edilen seçenektir. Fakat sunucunun RESTART edilmesi gereklidir.) both İstanbul'10 20 Mayıs 2010
UTL_Mail Nasıl Çalışır? UTL_Mail paketi ile bir e-Posta gönderelim : UTL_Mail.Send Bu komut bir procedure olarak çağrılmalıdır. BEGIN UTL_MAIL.send( sender => ‘me@address.com’ ,recipients => ‘you@address.com’ ,cc => ‘person1@address.com, person2@address.com‘ ,bcc => ‘person3@address.com, person4@address.com’ ,subject => ‘Test Mail’ ,message => ‘Hello World’ ,mime_type => ‘text; charset=us-ascii‘ ,priority => 3); END; Örnekte görüldüğü üzere Sender, Receipents, CC ve BCC alanları e-Posta adresleri için kullanılır. Birden fazla adres yazmak için virgülle ayırarak devam etmelisiniz. Subject kısmında e-Posta’nın başlığını, Message kısmında da içeriği yazabilirsiniz. MIME_TYPE, gönderilecek e-Posta’nın Message kısmındak, içeriğin tipini göstermektedir. TEXT HTML Priority ise destekleyen sistemlerde gönderilen e-Postanın öncelik seviyesini belirleyebilirsiniz. İstanbul'10 20 Mayıs 2010
UTL_Mail Nasıl Çalışır? UTL_MAIL paketi içinde iki prosedür daha bulunmaktadır. SEND_ATTACH_RAW RAW tipinde eklentisi olan e-Posta göndermek için. SEND_ATTACH_VARCHAR2 VARCHAR2 tipinde eklentisi olan e-Posta göndermek için. İstanbul'10 20 Mayıs 2010
Örnek Kod ePosta göndermek için sadece SMTP sunucunuzu tanımlayın ve tek komutla gönderinizi alıcısına ulaştırın BEGIN EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''127.0.0.1'''; UTL_MAIL.send ( sender => 'me@address.com', recipients => 'you1@address.com, you2@address.com', subject => 'Test Mail', message => 'Hello World', mime_type => 'text; charset=us-ascii'); END; / İstanbul'10 20 Mayıs 2010
Notlar Uygulamanızda yer alan metin içinde tek veya çift tırnak gibi ayraçlar kullanırken sıkıntı yaşıyorsanız 10g imdadınıza yetişiyor. Eskiden beri kullanılan aşağıdaki ikileme yöntemi yerine, DBMS_OUTPUT.put_line('This is Tim''s string!'); Artık aşağıdaki gibi daha kolay bir yazım biçimi var. DBMS_OUTPUT.put_line(q'#This is Tim's string!#'); DBMS_OUTPUT.put_line(q'[This is Tim's string!]'); VARCHAR2 tipinin PL/SQL içindeki boyutu 32767 byte olabilmekle birlikte veritabanında sadece 4000 byte olabiliyor. Bu detaya dikkat etmek faydalı olacaktır. İstanbul'10 20 Mayıs 2010
Notlar UTL_MAIL 3 adet fonksiyon içeren bir pakettir. http://download.oracle.com/docs/cd/B13789_01/appdev.101/b10802/u_mail.htm#996728 UTL_MAIL, UTL_SMTP ve UTL_TCP paketleri ile ePosta gönderim örnekleri: http://www.orafaq.com/wiki/Send_mail_from_PL/SQL İstanbul'10 20 Mayıs 2010