Das Paket UTL_SMTP ist natürlich nicht verschwunden und funktioniert wie bisher. Mittels UTL_SMTP öffnet man eine Verbindung zu deinem SMTP-Server, gibt nacheinander über unterschiedliche Prozeduren Sender, Empfänger und Betreff an, und fügt zum Schluss die eigentliche Nachricht an, bevor man die E-Mail abschließt. Im Code schaut das in etwa so aus:
DECLARE
c UTL_SMTP.CONNECTION;
PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2) AS
BEGIN
UTL_SMTP.WRITE_DATA(c, name || ': ' || header || UTL_TCP.CRLF);
END;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('smtp-server.acme.com');
UTL_SMTP.HELO(c, 'foo.com');
UTL_SMTP.MAIL(c, 'sender@foo.com');
UTL_SMTP.RCPT(c, 'recipient@foo.com');
UTL_SMTP.OPEN_DATA(c);
UTL_SMTP.WRITE_DATA(c, 'From: "Sender" <anmo-noreply@muniqsoft-consulting.de>'|| UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c, 'To: "Andreas Mößel" <anmo-test@muniqsoft-consulting.de >'|| UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c, 'Subject: UTL_SMTP'|| UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c, UTL_TCP.CRLF || 'Das ist eine Test Email über das UTL_SMTP Package');
UTL_SMTP.CLOSE_DATA(c);
UTL_SMTP.QUIT(c);
END;
Doch für APEX gibt es einen weiteren Weg, der als eigener deklarativer Prozess unter dem Typ „E-Mail versenden“ verpackt ist. Wenn eine E-Mail mit diesem Prozess versendet werden soll, dann landet diese erstmal in einer Queue, welche ein APEX eigener Job periodisch abarbeitet und die E-Mails tatsächlich los schickt.
Wie man auf dem Bild sieht, gibt es eine überschaubare Anzahl an Eigenschaften für den Prozess. Ein paar davon sind Pflichtfelder, ohne die keine E-Mail abgeschickt werden kann, der Rest ist für komplexere E-Mails gedacht.
Pflichtfelder
Zusatzfelder
Hinter dem Prozess steht ein APEX eigenes Paket APEX_MAIL, das die Funktionen des Prozesses bündelt. Dieses Paket baut auf dem Paket UTL_SMTP auf, weshalb jenes fehlerfrei kompiliert sein muss.
APEX_MAIL ist von Oracle dokumentiert und kann hier nachgelesen werden.
Da dem E-Mail-Versand das Paket UTL_SMTP zugrunde liegt, ist es nötig einen E-Mail-Server zu konfigurieren. Dazu meldet man sich erstmal auf der Datenbank an und richtet das Network ACL ein.
SQLPLUS CONNECT AS SYS AS SYSDBA
DECLARE
L_USERNAME VARCHAR2(30) := 'APEX_220200';
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
HOST => 'localhost',
LOWER_PORT => 25,
ACE => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => l_username,
principal_type => xs_acl.ptype_db));
COMMIT;
END;
In HOST und LOWER_PORT wird entsprechend die der Hostadresse des SMTP Servers und der dazu gehörige Port übergeben.
Anschließend meldet man sich in APEX im INTERNAL Workspace an und steuert ‚Manage Instance‘ -► ‚Instance Settings‘ an, um in APEX die nötigen Informationen für den E-Mail-Versand zu konfigurieren:
Der APEX Prozess „E-Mail versenden“ ist eine einfachere und verständlichere Methode E-Mails zu verschicken als sich für diesen Zweck eine eigene Prozedur zu programmieren, zumal sie mit E-Mail Template, HTML-fähigkeit und der Möglichkeit zum Anhängen von Dateien genügend praktischen Wert aufweist.
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.