Oralce – Inviare una mail da procedure


Il seguente codice (basato sul package di UTL_SMTP di Oracle8i V8.1.6, versione 2) permette di spedire mail tramite la base dati.

Primo passo : nel caso in cui non fossero già presenti,installazione delle classi java necessarie:
Connect as SYS User.

Run %ORACLE_HOME/javavm/plsql/jlib/initjvm.sql

Run %ORACLE_HOME/rdbms/java/install/initplsj.sql

Secondo passo : creazione della procedura che utilizza il package UTL_SMTP
CREATE OR REPLACE PROCEDURE SPEDISCI_MAIL
(
Mittente IN VARCHAR2,
Destinatario IN VARCHAR2,
Oggetto IN VARCHAR2,
Messaggio IN VARCHAR2
)
IS
-- dichiarazione di una variabile a cui assegnare il nome del server SMTP utilizzato
-- in questo esempio l'SMTP è quello di yahoo
mailhost VARCHAR2(30) := smtp.mail.yahoo.it';
-- dichiarazione di una variabile di tipo utl_smtp.connection
-- a cui verrà assegnato l'SMTP ed il numero di porta (25)
conn utl_smtp.connection;
crlf VARCHAR2( 2 ):= CHR( 13 ) || CHR( 10 );
mesg VARCHAR2( 1000 );
local_mittente VARCHAR2(2000) := mittente;
BEGIN
-- Apertura di una connessione al server
conn := utl_smtp.open_connection (mailhost,25);
-- Assegnazione alla variabile mesg dell'intestazione della mail
mesg:='Date:'||TO_CHAR(SYSDATE,'dd mon yy hh24:mi:ss')||crlf||
'From:<'||mittente||'>'||crlf||
'Subject:'||Oggetto||crlf||
'To:'||destinatario||crlf||''
||crlf||messaggio;
-- Apertura di un collegamento al server
utl_smtp.helo(conn, mailhost);
-- Inizio di una transazione di posta con il server passandogli il mittente
utl_smtp.mail(conn,local_mittente);
-- il destinatario
utl_smtp.rcpt(conn,destinatario);
-- ed il testo del messaggio
utl_smtp.data(conn, mesg);
-- Chiusura della connessione
utl_smtp.quit(conn);
END;

Come esempio, per eseguire la procedura possiamo passargli come parametri :

Mittente : mario.rossi@yahoo.it
Destinatario : rossi_mario@yahoo.it
Oggetto del messaggio : Prova Email;

Messaggio : Prova E-Mail con il package UTL_SMTP .

BEGIN
SPEDISCI_MAIL ('mario.rossi@yahoo.it', 'rossi.mario@yahoo.it', 'Prova Email', 'Prova E-Mail con il package UTL_SMTP');
END;

Diamo ora un breve cenno sul server SMTP (Simple Mail Transfer Protocol). E’ un server destinato all’invio della posta e per comunicare con esso ci si deve collegare alla porta 25, riservata appunto al protocollo SMTP.

Per capirne meglio il funzionamento, spieghiamo ora alcune caratteristiche di questo package, ed in particolare quelle procedure e funzione usate dalla procedura Spedisci_Mail.

A-utl_smtp.connection :

E’ un datatype Record che rappresenta il tipo di connessione SMTP. La sintassi è la seguente:

TYPE connection IS RECORD
(
host VARCHAR2(255), -- nome dell'host remoto
port PLS_INTEGER, -- nome della porta remota
private_tcp_con utl_tcp.connection, -- variabile privata
private_state PLS_INTEGER -- variabile privata
);

Host : nome dell’Host remoto dopo aver stabilito il collegamento. La variabile non e’ valorizzata se non e’ stata stabilita una connessione.

Port : numero della porta del server SMTP a cui ci si è collegati. La variabile non e’ valorizzata se non e’ stata stabilita una connessione.

Private_tcp_con : variabile riservata. Gli utenti non dovrebbero modificare questo campo.

B-utl_smtp.open_connection:

