Wednesday 13 February 2008

ส่งเมล์ง่าย ๆ ด้วย 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:

Anonymous said...

ขอบคุณครับ ช่วยได้มากเลยกำลังหาข้อมูลเรื่องนี้อยู่พอดีเลย

Anonymous said...

ถ้าผมต้องการขึ้นบรรทัดใหม่ ในส่วนของ message ต้องเขียนอย่างไรคับ