Click here to load reader
Upload
rajnish-kumar
View
125
Download
6
Embed Size (px)
Citation preview
http://skyccu.skytechsolutions.co.in/mail/sde.nsf/e8df2e674e11c2b36...
1 of 7 6/3/2008 10:31 PM
From: Satyaki De/CCU/IN/SkyTECHTo: [email protected], [email protected],
Date: Thursday, May 17, 2007 06:06PMSubject: Sending SMS Through Oracle Server
Query:
Sending SMS Through Oracle Server
Solution:
REM REM maildemo.sql - A PL/SQL package to demonstrate how to use the UTL_SMTP REM package to send emails in ASCII and non-ASCII character sets, emails REM with text or binary attachments. REM REM Note: this package relies on the UTL_ENCODE PL/SQL package in Oracle 9i. REM For Oracle 8i users, please use maildemo8i instead.
CREATE OR REPLACE PACKAGE demo_mail IS ----------------------- Customizable Section ----------------------- -- Customize the SMTP host, port and your domain name below. smtp_host VARCHAR2 ( 256 ) := 'smtp-server.some-company.com' ; smtp_port PLS_INTEGER := 25 ; smtp_domain VARCHAR2 ( 256 ) := 'some-company.com' ;
-- Customize the signature that will appear in the email's MIME header. -- Useful for versioning. MAILER_ID CONSTANT VARCHAR2 ( 256 ) := 'Mailer by Oracle UTL_SMTP' ; --------------------- End Customizable Section ---------------------
-- A unique string that demarcates boundaries of parts in a multi-part email -- The string should not appear inside the body of any part of the email. -- Customize this if needed or generate this randomly dynamically. BOUNDARY CONSTANT VARCHAR2 ( 256 ) := '-----7D81B75CCC90D2974F7A1CBD' ;
FIRST_BOUNDARY CONSTANT VARCHAR2 ( 256 ) := '--' || BOUNDARY || utl_tcp . CRLF ; LAST_BOUNDARY CONSTANT VARCHAR2 ( 256 ) := '--' || BOUNDARY || '--' || utl_tcp . CRLF ;
-- A MIME type that denotes multi-part email (MIME) messages. MULTIPART_MIME_TYPE CONSTANT VARCHAR2 ( 256 ) := 'multipart/mixed; boundary="' || BOUNDARY || '"' ; MAX_BASE64_LINE_WIDTH CONSTANT PLS_INTEGER := 76 / 4 * 3 ;
-- A simple email API for sending email in plain text in a single call. -- The format of an email address is one of these: -- someone@some-domain -- "Someone at some domain" <someone@some-domain> -- Someone at some domain <someone@some-domain> -- The recipients is a list of email addresses separated by -- either a "," or a ";" PROCEDURE mail ( sender IN VARCHAR2 , recipients IN VARCHAR2 , subject IN VARCHAR2 , message IN VARCHAR2 );
-- Extended email API to send email in HTML or plain text with no size limit. -- First, begin the email by begin_mail(). Then, call write_text() repeatedly -- to send email in ASCII piece-by-piece. Or, call write_mb_text() to send -- email in non-ASCII or multi-byte character set. End the email with -- end_mail().
http://skyccu.skytechsolutions.co.in/mail/sde.nsf/e8df2e674e11c2b36...
2 of 7 6/3/2008 10:31 PM
FUNCTION begin_mail ( sender IN VARCHAR2 , recipients IN VARCHAR2 , subject IN VARCHAR2 , mime_type IN VARCHAR2 DEFAULT 'text/plain' , priority IN PLS_INTEGER DEFAULT NULL) RETURN utl_smtp . connection ;
-- Write email body in ASCII PROCEDURE write_text ( conn IN OUT NOCOPY utl_smtp . connection , message IN VARCHAR2 );
-- Write email body in non-ASCII (including multi-byte). The email body -- will be sent in the database character set. PROCEDURE write_mb_text ( conn IN OUT NOCOPY utl_smtp . connection , message IN VARCHAR2 ); -- Write email body in binary PROCEDURE write_raw ( conn IN OUT NOCOPY utl_smtp . connection , message IN RAW );
-- APIs to send email with attachments. Attachments are sent by sending -- emails in "multipart/mixed" MIME format. Specify that MIME format when -- beginning an email with begin_mail(). -- Send a single text attachment. PROCEDURE attach_text ( conn IN OUT NOCOPY utl_smtp . connection , data IN VARCHAR2 , mime_type IN VARCHAR2 DEFAULT 'text/plain' , inline IN BOOLEAN DEFAULT TRUE, filename IN VARCHAR2 DEFAULT NULL, last IN BOOLEAN DEFAULT FALSE); -- Send a binary attachment. The attachment will be encoded in Base-64 -- encoding format. PROCEDURE attach_base64 ( conn IN OUT NOCOPY utl_smtp . connection , data IN RAW , mime_type IN VARCHAR2 DEFAULT 'application/octet' , inline IN BOOLEAN DEFAULT TRUE, filename IN VARCHAR2 DEFAULT NULL, last IN BOOLEAN DEFAULT FALSE); -- Send an attachment with no size limit. First, begin the attachment -- with begin_attachment(). Then, call write_text repeatedly to send -- the attachment piece-by-piece. If the attachment is text-based but -- in non-ASCII or multi-byte character set, use write_mb_text() instead. -- To send binary attachment, the binary content should first be -- encoded in Base-64 encoding format using the demo package for 8i, -- or the native one in 9i. End the attachment with end_attachment. PROCEDURE begin_attachment ( conn IN OUT NOCOPY utl_smtp . connection , mime_type IN VARCHAR2 DEFAULT 'text/plain' , inline IN BOOLEAN DEFAULT TRUE, filename IN VARCHAR2 DEFAULT NULL, transfer_enc IN VARCHAR2 DEFAULT NULL); -- End the attachment. PROCEDURE end_attachment ( conn IN OUT NOCOPY utl_smtp . connection , last IN BOOLEAN DEFAULT FALSE); -- End the email. PROCEDURE end_mail ( conn IN OUT NOCOPY utl_smtp . connection );
-- Extended email API to send multiple emails in a session for better -- performance. First, begin an email session with begin_session. -- Then, begin each email with a session by calling begin_mail_in_session -- instead of begin_mail. End the email with end_mail_in_session instead -- of end_mail. End the email session by end_session. FUNCTION begin_session RETURN utl_smtp . connection ; -- Begin an email in a session. PROCEDURE begin_mail_in_session ( conn IN OUT NOCOPY utl_smtp . connection , sender IN VARCHAR2 , recipients IN VARCHAR2 , subject IN VARCHAR2 , mime_type IN VARCHAR2 DEFAULT 'text/plain' , priority IN PLS_INTEGER DEFAULT NULL); -- End an email in a session. PROCEDURE end_mail_in_session ( conn IN OUT NOCOPY utl_smtp . connection ); -- End an email session.
http://skyccu.skytechsolutions.co.in/mail/sde.nsf/e8df2e674e11c2b36...
3 of 7 6/3/2008 10:31 PM
PROCEDURE end_session ( conn IN OUT NOCOPY utl_smtp . connection );
END; /
CREATE OR REPLACE PACKAGE BODY demo_mail IS -- Return the next email address in the list of email addresses, separated -- by either a "," or a ";". The format of mailbox may be in one of these: -- someone@some-domain -- "Someone at some domain" <someone@some-domain> -- Someone at some domain <someone@some-domain> FUNCTION get_address ( addr_list IN OUT VARCHAR2 ) RETURN VARCHAR2 IS
addr VARCHAR2 ( 256 ); i pls_integer ;
FUNCTION lookup_unquoted_char ( str IN VARCHAR2 , chrs IN VARCHAR2 ) RETURN pls_integer AS c VARCHAR2 ( 5 ); i pls_integer ; len pls_integer ; inside_quote BOOLEAN ; BEGIN inside_quote := false; i := 1 ; len := length ( str ); WHILE ( i <= len ) LOOP
c := substr ( str , i , 1 );
IF ( inside_quote ) THEN IF ( c = '"' ) THEN inside_quote := false; ELSIF ( c = '\' ) THEN i := i + 1 ; -- Skip the quote character END IF; GOTO next_char ; END IF; IF ( c = '"' ) THEN inside_quote := true; GOTO next_char ; END IF; IF ( instr ( chrs , c ) >= 1 ) THEN RETURN i ; END IF; << next_char >> i := i + 1 ;
END LOOP; RETURN 0 ; END;
BEGIN
addr_list := ltrim ( addr_list ); i := lookup_unquoted_char ( addr_list , ',;' ); IF ( i >= 1 ) THEN addr := substr ( addr_list , 1 , i - 1 ); addr_list := substr ( addr_list , i + 1 ); ELSE addr := addr_list ; addr_list := '' ; END IF; i := lookup_unquoted_char ( addr , '<' ); IF ( i >= 1 ) THEN addr := substr ( addr , i + 1 ); i := instr ( addr , '>' ); IF ( i >= 1 ) THEN addr := substr ( addr , 1 , i - 1 ); END IF; END IF;
http://skyccu.skytechsolutions.co.in/mail/sde.nsf/e8df2e674e11c2b36...
4 of 7 6/3/2008 10:31 PM
RETURN addr ; END;
-- Write a MIME header PROCEDURE write_mime_header ( conn IN OUT NOCOPY utl_smtp . connection , name IN VARCHAR2 , value IN VARCHAR2 ) IS BEGIN utl_smtp . write_data ( conn , name || ': ' || value || utl_tcp . CRLF ); END;
-- Mark a message-part boundary. Set <last> to TRUE for the last boundary. PROCEDURE write_boundary ( conn IN OUT NOCOPY utl_smtp . connection , last IN BOOLEAN DEFAULT FALSE) AS BEGIN IF ( last ) THEN utl_smtp . write_data ( conn , LAST_BOUNDARY ); ELSE utl_smtp . write_data ( conn , FIRST_BOUNDARY ); END IF; END;
------------------------------------------------------------------------ PROCEDURE mail ( sender IN VARCHAR2 , recipients IN VARCHAR2 , subject IN VARCHAR2 , message IN VARCHAR2 ) IS conn utl_smtp . connection ; BEGIN conn := begin_mail ( sender , recipients , subject ); write_text ( conn , message ); end_mail ( conn ); END;
------------------------------------------------------------------------ FUNCTION begin_mail ( sender IN VARCHAR2 , recipients IN VARCHAR2 , subject IN VARCHAR2 , mime_type IN VARCHAR2 DEFAULT 'text/plain' , priority IN PLS_INTEGER DEFAULT NULL) RETURN utl_smtp . connection IS conn utl_smtp . connection ; BEGIN conn := begin_session ; begin_mail_in_session ( conn , sender , recipients , subject , mime_type , priority ); RETURN conn ; END;
------------------------------------------------------------------------ PROCEDURE write_text ( conn IN OUT NOCOPY utl_smtp . connection , message IN VARCHAR2 ) IS BEGIN utl_smtp . write_data ( conn , message ); END;
------------------------------------------------------------------------ PROCEDURE write_mb_text ( conn IN OUT NOCOPY utl_smtp . connection , message IN VARCHAR2 ) IS BEGIN utl_smtp . write_raw_data ( conn , utl_raw . cast_to_raw ( message )); END;
------------------------------------------------------------------------ PROCEDURE write_raw ( conn IN OUT NOCOPY utl_smtp . connection , message IN RAW ) IS BEGIN utl_smtp . write_raw_data ( conn , message ); END;
------------------------------------------------------------------------ PROCEDURE attach_text ( conn IN OUT NOCOPY utl_smtp . connection , data IN VARCHAR2 , mime_type IN VARCHAR2 DEFAULT 'text/plain' , inline IN BOOLEAN DEFAULT TRUE, filename IN VARCHAR2 DEFAULT NULL, last IN BOOLEAN DEFAULT FALSE) IS
http://skyccu.skytechsolutions.co.in/mail/sde.nsf/e8df2e674e11c2b36...
5 of 7 6/3/2008 10:31 PM
BEGIN begin_attachment ( conn , mime_type , inline , filename ); write_text ( conn , data ); end_attachment ( conn , last ); END;
------------------------------------------------------------------------ PROCEDURE attach_base64 ( conn IN OUT NOCOPY utl_smtp . connection , data IN RAW , mime_type IN VARCHAR2 DEFAULT 'application/octet' , inline IN BOOLEAN DEFAULT TRUE, filename IN VARCHAR2 DEFAULT NULL, last IN BOOLEAN DEFAULT FALSE) IS i PLS_INTEGER ; len PLS_INTEGER ; BEGIN begin_attachment ( conn , mime_type , inline , filename , 'base64' );
-- Split the Base64-encoded attachment into multiple lines i := 1 ; len := utl_raw . length ( data ); WHILE ( i < len ) LOOP IF ( i + MAX_BASE64_LINE_WIDTH < len ) THEN utl_smtp . write_raw_data ( conn , utl_encode . base64_encode ( utl_raw . substr ( data , i , MAX_BASE64_LINE_WIDTH ))); ELSE utl_smtp . write_raw_data ( conn , utl_encode . base64_encode ( utl_raw . substr ( data , i ))); END IF; utl_smtp . write_data ( conn , utl_tcp . CRLF ); i := i + MAX_BASE64_LINE_WIDTH ; END LOOP; end_attachment ( conn , last );
END;
------------------------------------------------------------------------ PROCEDURE begin_attachment ( conn IN OUT NOCOPY utl_smtp . connection , mime_type IN VARCHAR2 DEFAULT 'text/plain' , inline IN BOOLEAN DEFAULT TRUE, filename IN VARCHAR2 DEFAULT NULL, transfer_enc IN VARCHAR2 DEFAULT NULL) IS BEGIN write_boundary ( conn ); write_mime_header ( conn , 'Content-Type' , mime_type );
IF ( filename IS NOT NULL) THEN IF ( inline ) THEN write_mime_header ( conn , 'Content-Disposition' , 'inline; filename="' ||filename|| '"' ); ELSE write_mime_header ( conn , 'Content-Disposition' , 'attachment; filename="' ||filename|| '"' ); END IF; END IF;
IF ( transfer_enc IS NOT NULL) THEN write_mime_header ( conn , 'Content-Transfer-Encoding' , transfer_enc ); END IF; utl_smtp . write_data ( conn , utl_tcp . CRLF ); END;
------------------------------------------------------------------------ PROCEDURE end_attachment ( conn IN OUT NOCOPY utl_smtp . connection , last IN BOOLEAN DEFAULT FALSE) IS BEGIN utl_smtp . write_data ( conn , utl_tcp . CRLF ); IF ( last ) THEN write_boundary ( conn , last ); END IF; END;
------------------------------------------------------------------------ PROCEDURE end_mail ( conn IN OUT NOCOPY utl_smtp . connection ) IS BEGIN
http://skyccu.skytechsolutions.co.in/mail/sde.nsf/e8df2e674e11c2b36...
6 of 7 6/3/2008 10:31 PM
end_mail_in_session ( conn ); end_session ( conn ); END;
------------------------------------------------------------------------ FUNCTION begin_session RETURN utl_smtp . connection IS conn utl_smtp . connection ; BEGIN -- open SMTP connection conn := utl_smtp . open_connection ( smtp_host , smtp_port ); utl_smtp . helo ( conn , smtp_domain ); RETURN conn ; END;
------------------------------------------------------------------------ PROCEDURE begin_mail_in_session ( conn IN OUT NOCOPY utl_smtp . connection , sender IN VARCHAR2 , recipients IN VARCHAR2 , subject IN VARCHAR2 , mime_type IN VARCHAR2 DEFAULT 'text/plain' , priority IN PLS_INTEGER DEFAULT NULL) IS my_recipients VARCHAR2 ( 32767 ) := recipients ; my_sender VARCHAR2 ( 32767 ) := sender ; BEGIN
-- Specify sender's address (our server allows bogus address -- as long as it is a full email address ([email protected]). utl_smtp . mail ( conn , get_address ( my_sender ));
-- Specify recipient(s) of the email. WHILE ( my_recipients IS NOT NULL) LOOP utl_smtp . rcpt ( conn , get_address ( my_recipients )); END LOOP;
-- Start body of email utl_smtp . open_data ( conn );
-- Set "From" MIME header write_mime_header ( conn , 'From' , sender );
-- Set "To" MIME header write_mime_header ( conn , 'To' , recipients );
-- Set "Subject" MIME header write_mime_header ( conn , 'Subject' , subject );
-- Set "Content-Type" MIME header write_mime_header ( conn , 'Content-Type' , mime_type );
-- Set "X-Mailer" MIME header write_mime_header ( conn , 'X-Mailer' , MAILER_ID );
-- Set priority: -- High Normal Low -- 1 2 3 4 5 IF ( priority IS NOT NULL) THEN write_mime_header ( conn , 'X-Priority' , priority ); END IF;
-- Send an empty line to denotes end of MIME headers and -- beginning of message body. utl_smtp . write_data ( conn , utl_tcp . CRLF );
IF ( mime_type LIKE 'multipart/mixed%' ) THEN write_text ( conn , 'This is a multi-part message in MIME format.' || utl_tcp . crlf ); END IF;
END;
------------------------------------------------------------------------ PROCEDURE end_mail_in_session ( conn IN OUT NOCOPY utl_smtp . connection ) IS BEGIN utl_smtp . close_data ( conn ); END;
http://skyccu.skytechsolutions.co.in/mail/sde.nsf/e8df2e674e11c2b36...
7 of 7 6/3/2008 10:31 PM
------------------------------------------------------------------------ PROCEDURE end_session ( conn IN OUT NOCOPY utl_smtp . connection ) IS BEGIN utl_smtp . quit ( conn ); END;
END; /
BEGIN demo_mail . mail ( sender => 'Me <[email protected]>' , recipients => 'Someone <Mobile_No@Celluler_Service_Provider_Domain.com>' , subject => 'SMS From Oracle Database Server' , message => 'Hi! This is a test Message.' ); END;
Satyaki De
Oracle Developer SkyTech Solutions Pvt Ltd. Sec-V, Salt Lake-91. Ph:(91-33) 2357-5441 Extn: 2548