Versenden SSL-verschlüsselter Mails

03.
Juli
2011
Veröffentlicht von: Hildegard Asenbauer

Mit Version 11.2.0.2 wurde das altbekannte Package UTL_SMTP erweitert. Die wichtigste Neuerung liegt darin, dass jetzt auch SSL-verschlüsselte Mails verschickt werden können. Daneben wurde die Authentifizierung am Mailserver vereinfacht, dafür gibt es jetzt einen eigenen Aufruf.

Mit Version 11.2.0.2 wurde das altbekannte Package UTL_SMTP erweitert. Die wichtigste Neuerung liegt darin, dass jetzt auch SSL-verschlüsselte Mails verschickt werden können. Daneben wurde die Authentifizierung am Mailserver vereinfacht, dafür gibt es jetzt einen eigenen Aufruf.


Wallet einrichten

Wie immer, wenn es um SSL geht, wird auch hierfür ein Wallet benötigt, das erst eingerichtet werden muss. Dieses Wallet muss das Zertifikat des Mailservers beinhalten. Der Speicherort des Wallets wird beim Öffnen der SMTP-Verbindung mitgegeben, zusammen mit dem Passwort des Wallets, daher kann er beliebig gewählt werden. Auto-Login ist nicht erforderlich.


Mailversendung

Beim Öffnen der SMTP-Verbindung muss das Wallet mitgegeben werden, wenn die Mail über SSL versandt werden soll. Hier wird normalerweise bereits eine sichere Verbindung über SSL/TLS aufgebaut, bevor eine SMTP-Kommunikation stattfindet. Falls der Mailserver dies zulässt und ein STARTTLS-Kommando erlaubt, kann auch zunächst eine unverschlüsselte Verbindung angefordert werden, und erst danach wird auf eine verschlüsselte Verbindung gewechselt.

Beispiel:

DECLARE
   v_sender   VARCHAR2 (2000)     := 'h.asenbauer@muniqsoft.de';
   v_rec      VARCHAR2 (2000)     := 'h.asenbauer@muniqsoft.de';
   v_host     VARCHAR2 (2000)     := 'my_mailserver';
   v_con      UTL_SMTP.connection;
   crlf       VARCHAR2 (2)        := CHR (13) || CHR (10);
   v_user     RAW (200);
   v_pwd      RAW (200);
BEGIN
   v_con :=
    UTL_SMTP.open_connection
       (HOST                          => v_host,
        port                          => 465,
        tx_timeout                    => 2,
        wallet_path                   => 'file:C:\app\admin\o11g\WALLET',
        wallet_password               => 'WALLET_PWD',
        secure_connection_before_smtp => true
        );
                               
   UTL_SMTP.helo (v_con, v_host);
   -- verschlüsselte Verbindung erst später initiieren:
   -- (nur möglich, wenn secure_connection_before_smtp = false)
   --  UTL_SMTP.STARTTLS(v_con); 
   -- Authentifizierung
   UTL_SMTP.AUTH
       (c         => v_con,
        username  => 'my_username',
        password  =>'my_password',
        schemes   => UTL_SMTP.NON_CLEARTEXT_PASSWORD_SCHEMES);
 
   UTL_SMTP.mail (v_con, v_sender);
   UTL_SMTP.rcpt (v_con, v_rec);
   UTL_SMTP.open_data (v_con);
   UTL_SMTP.write_data (v_con, 'To: ' || v_rec || '<' || v_rec || '>' || crlf);
   UTL_SMTP.write_data (v_con, 'Subject: UTL_SMTP' || crlf);
   UTL_SMTP.write_data (v_con, 'Diese Mial wurde über SSL versandt');
   UTL_SMTP.close_data (v_con);
   UTL_SMTP.quit (v_con);
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (SQLERRM);
      -- falls bereits das Öffnen fehlschlägt, führt quit-Befehl zu Fehler
      BEGIN
         UTL_SMTP.quit (v_con);
      EXCEPTION
         WHEN OTHERS THEN NULL;
      END;    
END;
/

Wenn das Wallet nicht gefunden wird oder nicht geöffnet werden kann, so führt der Versuch, die Verbindung aufzubauen, zu folgender Fehlermeldung:

ORA-29106: PKCS #12 -Wallet kann nicht importiert werden

Fehlt das Zertifikat des Mailservers im Wallet, so lautet die Fehlermeldung:

ORA-29024: Zertifikatvalidierung nicht erfolgreich

Die ebenfalls mit Version 11.2.0.2 neue eingeführte Prozedur UTL_SMTP.AUTH ist nicht von SSL-Verschlüsselung abhängig; sie erspart nur die umständlichen, zur Authentifizierung früher nötigen utl_smtp.command-Aufrufe.

Jede Menge Know-how für Sie!

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.