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:
- Documentación de Oracle sobre el envío de correo electrónico desde PL/SQL
también tiene algunos buenos ejemplos que lo muestran para enviar correctamente su mensaje de correo usando
UTL_SMTP
. - Consulte la página de Wikipedia de autenticación SMTP para una transcripción de una sesión SMTP típica.