Oracle
 sql >> Base de données >  >> RDS >> Oracle

Donnez des informations d'identification à UTL_MAIL.SEND pour contourner ORA-29278

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

Du le blog de 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);  

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 :