Tampilkan postingan dengan label Integrasi. Tampilkan semua postingan
Tampilkan postingan dengan label Integrasi. Tampilkan semua postingan

Sabtu, 13 Oktober 2012

Mengirim HTML email melalui PL/SQL and Gmail (2)

Pada contoh posting sebelumnya masih sederhana dimana kita belum bisa mengirim email dengan attachment, html. untuk contoh selanjutnya kita akan memperluas procedure kirim email melalui procedure berikut dengan sedikit modifikasi pada bagian :
  • deklarasi  spesifik ke gmail :
  • v_smtp_domain    varchar2 (256)     := 'gmail.com';
  • menambahkan
  • utl_smtp.ehlo(v_mail_conn, v_smtp_domain);
  • menon aktikan
  • -- utl_smtp.helo(v_mail_conn, p_smtp_host);
Maka sekarang kita bisa gunakan untuk kebutuhan gmail dengan stunnel :

CREATE OR REPLACE PROCEDURE custom_send_mail (
  p_to          IN VARCHAR2,
  p_cc          IN VARCHAR2 DEFAULT NULL,
  p_bcc         IN VARCHAR2 DEFAULT NULL,
  p_from        IN VARCHAR2,
  p_subject     IN VARCHAR2,
  p_text_msg    IN VARCHAR2 DEFAULT NULL,
  p_html_msg   IN CLOB DEFAULT NULL,
  p_attachments IN table_attachments DEFAULT NULL,
  p_smtp_host   IN VARCHAR2,
  p_smtp_port   IN NUMBER DEFAULT 25,
  p_username    IN VARCHAR2 DEFAULT NULL,
  p_password    IN VARCHAR2 DEFAULT NULL)
AS
  v_mail_conn   UTL_SMTP.connection;
  v_boundary    VARCHAR2(50) := '----=*#abc1234321cba#*=';
  v_step        PLS_INTEGER  := 24573;
  v_length PLS_INTEGER;
  v_begin PLS_INTEGER := 1;
  v_buffer_size INTEGER := 75;
  v_raw RAW(32767);
  v_smtp_domain    varchar2 (256)     := 'gmail.com';
