In principe moet je het "lagere niveau" UTL_SMTP
pakket om de verschillende SMTP-berichten te verzenden die nodig zijn voor de verre SMTP-server.
Verificatie
Van Stefano Ghio's blog :
-- 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);
Het belangrijkste probleem hier is dat u de AUTH
. moet kunnen verzenden bericht met behulp van het "juiste" authenticatieschema voor uw server. Ik kan niet zeggen voor "smtp.live.com" specifiek, maar afhankelijk van de serverconfiguratie kunnen ze een ander authenticatieschema hebben, zoals PLAIN
en LOGIN
, DIGEST_MD5
, ... Meestal (altijd ?) de parameters (username
, password
) zijn met base64 gecodeerd.
E-mail verzenden
Maar het slechte nieuws is, aangezien u nu een bibliotheek op laag niveau gebruikt, moet u het clientgedeelte van de SMTP-protocol jezelf. Van dezelfde bron als hierboven (door mijzelf bewerkt om alleen de absoluut minimaal noodzakelijke dingen te behouden ):
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);
SSL/TLS gebruiken
En nu, voor het zeer slechte nieuws :sommige servers hadden een beveiligde verbinding nodig . Iets claimen als 530 Must issue a STARTTLS command first
. Helaas, UTL_SMTP.STARTTLS
wordt alleen ondersteund vanaf Oracle Database 11g release 2 (11.2.0.2).
Als je het geluk hebt om een recente versie van Oracle te gebruiken, zou je zoiets moeten schrijven om een beveiligde verbinding met je server te openen:
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);
Om de documentatie van Oracle te citeren:
Raadpleeg de bijbehorende documentatie om te zien hoe u maakt en portemonnee beheren
Nog een paar lezingen:
- Oracle's documentatie over het verzenden van e-mail vanaf PL/SQL
heeft ook enkele mooie voorbeelden waarin u wordt afgebeeld om uw e-mailbericht correct te verzenden met behulp van
UTL_SMTP
. - Zie de SMTP-authenticatie Wikipedia-pagina voor een transcriptie van een typische SMTP-sessie.