Mail direkt aus der Oracle-DB versenden (utp_smtp)

Da es immerwieder nachgefragt wird, hier auf die Schnelle, wie aus der DB Mails versendet werden können.
Wichtig: Das Beispiel versucht Umlaute im Mailbody und im angehängten File zu erhalten (daher der Umweg über quoted_printable).


-- Author : SCHMIFA
-- Created : 06.07.2010 13:51:36
-- Purpose : Test-Mailversand
procedure Testmail -- Purpose : Test-Mailversand
is

v_ErrCode varchar2(100); -- Fehlercode
v_ErrTxt varchar2(1500); -- Fehlermeldung

c_Modul varchar2(100) := 'Testmail';

-- Mail-Variablen
v_From VARCHAR2(80) := 'oracle-server@rz.de';
v_Recipient VARCHAR2(80) := 'frank.schmidt@firma.de';
v_Subject VARCHAR2(80);
v_Mail_Host VARCHAR2(30) := localhost; -- SMPTP Host (local machine)
v_Mail_Conn utl_smtp.Connection;

v_filename varchar2(50 byte) := 'mail_anhang.txt';

-- Sub-Proc für verkürzte Schreibweise - s1 = Send - für alle INHALTS-Zeilen
-- Umwandlung in quoted_printable, um Umlaute und Sonderzeichen anzeigen zu können
procedure s1 (p_content in varchar2)
as
begin
utl_smtp.write_data(v_Mail_Conn, utl_encode.text_encode(p_content || utl_tcp.CRLF, 'WE8ISO8859P15', UTL_ENCODE.QUOTED_PRINTABLE));
end;

-- Sub-Proc für verkürzte Schreibweise - s = Send - OHNE Quoted_Printable -> für alle Steuerzeilen!!!
-- für Steuerzeilen KEINE Umwandlung in quoted_printable
procedure s2 (p_content in varchar2)
as
begin
utl_smtp.write_data(v_Mail_Conn, p_content || utl_tcp.CRLF);
end;

begin

-- SELECT sys_context('USERENV', 'LANGUAGE') INTO v_env FROM dual;
-- SELECT sys_context('USERENV', 'DB_UNIQUE_NAME') INTO v_db FROM dual;

v_Subject := '*** Testmail ***';

-- Mail-Versand
v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);

utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);

utl_smtp.Mail(v_Mail_Conn, v_From);

utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);

utl_smtp.open_data (v_Mail_Conn);

s2('Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss'));
s2('From: ' || v_From);
s2('Subject: '|| v_Subject);
s2('To: ' || v_Recipient);

s2('MIME-version: 1.0'); -- Use MIME mail standard
s2('Content-Type: multipart/mixed;');
s2(' boundary="-----SECBOUND"');
s2('-------SECBOUND');

s2('Content-Type: text/plain; charset=ISO-8859-15');
s2('Content-Transfer-Encoding: quoted-printable');

s2(null);
-- Message body
s1('Hallo, ');
s1(null);
s1('dies ist eine Mail zum Testen eines Mailverteilers.');
s1(null);
s1('!!! BITTE IGNORIEREN !!!');
s1(null);
s1('Umlaute-Test: äöü ÄÖÜ ß');
s1(null);
s1('Mit freundlichen Grüßen,');
s1(null);
s1('Ihre Kollegen');
s2('-------SECBOUND');

-- Anhang
s2('Content-Type: text/txt; charset=ISO-8859-15');
s2(' name="'||v_filename||'"');
s2('Content-Transfer-Encoding: quoted-printable');
s2('Content-Disposition: attachment;');
s2(' filename="'||v_filename||'"');
s2(null);
-- Content of attachment
s1('Inhalt des Anhangs mit Umlauten: äöü ÄÖÜ ß.');
s1(null);
s2('-------SECBOUND--'); -- End MIME mail

utl_smtp.close_data(v_Mail_Conn);

utl_smtp.Quit(v_mail_conn);


exception
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error THEN
log(c_Modul, 'Unable to send mail: '||sqlerrm);
log(c_Modul, 'FEHLER Mailversand '||v_ErrCode||' / '||v_ErrTxt);
raise;
when others then
v_ErrCode := sqlcode;
v_ErrTxt := substr(sqlerrm,1,300);
log(c_Modul, 'FEHLER Mailversand '||v_ErrCode||' / '||v_ErrTxt);
raise;
end Testmail;

Kommentare

Beliebte Posts aus diesem Blog

PGA unter Oracle 11g

trunc(sysdate) - nette Spiele mit dem Datum

Datapump - Verzeichnis erstellen