Apre un collegamento al server SMTP.
FUNCTION 0pen_connection
(
host IN VARCHAR2,
port IN PLS_INTEGER DEFAULT 25
) return connection;

Quando il collegamento è stato stabilito, la procedura restituisce una variabile di tipo record e controlla il codice di risposta (la risposta attesa è un messaggio che inizia con il codice 220).

C-utl_smtp.helo :

Effettua l’handshaking iniziale con il server SMTP dopo il collegamento.
PROCEDURE helo
(
c IN OUT NOCOPY connection,
domain IN VARCHAR2 DEFAULT NULL
);

Domain: indica il nome del dominio del client locale, ed è usata per scopi di identificazione. Questa procedura esegue l’identificazione dell’utente . Prima di chiamare questa procedura il collegamento deve essere aperto tramite l’utilizzo della procedura open_connection().

La risposta attesa è un messaggio che inizia con il codice 250.

D- utl_smtp.mail : Inizia una transazione della posta con il server. La destinazione è una Mailbox.
PROCEDURE mail
(
c IN OUT NOCOPY connection,
sender IN VARCHAR2,
parameters IN VARCHAR2 DEFAULT NULL
);

Sender : questa variabile indica l’indirizzo email dell’ utente. Questo comando non trasmette il messaggio, ma ne comincia semplicemente la preparazione. Deve essere seguito dalle chiamate a rcpt() ed a data() per completare la transazione. Il collegamento al server SMTP deve essere stato aperto ed il comando helo() deve essere stato trasmesso.

E- utl_smtp.rcpt :

Specifica il destinatario dell’ email.
PROCEDURE rcpt
(
c IN OUT NOCOPY connection,
recipient IN VARCHAR2,
parameters IN VARCHAR2 DEFAULT NULL
);

Recipient : L’email del destinatario del messaggio.

E’ possibile spedire una mail a più destinatari contemporaneamente.E’ sufficiente inserire, nella stringa passata a questa procedura, tra un indirizzo e l’altro, il punto e virgola .

F- utl_smtp.data :

Specifica il contenuto del messaggio.
PROCEDURE data
(
c IN OUT NOCOPY connection,
body IN VARCHAR2
);

Body : testo vero è proprio del messaggio.

La procedura data() deve essere chiamata soltanto dopo l’esecuzione delle procedure open_connection(), helo(), mail() ed rcpt(). Il collegamento al server SMTP deve essere stato aperto ed una transazione di posta deve essere stata attivata quando viene chiamata questa procedura.

G- utl_smtp.quit :

Termina la sessione e disconnette dal server.
PROCEDURE quit
(
c IN OUT NOCOPY connection
);

La procedura quit() informa il server SMTP dell’intenzione dell’utente di terminare la sessione. Chiude il collegamento stabilito da open_connection(). Se una transazione di posta è attiva mentre viene eseguita la procedura quit(), questa viene terminata.

Oralce – Inviare una mail da procedure ultima modifica: 2007-07-03T00:00:00+00:00 da Enrico

4 Comments.

  1. ho provato a seguire il tuo esempio per inviare più di una e-mail ma mi da sempre lo stesso errore ORA-29279.
    anche mettendo il punot e virgola tra i vari indirizzi.
    inoltre anche per il CC o il BCC ci sono problemi come si fa as inviare una email anche a questi indirizzi?
    Grazie

  2. Ciao, l’errore ORA-29279 è un errore esterno di Oracle dovresti controllare anche la descrizione dell’errore potrebbe essere un 501 (sintassi errata) o un 553 (violazione regole relaying) magari un 550 (mailbox unavailable)

    cmq non è un errore dello script di oracle.

  3. Run %ORACLE_HOME/javavm/plsql/jlib/initjvm.sql

    Run %ORACLE_HOME/rdbms/java/install/initplsj.sql

    collegato da sys ? e poi li mando li mando in run con uno script? a me da errore

  4. Ciao Emanuele,
    anche io ho problemi con BC e BCC.
    Come hai risolto?

    Saluti,
    Fabio