Fondamentalement, vous devez utiliser le "niveau inférieur" UTL_SMTP
package afin d'envoyer les différents messages SMTP requis par le serveur SMTP distant.
Authentification
-- 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);
Le principal problème ici est que vous devez être en mesure d'envoyer le AUTH
message en utilisant le "bon" schéma d'authentification pour votre serveur. Je ne peux pas dire pour "smtp.live.com" spécifiquement, mais selon la configuration du serveur, il peut s'agir d'un schéma d'authentification différent, comme PLAIN
et LOGIN
, DIGEST_MD5
, ... Généralement (toujours ?) les paramètres (username
, password
) sont codés en base64.
Envoi de courrier
Mais la mauvaise nouvelle c'est-à-dire que, puisque vous utilisez maintenant une bibliothèque de bas niveau, vous devez implémenter la partie client du Protocole SMTP toi-même. De la même source que ci-dessus (édité par moi-même pour ne garder que le truc absolument nécessaire minimum ):
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);
Utilisation de SSL/TLS
Et maintenant, pour les très mauvaises nouvelles :certains serveurs nécessitaient une connexion sécurisée . Réclamer quelque chose comme 530 Must issue a STARTTLS command first
. Malheureusement, UTL_SMTP.STARTTLS
n'est pris en charge qu'à partir d'Oracle Database 11g version 2 (11.2.0.2).
Si vous avez la chance d'utiliser une version récente d'Oracle, vous devriez écrire quelque chose comme ça pour ouvrir une connexion sécurisée avec votre serveur :
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);
Pour citer la documentation d'Oracle :
Veuillez consulter la documentation correspondante pour voir comment créer et gérer le portefeuille
Quelques lectures supplémentaires :
- Documentation d'Oracle sur l'envoi d'e-mails depuis PL/SQL
contient également de beaux exemples vous montrant comment envoyer correctement votre message électronique en utilisant
UTL_SMTP
. - Consultez la page Wikipédia sur l'authentification SMTP pour une transcription d'une session SMTP typique.