30. April 2009

Email abrufen mit PL/SQL: Package MAIL_CLIENT

English title: PL/SQL Mail Client API

Das Versenden von Emails mit PL/SQL ist ja recht einfach; dazu gibt es fertige Pakete: UTL_SMTP, UTL_MAIL und für APEX-Entwickler gibt es nochmals APEX_MAIL. Anders sieht es aus, wenn es darum geht, ein Postfach auszulesen, also Mails zu empfangen. Dazu hatte ich schon die eine oder andere Anfrage, so dass ich mich vor einiger Zeit entschlossen habe, das Thema mal anzugehen.
As most of you know sending emails from SQL or PL/SQL is not a problem. There are PL/SQL packages available out-of-the-box: UTL_SMTP, UTL_MAIL or APEX_MAIL. The latter one is intended for APEX developers. But when it is about retrieving messages from a mailbox server there is no package available. At the first glance this seems to be not possible. But wait: There is a JVM in the database and java developers know about the Java Mail API. This API is also contained in the database. Since I had some talks about such a functionality in the past I once started to build a Package MAIL_CLIENT which is just capable to receive emails.
Das Ergebnis ist ein PL/SQL-Package MAIL_CLIENT und einige Objekttypen. Die Kommunikation mit dem Mailserver via POP- oder IMAP-Protokoll wird von der Java Mail API übernommen, die dank der datenbankinternen JVM in der Datenbank vorhanden ist. Ihr könnt das Package hier herunterladen.
You can download the package here (documentation and sample scripts are contained):
Dokumentation und Beispielskripte sind im Paket enthalten. Die Nutzung ist recht einfach. Zunächst muss eine Verbindung zum Mailserver hergestellt werden.
Usage is easy: First connect to a mail server and open a folder (INBOX in most cases).
After that retrieve the mail headers ...
Nun kann man sich die vorhandenen Mails abrufen ...
Danach kann man sich eine Nachricht als MAIL_T abrufen. Der Zugriff erfolgt dabei stets über die Nachrichten-Nummer (msg_number)...
A message is being represented by MAIL_T. MAIL_CLIENT.GET_MESSAGE retrieves the message details but not the actual message content.
MAIL_T ist ein Objekttyp und steht für eine Nachricht auf dem Server. Einfache Textnachrichten kann man bspw. mit MAIL_T.GET_SIMPLE_CONTENT_CLOB abrufen. Für Multipart-Nachrichten (Mails mit Attachments) gibt es eigene Methoden. Mehr dazu in der Dokumentation.
The actual content is being retrieved with MAIL_T.GET_SIMPLE_CONTENT_CLOB. This is for simple text messages. There are special methods for Multipart messages. A messages with attachments is an example for a multipart message. See the documentation for more information.
Und schließlich wird die Verbindung zum Mailserver getrennt.
Finally disconnect from the mailserver.
Viel Spaß beim Ausprobieren ...
Have fun.

Beliebte Postings