Files
mip/Data/BulkLoad/EFT/Nominations/plsql/amfr_messaging.bdy

474 lines
17 KiB
Plaintext

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;
/