CREATE OR REPLACE PACKAGE BODY amfr_messaging IS -- c_sms_spool_dir CONSTANT VARCHAR2(200) := cout_system_configuration.get_configuration_item('G_SMS_SPOOL_DIR'); c_sms_enabled CONSTANT VARCHAR2(200) := cout_system_configuration.get_configuration_item('G_SMS_ENABLED'); c_directory_name CONSTANT VARCHAR2(15) := 'sms_spool_dir'; -- c_mslo_id NUMBER := 0; -- PROCEDURE setup_dir IS BEGIN -- EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY '||c_directory_name||' as '''||c_sms_spool_dir||''''; -- END setup_dir; -- /** -- Procedure to send an SMS message -- @param p_sms_number VARCHAR The number of the SMS recipient, including the international code but without the leading + -- @param p_sms_message VARCHAR The SMS message to send, message passed in as text */ PROCEDURE send_sms_message ( p_sms_number IN VARCHAR2 , p_sms_message IN VARCHAR2 ) IS -- l_file_handle utl_file.file_type; l_file_name VARCHAR2(100); -- l_unicode_message BOOLEAN := FALSE; -- BEGIN -- IF c_sms_spool_dir IS NOT NULL AND UPPER(c_sms_enabled) = 'Y' THEN -- -- There is a spool directory specified and SMS messages are to be sent, set up the file name -- IF cout_system_configuration.get_configuration_item('G_UNICODE_SMS') = 'Y' THEN -- l_unicode_message := TRUE; -- END IF; -- SELECT sms_seq.NEXTVAL INTO l_file_name FROM DUAL; -- l_file_name := 'msg'||l_file_name||'.sms'; -- -- Open the file for writing -- l_file_handle := utl_file.fopen ( location => UPPER(c_directory_name) , filename => l_file_name , open_mode => 'w' , max_linesize => 1024 ); -- utl_file.put_line( l_file_handle , 'To: ' || LTRIM(LTRIM(p_sms_number,'+'),'0')); -- IF l_unicode_message THEN -- utl_file.put_line( l_file_handle , 'Alphabet: unicode' ); -- utl_file.put_line( l_file_handle , '' ); -- utl_file.put_line( l_file_handle , p_sms_message ); -- ELSE -- utl_file.put_line( l_file_handle , '' ); -- utl_file.put_line( l_file_handle , p_sms_message ); -- END IF; -- utl_file.fclose(l_file_handle); -- END IF; -- END send_sms_message; -- PROCEDURE send_smtp_email ( from_name VARCHAR2 , to_names VARCHAR2 , subject VARCHAR2 , message VARCHAR2 DEFAULT NULL , html_message VARCHAR2 DEFAULT NULL , cc_names VARCHAR2 DEFAULT NULL , bcc_names VARCHAR2 DEFAULT NULL , filename VARCHAR2 DEFAULT NULL , file_mime_type VARCHAR2 DEFAULT NULL , filecontents BLOB DEFAULT NULL ) IS -- smtp_host VARCHAR2(256) := cout_system_configuration.get_configuration_item('SYSTEM_SMTP_SERVER'); smtp_port NUMBER := cout_system_configuration.get_configuration_item('SYSTEM_SMTP_PORT'); -- boundary CONSTANT VARCHAR2(256) := 'CES.Boundary.DACA587499938898'||TO_CHAR(SYSDATE, 'DDMMYYYYHH24MISS'); -- crlf VARCHAR2(2) := chr(13) || chr(10); mesg VARCHAR2(32767); conn utl_smtp.connection; -- max_base64_line CONSTANT pls_integer := 76 / 4 * 3; --32000; -- ind PLS_INTEGER; len PLS_INTEGER; -- BEGIN conn := utl_smtp.open_connection(smtp_host ,smtp_port); utl_smtp.helo(conn ,smtp_host); utl_smtp.mail(conn ,from_name); utl_smtp.rcpt(conn ,to_names); IF cc_names IS NOT NULL THEN utl_smtp.rcpt(conn ,cc_names); END IF; IF bcc_names IS NOT NULL THEN utl_smtp.rcpt(conn ,bcc_names); END IF; utl_smtp.open_data(conn); mesg := 'Date: ' || TO_CHAR(systimestamp , 'dd Mon yyyy hh24:mi:ss tzhtzm','NLS_DATE_LANGUAGE=English')|| crlf || 'From: ' || from_name || crlf || 'Subject: ' || subject || crlf || 'To: ' || to_names || crlf; IF cc_names IS NOT NULL THEN mesg := mesg || 'Cc: ' || cc_names || crlf; END IF; IF bcc_names IS NOT NULL THEN mesg := mesg || 'Bcc: ' || bcc_names || crlf; END IF; mesg := mesg || 'Mime-Version: 1.0' || crlf || 'Content-Type: multipart/mixed; boundary="' || boundary || '"' || crlf || crlf || 'This is a Mime message, which your current mail reader may not' || crlf || 'understand. Parts of the message will appear as text. If the remainder' || crlf || 'appears as random characters in the message body, instead of as' || crlf || 'attachments, then you''ll have to extract these parts and decode them' || crlf || 'manually.' || crlf || crlf; utl_smtp.write_data(conn ,mesg); IF message IS NOT NULL THEN mesg := '--' || boundary || crlf || 'Content-Type: text/plain; name="message.txt"; charset="iso-8859-2"' || crlf || 'Content-Disposition: inline; filename="message.txt"' || crlf || 'Content-Transfer-Encoding: quoted-printable' || crlf || crlf; mesg := '--' || boundary || crlf || 'Content-Type: text/plain; charset="iso-8859-2"' || crlf || 'Content-Disposition: inline; ' || crlf || crlf; utl_smtp.write_data(conn ,mesg); IF SUBSTR(message ,1 ,1) = '/' THEN utl_smtp.write_data(conn ,crlf); ELSE utl_smtp.write_data(conn ,message || crlf); END IF; END IF; -- IF html_message IS NOT NULL THEN mesg := '--' || boundary || crlf || 'Content-Type: text/html; name="message.html"; charset=US-ASCII' || crlf || 'Content-Disposition: inline; filename="message.html"' || crlf || 'Content-Transfer-Encoding: 7bit' || crlf || crlf; utl_smtp.write_data(conn ,mesg); IF SUBSTR(html_message ,1 ,1) = '/' THEN utl_smtp.write_data(conn ,crlf); ELSE utl_smtp.write_data(conn ,html_message || crlf); END IF; END IF; -- IF filecontents IS NOT NULL AND file_mime_type IS NOT NULL THEN -- mesg := crlf || '--' || boundary || crlf; mesg := mesg || 'Content-Type: ' || file_mime_type || '; name="' || filename || '"' || crlf || 'Content-Disposition: attachment; filename="' || filename || '"' || crlf; mesg := mesg || 'Content-Transfer-Encoding: base64' || crlf || crlf; utl_smtp.write_data(conn ,mesg); -- ind := 1; len := dbms_lob.getlength(filecontents); -- WHILE ( ind < len ) LOOP IF (ind + max_base64_line < len) THEN -- utl_smtp.write_raw_data( conn , utl_encode.base64_encode(dbms_lob.substr(filecontents, max_base64_line, ind)) ); -- ELSE -- utl_smtp.write_raw_data( conn , utl_encode.base64_encode(dbms_lob.substr(filecontents, (len+1 - ind), ind)) ); -- END IF; -- utl_smtp.write_data(conn ,crlf); -- ind := ind + max_base64_line; -- END LOOP; -- utl_smtp.write_data(conn ,crlf); -- END IF; -- mesg := crlf || '--' || boundary || '--' || crlf; utl_smtp.write_data(conn ,mesg); -- -- Close the SMTP connection -- utl_smtp.close_data(conn); utl_smtp.quit(conn); -- END send_smtp_email; -- PROCEDURE send_smime_email ( from_name VARCHAR2 , to_names VARCHAR2 , subject VARCHAR2 , message VARCHAR2 DEFAULT NULL , html_message VARCHAR2 DEFAULT NULL , cc_names VARCHAR2 DEFAULT NULL , bcc_names VARCHAR2 DEFAULT NULL , filename VARCHAR2 DEFAULT NULL , file_mime_type VARCHAR2 DEFAULT NULL , filecontents BLOB DEFAULT NULL ) IS -- l_job VARCHAR2(1000); l_lock NUMBER; -- BEGIN -- IF c_mslo_id = 0 THEN -- INSERT INTO messaging_log (mslo_id ,from_name ,to_names ,subject ,message ,html_message ,cc_names ,bcc_names ,filename ,file_mime_type ,filecontents ,senton) VALUES ( mslo_seq.nextval , from_name , to_names , subject , NVL(message, ' ') , NULL , NULL , NULL , filename , file_mime_type , filecontents , NULL) RETURNING mslo_id INTO c_mslo_id; -- COMMIT; -- need this here for the external smime call -- END IF; -- l_job := 'email_'||c_mslo_id; -- l_lock := dbms_lock.request(id => 101202303 ,lockmode => 6 ,timeout => 30); -- dbms_scheduler.create_job(job_name => l_job ,job_type => 'EXECUTABLE' ,job_action => cout_system_configuration.get_configuration_item('G_SMIME_LOCATION') || '\smime.bat' ,number_of_arguments => 1 ,enabled => FALSE ,job_class => 'BATCH_EMAIL_CLASS' ); -- dbms_scheduler.set_job_argument_value(l_job,1,TO_CHAR(c_mslo_id)); -- dbms_scheduler.enable(l_job); dbms_lock.sleep(2); l_lock := dbms_lock.release(id => 101202303); -- EXCEPTION WHEN OTHERS THEN -- cout_err.report_and_go; -- END send_smime_email; -- PROCEDURE send_email ( from_name VARCHAR2 , to_names VARCHAR2 , subject VARCHAR2 , message VARCHAR2 DEFAULT NULL , html_message VARCHAR2 DEFAULT NULL , cc_names VARCHAR2 DEFAULT NULL , bcc_names VARCHAR2 DEFAULT NULL , filename VARCHAR2 DEFAULT NULL , file_mime_type VARCHAR2 DEFAULT NULL , filecontents BLOB DEFAULT NULL ) IS BEGIN -- IF NVL(UPPER(cout_system_configuration.get_configuration_item('EMAIL_METHOD')), 'SMTP') = 'SMTP' THEN -- send_smtp_email ( from_name => from_name , to_names => to_names , subject => subject , message => message , html_message => html_message , cc_names => cc_names , bcc_names => bcc_names , filename => filename , file_mime_type => file_mime_type , filecontents => filecontents ); -- ELSIF UPPER(cout_system_configuration.get_configuration_item('EMAIL_METHOD')) = 'SMIME' THEN -- send_smime_email ( from_name => from_name , to_names => to_names , subject => subject , message => message , html_message => html_message , cc_names => cc_names , bcc_names => bcc_names , filename => filename , file_mime_type => file_mime_type , filecontents => filecontents ); -- ELSE -- cout_err.report_and_stop('-20001','Unknown Email Method'); -- END IF; -- END send_email; -- PROCEDURE send_background_email ( from_name VARCHAR2 , to_names VARCHAR2 , subject VARCHAR2 , message VARCHAR2 DEFAULT NULL , html_message VARCHAR2 DEFAULT NULL , cc_names VARCHAR2 DEFAULT NULL , bcc_names VARCHAR2 DEFAULT NULL , filename VARCHAR2 DEFAULT NULL , file_mime_type VARCHAR2 DEFAULT NULL , filecontents BLOB DEFAULT NULL ) IS -- l_job NUMBER; l_mslo_id messaging_log.mslo_id%TYPE; -- BEGIN -- INSERT INTO messaging_log (mslo_id ,from_name ,to_names ,subject ,message ,html_message ,cc_names ,bcc_names ,filename ,file_mime_type ,filecontents ,senton) VALUES ( mslo_seq.nextval , from_name , to_names , subject , NVL(message, ' ') , html_message , cc_names , bcc_names , filename , file_mime_type , filecontents , NULL) RETURNING mslo_id INTO l_mslo_id; -- DBMS_JOB.SUBMIT ( l_job , 'amfr_messaging.send_email_job ( '||l_mslo_id||' );' ); -- END send_background_email; -- PROCEDURE send_email_job ( p_job IN NUMBER ) IS -- l_msg_rec messaging_log%ROWTYPE; -- BEGIN -- SELECT * INTO l_msg_rec FROM messaging_log ml WHERE ml.mslo_id = p_job; -- c_mslo_id := p_job; -- amfr_messaging.send_email ( from_name => l_msg_rec.from_name , to_names => l_msg_rec.to_names , subject => l_msg_rec.subject , message => l_msg_rec.message , html_message => l_msg_rec.html_message , cc_names => l_msg_rec.cc_names , bcc_names => l_msg_rec.bcc_names , filename => l_msg_rec.filename , file_mime_type => l_msg_rec.file_mime_type , filecontents => l_msg_rec.filecontents ); -- UPDATE messaging_log ml SET ml.senton = sysdate WHERE ml.mslo_id = p_job; -- EXCEPTION WHEN OTHERS THEN cout_err.report_and_stop; END send_email_job; -- FUNCTION about RETURN VARCHAR2 IS BEGIN -- RETURN(g_package_name || CHR(10) || g_revision || CHR(10) || g_header); -- END about; -- BEGIN /** -- Initialization */ NULL; -- END amfr_messaging; /