Als PDF Downloaden!

Werbung
Tipps & Tricks: Januar 2006
Bereich:
DBA, PL/SQL
Erstellung:
12/2005 HA
Versionsinfo:
10.2, 11.1, 11.2
Letzte Überarbeitung:
06/2009 MP
E-Mails versenden mit UTL MAIL (10g)
Mit Version 10g hat Oracle UTL_MAIL herausgebracht, ein neues Package, das wesentlich
mehr Anwendungskomfort bietet. Für die Versionen 10.1.x ist jedoch eine ganze Reihe von
Bugs beschrieben, die spätestens in Version 10.2. behoben wurden, so dass UTL_MAIL erst
ab dieser Version zu empfehlen ist.
Vorbereitungen
Folgende Schritte müssen durchgeführt werden, damit das Package eingesetzt werden kann:
1.Installation:
Aus Sicherheitsgründen ist dieses Package nicht standardmäßig installiert. Zur Installation müssen als
SYS folgende Skripte aufgerufen werden:
<ORACLE_HOME>\RDBMS\ADMIN\utlmail.sql: legt den Package Header an und ein Public
Synonym
<ORACLE_HOME>\RDBMS\ADMIN\prvtmail.plb: legt den Package Body an
2.Konfiguration des SMTP-Servers:
Der INIT<SID>.ora-Parameter SMTP_OUT_SERVER muss gesetzt werden; da dies im laufenden
Betrieb (bis 10.2.0.3) nicht möglich ist, muss die Datenbank hinterher durchgestartet werden. Ab
Version 10.2.0.4 kann der Parameter im laufenden Betrieb verändert werden. Angegeben wird der
Name des SMTP-Servers, optional kann noch die Portnummer ergänzt werden. Wird keine
Portnummer angegeben, so wird als Default Port 25 verwendet.
3.EXECUTE-Recht vergeben
Beispiel:
SQL> CONN / AS SYSDBA
SQL> @?\rdbms\admin\utlmail.sql
Package wurde erstellt.
Synonym wurde erstellt.
SQL> @?\rdbms\admin\prvtmail.plb
Package Body wurde erstellt.
Keine Fehler.
SQL> ALTER SYSTEM SET SMTP_OUT_SERVER='myserver' SCOPE=SPFILE;
...
SQL> GRANT EXECUTE ON UTL_MAIL TO SYSTEM;
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 1 von 4
Mails versenden:
UTL_MAIL bietet drei Prozeduren zum Versenden von E-Mails:
SEND: Versenden einfacher Mails ohne Anhang
SEND_ATTACH_RAW: Versenden von Mails mit binärem Anhang
SEND_ATTACH_VARCHAR2: Versenden von Mails mit Textanhang
Minimal müssen bei allen drei Prozeduren Sender, Empfänger und Mailtext angegeben werden. Bei mehr als
einem Empfänger werden die Adressen durch Kommata getrennt. cc, bcc und subject (Betreff) können noch
optional angegeben werden, ebenso wie mime_type (Default: 'text/plain; charset=us-ascii') und priority. Der
Einsatz von SEND ist sehr einfach.
Beispiel:
DECLARE
v_msg VARCHAR2(32767);
cr VARCHAR2(4000);
BEGIN
cr := CHR(13)||CHR(10);
v_msg := 'Ab Version 10g gibt es ein neues Package.'||cr;
v_msg := v_msg ||'Es heisst UTL_MAIL ';
v_msg := v_msg ||'und dient der Versendung von E-Mails.';
UTL_MAIL.SEND
(sender
=> '[email protected]',
recipients => '[email protected]',
subject
=> 'Neues Package',
message
=> v_msg);
END;
/
Attachments müssen in Form eines RAW- bzw. VARCHAR2-Parameters übergeben werden. Die Nachteile liegen
auf der Hand:
Will man eine Datei anhängen, so muss man diese erst in eine passende Variable einlesen
Der Anhang ist auf 32K beschränkt, da dies in PL/SQL sowohl für RAW als auch für VARCHAR2 die
Grenze ist
Neben dem Attachment können optional noch angegeben werden:
att_inline (Default: TRUE): Gibt an, ob das Attachment Teil des Mail-Bodies sein soll (TRUE) oder nicht
(FALSE)
att_mime_type (Default: 'application/octet')
att_filename (Default: NULL): Das ist der Dateiname, unter dem der Anhang erscheint
Wird nichts angegeben, so erscheint " .dat", daher ist eine Angabe empfehlenswert.
Beispiele:
CREATE DIRECTORY UTL_DIR AS 'C:\temp\For_Mail';
DECLARE
v_file BFILE;
v_buffer RAW(32767);
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 2 von 4
v_len BINARY_INTEGER;
BEGIN
v_file := BFILENAME('UTL_DIR', 'logo.gif');
DBMS_LOB.FILEOPEN(v_file, DBMS_LOB.FILE_READONLY);
v_len := DBMS_LOB.GETLENGTH(v_file);
IF v_len <= 32767 THEN
DBMS_LOB.READ(v_file, v_len, 1, v_buffer);
UTL_MAIL.SEND_ATTACH_RAW(
sender
=> 'sender.de',
recipients => '[email protected]',
subject
=> 'Logo,
message
=> 'Versenden eines Bildes',
attachment => v_buffer,
att_inline => FALSE,
att_filename => 'logo.gif' );
END IF;
DBMS_LOB.FILECLOSE(v_file);
END;
DECLARE
v_file UTL_FILE.FILE_TYPE;
v_line VARCHAR2(4000);
v_buffer VARCHAR2(32767);
cr
VARCHAR2(2000);
v_bs
NUMBER;
v_exists BOOLEAN;
v_len
NUMBER;
BEGIN
cr := CHR(13)||CHR(10);
UTL_FILE.FGETATTR('UTL_DIR', 'test.txt', v_exists, v_len, v_bs);
IF v_exists AND v_len <= 32767 THEN
v_file := UTL_FILE.FOPEN('UTL_DIR', 'test.txt', 'r');
LOOP
BEGIN
UTL_FILE.GET_LINE(v_file, v_line);
v_buffer := v_buffer||cr||v_line;
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(v_file);
IF length(v_buffer) = v_len -2 THEN --letztes CR ergänzen
v_buffer := v_buffer ||cr;
END IF;
v_buffer := SUBSTR(v_buffer, 3); --erstes CR entfernen
UTL_MAIL.SEND_ATTACH_VARCHAR2
(sender
=> '[email protected]',
recipients => '[email protected]',
cc
=> '[email protected]',
bcc
=> '[email protected]',
subject
=> 'UTL_MAIL Text',
message
=> 'Versenden von Text.',
attachment => v_buffer,
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 3 von 4
att_inline => FALSE,
att_filename => 'test.txt' );
ELSE
DBMS_OUTPUT.PUT_LINE('Datei nicht vorhanden oder zu groß');
END IF;
END;
/
Der Parameter att_inline hatte nicht auf alle getesteten Mail-Clients Einfluss. Bei Verwendung von Outlook war
das Attachment nie Teil des Mail-Bodies, sondern immer ein "echter" Anhang.
Alle Beispiele wurden auf Windows-Systemen und Oracle 10.2.0.1.0 getestet. Bei Binärdateien war das
Attachment exakt identisch mit dem Original, bei Textdateien (oder auch direkt übergebenen Strings) wurde am
Dateibeginn stets ein Zeilenumbruch eingefügt. Dieser Bug ist bisher in Metalink nicht beschrieben.
Ein weiterer, für Version 10.2.0.1 beschriebener Bug (Bug Nr.: 4466305, Note:4466305.8) wurde verifiziert: Wenn
"subject" eine gewisse Länge überschreitet - laut Beschreibung 65 Zeichen, in unseren Händen bereits ab 42
Zeichen - wird die Mail praktisch unleserlich, da im Mail-Body diverse Steuerzeichen (und der Anhang)
erscheinen. Außerdem wird der Betreff ab dieser Position abgeschnitten. Ab Version 10.2.0.2 soll auch dieser
Fehler behoben sein.
Wenn Ihr Email-Server eine Authentifizierung benötigt, müssen Sie Ihren Email-Versand mit dem Package
utl_smtp durchführen.
Ergänzungen:
Für die Versionen 10.2.0.3 und 11g konnte verifiziert werden, dass Bug Nr. 4466305 behoben ist.
Auch in 11g fand sich bei der Versendung von Textfiles zu Beginn noch immer ein Zeilenumbruch
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 4 von 4
Herunterladen