go to http://oracle.in.th

Monday, November 2, 2009

ส่งเมล์ง่าย ๆ ด้วย PL/SQL โดยใช้ UTL_MAIL

utl_mail package เป็น feature ที่มีเพิ่มเข้ามาตั้งแต่ oracle database version 10g เป็นต้นไป
จุดเด่นที่สำคัญของมัน คือ ทำให้การส่ง email สะดวกและง่ายมากขึ้น จาก version ก่อนที่ใช้ utl_smtp และ utl_tcp ซึ่งการเรียกใช้ค่อนข้างยุ่งยาก

โดยปกติ utl_mail package ยังไม่สามารถใช้งานได้ทันที หลังจากการติดตั้ง oracle database จำเป็นที่จะต้องติดตั้งเพิ่ม โดยมีขั้นตอน ดังต่อไปนี้
  • ติดต่อเชื่อมต่อ oracle database ด้วย sys
  • $ sqlplus sys/manager1@db as sysdba
  • run ORACLE_HOME/rdbms/admin/utlmail.sql
  • SQL>@ORACLE_HOME/rdbms/admin/utlmail.sql
  • grant สิทธิ์ให้กับ user ที่จะใช้ utl_mail package
  • SQL>grant execute to test_app;
เท่านี้ ก็จะสามารถใช้งาน utl_mail package ได้แล้ว ต่อไปเราจะมาดูรายละเอียดของ utl_mail กัน

ภายใน utl_mail package จะประกอบไปด้วย 3 procedure ดังนี้

1. send ใช้สำหรับส่ง email ทั่วไป โดยไม่ได้มีการแนบไฟล์
utl_mail.send(
sender        IN    VARCHAR2 CHARACTER SET ANY_CS,
recipients    IN    VARCHAR2 CHARACTER SET ANY_CS,
cc            IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
bcc           IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
subject       IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
message       IN    VARCHAR2 CHARACTER SET ANY_CS,
mime_type     IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
priority      IN    PLS_INTEGER DEFAULT 3);
ตัวอย่าง
begin
execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';
UTL_MAIL.send('test1@test.com',
'test2@test.com',
null,
null,
'Hello Send',
'Hello,How are you?',
'text; charset=us-ascii',
null);
end;
ใีนการอ้างอิง File ใน utl_file package เราจะต้องสร้าง
directory เพื่อ อ้างอิง location หรือ path ดังนี้
SQL>CREATE DIRECTORY d_file_path AS '/file/';

SQL>GRANT READ,WRITE ON DIRECTORY d_file_path TO test_app;

2. send_attach_raw ใช้สำหรับส่ง email ที่มีการแนบไฟล์
utl_mail.send_attach_raw (
sender  IN    VARCHAR2 CHARACTER SET ANY_CS,
recipients      IN    VARCHAR2 CHARACTER SET ANY_CS,
cc              IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
bcc             IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
subject         IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
message         IN    VARCHAR2 CHARACTER SET       ANY_CS DEFAULT NULL,
mime_type       IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
priority        IN    PLS_INTEGER DEFAULT 3,
attachment      IN    RAW,
att_inline      IN    BOOLEAN DEFAULT TRUE,
att_mime_type   IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii',
att_filename    IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
ตัวอย่าง
declare
v_file  utl_file.file_type;
v_raw_file RAW(32767);
v_file_length NUMBER;
v_block_size NUMBER;
v_exist  BOOLEAN;
v_location VARCHAR2(50):='d_file_path';
v_file_name VARCHAR2(50):='test.pdf';
begin
execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';

utl_file.fgetattr(v_location,v_file_name,v_exist,v_file_length,v_block_size);
v_file:=utl_file.fopen(v_location,v_file_name,'R');
utl_file.get_raw(v_file,v_raw_file,v_file_length);
utl_file.fclose(v_file);

utl_mail.send_attach_raw('test1@test.com',
'test2@test.com',
null,
null,
'Hello Send Attach Raw',
'Hello,How are you?',
'text; charset=us-ascii',
null,
v_raw_file,
FALSE,
'text; charset=us-ascii',
v_file_name);
end;

3. send_attach_varchar2 ใช้สำหรับส่ง email ที่มีการแนบไฟล์ที่เป็น text

utl_mail.send_attach_varchar2(
sender         IN    VARCHAR2 CHARACTER SET ANY_CS,
recipients     IN    VARCHAR2 CHARACTER SET ANY_CS,
cc             IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
bcc            IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
subject        IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
message        IN    VARCHAR2 CHARACTER SET       ANY_CS DEFAULT NULL,
mime_type      IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
priority       IN    PLS_INTEGER DEFAULT 3,
attachment     IN    VARCHAR2 CHARACTER SET ANY_CS,
att_inline     IN    BOOLEAN DEFAULT TRUE,
att_mime_type   IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii,
att_filename    IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
ตัวอย่าง
declare
v_file  utl_file.file_type;
v_raw_file RAW(32767);
v_file_length NUMBER;
v_block_size NUMBER;
v_exist  BOOLEAN;
v_location VARCHAR2(50):='d_file_path';
v_file_name VARCHAR2(50):='test.txt';
begin
execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';

utl_file.fgetattr(v_location,v_file_name,v_exist,v_file_length,v_block_size);
v_file:=utl_file.fopen(v_location,v_file_name,'R');
utl_file.get_raw(v_file,v_raw_file,v_file_length);
utl_file.fclose(v_file);

utl_mail.send_attach_varchar2('test1@test.com',
'test2@test.com',
null,
null,
'Hello Send Attach Varchar2',
'Hello,How are you?',
'text; charset=us-ascii',
null,
v_raw_file,
FALSE,
'text; charset=us-ascii',
v_file_name);
end;
ข้อเขียนนี้ช่วยฉัน:  

2 comments:

Unknown said...

ขอร่วมด้วยนะครับ

หลังจาก run utlmail.sql (สร้าง Package)
ต้องมี @oracle_home/rdbms/admin/prvtmail.plb ด้วยนะครับ

ไม่งั้นจะหา Package Body ไม่ได้

Oracle In Thai said...

ขอบคุณ คุณyongyot มากครับ ที่มาช่วยแนะนำเพิ่มเติม

Post a Comment