BEGIN
  /* **** Author: Josep Coves
      **** Version: 1.0
      **** Date: 08/06/2012
      **** josepcoves@relational.es
      **** http://www.relational.es
      **** Based on Tim's procedure, Thanks  Tim!
      **** http://www.oracle-base.com/articles/misc/email-from-oracle-plsql.php#html
   */
  v_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
  utl_smtp.ehlo(v_mail_conn, v_smtp_domain);
  utl_smtp.command( v_mail_conn, 'AUTH LOGIN'); 
 
  --Establish SMTP connection
  IF (p_username IS NOT NULL) THEN
    utl_smtp.command( v_mail_conn, UTL_RAW.cast_to_varchar2( UTL_ENCODE.base64_encode( UTL_RAW.cast_to_raw( p_username ))) );
    utl_smtp.command( v_mail_conn, UTL_RAW.cast_to_varchar2( UTL_ENCODE.base64_encode( UTL_RAW.cast_to_raw( p_password ))) );
  END IF;
 
 -- utl_smtp.helo(v_mail_conn, p_smtp_host);
  utl_smtp.mail(v_mail_conn, p_from);
  utl_smtp.rcpt(v_mail_conn, p_to);
 
  utl_smtp.open_data(v_mail_conn);
 
  utl_smtp.write_data(v_mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
  IF (p_cc IS NOT NULL) THEN
    utl_smtp.write_data(v_mail_conn, 'CC: ' || p_cc || UTL_TCP.crlf);
  END IF;
  IF (p_bcc IS NOT NULL) THEN
    utl_smtp.write_data(v_mail_conn, 'BCC: ' || p_bcc || UTL_TCP.crlf);
  END IF;
  utl_smtp.write_data(v_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
  utl_smtp.write_data(v_mail_conn, 'Content-Type: multipart/mixed; boundary="' || v_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
  --Plain Text Body
  IF p_text_msg IS NOT NULL THEN
    utl_smtp.write_data(v_mail_conn, '--' || v_boundary || UTL_TCP.crlf);
    utl_smtp.write_data(v_mail_conn, 'Content-Type: text/plain; charset="iso-8859-1"' || UTL_TCP.crlf || UTL_TCP.crlf);
 
    utl_smtp.write_data(v_mail_conn, p_text_msg);
    utl_smtp.write_data(v_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
 
  ELSIF p_html_msg IS NOT NULL THEN
    -- HTML Body
    utl_smtp.write_data(v_mail_conn, '--' || v_boundary || UTL_TCP.crlf);
    utl_smtp.write_data(v_mail_conn, 'Content-Type: text/html; charset="iso-8859-1"' || UTL_TCP.crlf || UTL_TCP.crlf);
    FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_html_msg) - 1 )/v_step) LOOP
      utl_smtp.write_data(v_mail_conn,  DBMS_LOB.SUBSTR(p_html_msg, v_step, i * v_step + 1));
    END LOOP;
 
    utl_smtp.write_data(v_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
  END IF;
 
  IF p_attachments IS NOT NULL THEN
 
   FOR i IN 1..p_attachments.COUNT
   LOOP
 
     utl_smtp.write_data(v_mail_conn, '--' || v_boundary || UTL_TCP.crlf);
     utl_smtp.write_data(v_mail_conn, 'Content-Type: ' ||p_attachments(i).attachment_mime || UTL_TCP.crlf);
     utl_smtp.write_data(v_mail_conn, 'Content-Transfer-Encoding: base64' || UTL_TCP.crlf);
     utl_smtp.write_data(v_mail_conn, 'Content-Disposition: attachment; filename="' || p_attachments(i).attachment_name || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
 
     v_length := DBMS_LOB.getlength(p_attachments(i).attachment_blob);
     v_begin := 1;
     v_raw := NULL;
     v_buffer_size := 75;
     WHILE v_begin < v_length LOOP
        DBMS_LOB.read( p_attachments(i).attachment_blob, v_buffer_size, v_begin, v_raw );
        utl_smtp.write_raw_data( v_mail_conn, UTL_ENCODE.base64_encode(v_raw) );
        utl_smtp.write_data( v_mail_conn, UTL_TCP.crlf );
        v_begin := v_begin + v_buffer_size;
     END LOOP ;
 
    utl_smtp.write_data(v_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
 
   END LOOP;
 
  END IF;
 
  utl_smtp.write_data(v_mail_conn, '--' || v_boundary || '--' || UTL_TCP.crlf);
  utl_smtp.close_data(v_mail_conn);
 
  utl_smtp.quit(v_mail_conn);
 
END;
/

Selanjutnya kita bisa pakai untuk mengirim, text bisa, html dan attachement. berikut contoh pemakaian untuk mengirim gambar product dari tabel DEMO_PRODUCT_INFO.

DECLARE
  v_clob clob := 'Test email';
  v_blob blob;
 
  t_a table_attachments := NULL;
  v_a mail_attachment ;
BEGIN
 
   SELECT mail_attachment(t.FILENAME,t.MIMETYPE,t.PRODUCT_IMAGE)
              BULK COLLECT INTO t_a
     FROM DEMO_PRODUCT_INFO t;
 
     custom_send_mail (p_to     => '<your_recipient@mail.com>',
                       p_from   => '<yourgmailname@gmail.com>',
                       p_subject     => 'test',
                       p_html_msg => v_clob,
                       p_attachments => t_a,
                       p_smtp_host =>  'localhost',
                       p_smtp_port   => 1925,
                       p_username => 'yourgmailname@gmail.com',
                       p_password  =>  'yourgmailpassword');
END;
/

Maka pada email penerima akan muncul:

Jumat, 12 Oktober 2012

Mengirim HTML email melalui PL/SQL and Gmail (1)

Didalam apex memungkinkan kita untuk integrasi dengan system email smtp yang telah ada. Anda bisa setup melalui WS: internal pada bagian Manage Instance>>Instance Settings>>Email
Dengan integrasi itu kita bisa memakai package yg telah disediakan apex yaitu : APEX_MAIL dan bisa melakan report subscription dan download report melalui email.

Namun saat kita tidak memiliki server email yang bisa kita pake, maka kita bisa memakai alternatif dari gmail. untuk mengimplementasikannya tanpa banyak nyeng-nyong lagi anda bisa pelajari dari bang HÃ¥vard Kristiansen blog.

Catatan :
  • Anda harus mengerti konsep ACL (jika memakai 11g)
  • Anda telah memberi akses ke package UTL_SMTP dan UTL_TCP.
  • Email bisa dikirm melalui pesan html dengan memodifikasi code:
  • write_mime_header (l_conn, 'Content-Type', 'text/plain');
    
    Menjadi
    write_mime_header (l_conn, 'Content-Type', 'text/html');
  • Anda bisa menambahkan inline image (image harus public bisa dibaca) atau style
  • Saya sudah test kirim ke yahoo dan gmail, untuk yahoo image tampil, gmail tidak berhasil

Contoh Pemakaian :
DECLARE
  l_html VARCHAR2(32767);
BEGIN
  l_html := '<html>
    <head>
      <title>HTML with table message</title>
    </head>
    <body>
      <p>This is a <b>HTML with Table and Image</b> <i>version</i> of the test message.</p>
<table border="1"><tbody>
<tr> <th>Hari</th> <th>Topik</th>  </tr>
<tr> <td>Hari 1</td> 
<td><ul>
<li>Preview Oracle APEX</li>
<li>Instalasi APEX dengan arsitektur EPG</li>
<li>Membuat dan mengatur workspace</li>
<li>Akses file image memakai FireFTP</li>
</ul>
</td>
</tr>
<tr> <td>Hari 2</td> 
<td><ul>
<li>Konsep SQL Workshop</li>
<li>Manipulasi Objek Database memakai SQL Workshop (tutorial)</li>
<li>Konsep Application Builder</li>
<li>Konsep Session State &amp; URL Syntax</li>
<li>Membuat Aplikasi Database dari sebuah file spreadsheet (tutorial)</li>
</ul>
</td>
</tr>
<tr> <td>Hari 3</td> 
<td><ul>
<li>Konsep Form, Report</li>
<li>Konsep Page, region komponen (computation,process,validation dan branching)</li>
<li>Membuat Aplikasi Database From Scratch (tutorial)</li>
<li>Konsep chart, calendar dan map </li>
<li>Konsep Theme, template dan file </li>
<li>Membuat Aplikasi Database From Scratch II (tutorial)</li>
</ul>
</td>
</tr>
<tr> <td>Hari 4</td> 
<td><ul>
<li>Konsep Interactive Report</li>
<li>Konsep Shared Component</li>
<li>Konsep Navigasi,tree, list, tab, breadcrumb </li>
<li>Konsep Dynamic Action, Plugin</li>
<li>Demo tutorial </li>
</ul>
</td>
</tr>
<tr> <td>Hari 5</td> 
<td><ul>
<li>Konsep Administration</li>
<li>Konsep Application and Page Utilities</li>
<li>Konsep Security (authentication &amp; authorization)</li>
<li>Demo (tutorial)</li>
<li>Konsep Deploy Application</li>
<li>Demo (tutorial)</li>
</ul>
</td>
</tr>
</tbody></table>      
      <p><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDRQTzDp14vFVpCREZ3WKxvbK8RxY4y8XzLCrwjwcudiHVmn7uRIcQ_M3uPMl9kQp7HT5P8zPc9m_QnLRT4vxSdLc-QpurQ1ecPTqrDT_K1AjmP58ChPME9GLmrG8GL7511eiIVeHSq9w/s200/bonexlogo.png" alt="Bonex Logo" />
    </body>
  </html>';

           g_mail. send_mail_html (
      'yourgmailaccount@gmail.com'
    , 'yourmail_recipient'
    , 'subject html',l_html
   );
END;
/
 
Tampilan di email yahoo penerima :
 

Kamis, 23 Agustus 2012

Cufon on APEX (implementasi cufon)

Font yang dimiliki APEX tidak cukup cantik?
Silahkan coba memakai cufon. lakukan langkah-langkah berikut.

1. pelajari langkah-langkah nya disini.
2. Download cufon disini.
3. Pada bagian header include js script berikut.
<script type="text/javascript" src="#IMAGE_PREFIX#themes/theme_115/js2/cufon-yui.js"></script> 
<script type="text/javascript" src="#IMAGE_PREFIX#themes/theme_115/js2/mycustom.font.js"></script>

4. Pada bagian header (Function and Global Variable Declaration).
Cufon.replace('a');
Cufon.replace('h1');
Cufon.replace('h2');
Cufon.replace('h3');


Test Drive

Penampakan Sebelum

Penampakan Sesudahnya
Catatan : Pendefinisian js melalui page template tidak berhasil...akhirnya harus didefinisikan di masing-masing page header.

Rabu, 15 Agustus 2012

Integrasi APEX dan Jasper Report

Judul integrasi sebenarnya masih salah kaprah, karena pada dasarnya tidak benar-benar ter integrasi dengan APEX seperti halnya oracle BI publisher dengan APEX. Jadi nanti integrasi ini maksudnya adalah bagaimana anda memanggil report jasper melalui aplikasi APEX :D.

Mengapa memakai jasper report? alasan sederhananya karena Gratis...tis...tis :D dan cukup powerfull untuk membangun report yang bagus.

Beberapa hal yang harus diperhatikan adalah hal berikut:
1. Jasper report berbasis teknologi java dan xml.
2. Anda harus sudah install jasper report servernya.
3. Anda telah memiliki/terinstall report designernya (Jasper iReport).
4. Jangan lupa untuk membedakan port server tomcat dan APEX jika dalam satu PC/server.

Banyak teknik yang bisa dilakukan untuk proses integrasi ini seperti pada hal ini. namun secara pribadi saya lebih menyukai/menganjurkan memakai teknik yang dikembangkan oleh Dietmar Aust.

Oke silahkan ke TKP untuk mencobanya. Disitu anda akan bisa memanggilnya dengan package XLIB_JASPERREPORTS. atau melalui URL dengan melakukan test di http://your_tomcat_host:your_tomcat_port/JasperReportsIntegration/ untuk memperoleh URL-nya.



Special Thanks for Mr Dietmar Aust.



Catatan: Anda bisa download paket jasper report dan ireport disini.