sql >> Base de Datos >  >> RDS >> Oracle

Proporcione credenciales a UTL_MAIL.SEND para omitir ORA-29278

Básicamente, debe usar el "nivel inferior" UTL_SMTP paquete para enviar los diversos mensajes SMTP requeridos por el servidor SMTP distante.

Autenticación

Del 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);  

El problema principal aquí es que debe poder enviar el AUTH mensaje utilizando el esquema de autenticación "correcto" para su servidor. No puedo decir por "smtp.live.com" específicamente, pero dependiendo de la configuración del servidor, pueden ser diferentes esquemas de autenticación, como PLAIN y LOGIN , DIGEST_MD5 , ... Usualmente (¿siempre?) los parámetros (username , password ) están codificados en base64.

Enviando correo

Pero las malas noticias Es decir, dado que ahora está utilizando una biblioteca de bajo nivel, debe implementar la parte del cliente de Protocolo SMTP tú mismo. De la misma fuente que la anterior (editado por mí mismo para mantener solo las cosas absolutamente mínimas necesarias ):

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); 

Uso de SSL/TLS

Y ahora, las muy malas noticias :algún servidor requería una conexión segura . Reclamando algo como 530 Must issue a STARTTLS command first . Lamentablemente, UTL_SMTP.STARTTLS solo se admite a partir de Oracle Database 11g versión 2 (11.2.0.2).

Si tiene la suerte de usar una versión reciente de Oracle, debe escribir algo así para abrir una conexión segura con su servidor:

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);

Para citar la documentación de Oracle:

Consulte la documentación correspondiente para ver cómo crear y administrar billetera

Algunas lecturas más: