474 lines
17 KiB
Plaintext
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;
|
|
/
|