Fondamentalmente devi usare il "livello inferiore" UTL_SMTP
pacchetto per inviare i vari messaggi SMTP richiesti dal server SMTP distante.
Autenticazione
Dal blog di Stefano Ghio :
-- prepare base64 encoded username and password
l_encoded_username := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(username)));
l_encoded_password := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(password)));
-- Open connection and send EHLO and AUTH messages
l_conn := UTL_SMTP.open_connection(smtpHost, smtpPort);
UTL_SMTP.ehlo(l_conn, smtpHost);--DO NOT USE HELO
UTL_SMTP.command(l_conn, 'AUTH', 'LOGIN');
UTL_SMTP.command(l_conn, l_encoded_username);
UTL_SMTP.command(l_conn, l_encoded_password);
Il problema principale qui è che devi essere in grado di inviare il AUTH
messaggio utilizzando lo schema di autenticazione "giusto" per il tuo server. Non posso dire per "smtp.live.com" in particolare, ma a seconda della configurazione del server, potrebbero essere schemi di autenticazione diversi, come PLAIN
e LOGIN
, DIGEST_MD5
, ... Di solito (sempre ?) i parametri (username
, password
) sono codificati in base64.
Invio di posta
Ma le cattive notizie poiché ora stai utilizzando una libreria di basso livello, devi implementare la parte client di Protocollo SMTP te stesso. Dalla stessa fonte di cui sopra (modificato da me stesso per mantenere solo il materiale assolutamente minimo necessario ):
UTL_SMTP.mail(l_conn, mailFrom);
UTL_SMTP.rcpt(l_conn, rcptTo);
[...]
--start multi line message
UTL_SMTP.open_data(l_conn);
--prepare mail header
UTL_SMTP.write_data(l_conn, 'To: ' || rcptTo || crlf);
UTL_SMTP.write_data(l_conn, 'From: ' || mailFrom || crlf);
UTL_SMTP.write_data(l_conn, 'Subject: ' || messageSubject || crlf);
--include the message body
UTL_SMTP.write_data(l_conn, messageBody || crlf || crlf);
--send the email and close connection
UTL_SMTP.close_data(l_conn);
UTL_SMTP.quit(l_conn);
Utilizzo di SSL/TLS
E ora, per le bruttissime notizie :alcuni server richiedevano una connessione sicura . Rivendicare qualcosa come 530 Must issue a STARTTLS command first
. Sfortunatamente, UTL_SMTP.STARTTLS
è supportato solo a partire da Oracle Database 11g versione 2 (11.2.0.2).
Se sei abbastanza fortunato da utilizzare una versione recente di Oracle, dovresti scrivere qualcosa del genere per aprire una connessione sicura con il tuo server:
l_conn := UTL_SMTP.open_connection(l_conn, smtpHost,
wallet_path => 'file:/oracle/wallets/smtp_wallet',
wallet_password => 'password',
secure_connection_before_smtp => FALSE);
UTL_SMTP.starttls(l_conn);
Per citare la documentazione di Oracle:
Consulta la documentazione corrispondente per vedere come creare e gestire il portafoglio
Ancora qualche lettura:
- Documentazione Oracle sull'invio di e-mail da PL/SQL
ha anche alcuni esempi carini che ti descrivono per inviare correttamente il tuo messaggio di posta usando
UTL_SMTP
. - Consulta la pagina Wikipedia sull'autenticazione SMTP per la trascrizione di una tipica sessione SMTP.