|
Invio di un Messaggio di Posta tramite Oracle 8i V 8.1.6, versione 2
di Mirco Grieco
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.
|