V zásadě musíte použít "nižší úroveň" UTL_SMTP
za účelem odeslání různých zpráv SMTP požadovaných vzdáleným serverem SMTP.
Ověření
-- 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);
Hlavním problémem je, že musíte být schopni odeslat AUTH
pomocí "správného" schématu ověřování pro váš server. Nemohu říci pro "smtp.live.com" konkrétně, ale v závislosti na konfiguraci serveru mohou být různé autentizační schéma, například PLAIN
a LOGIN
, DIGEST_MD5
, ... Obvykle (vždy ?) parametry (username
, password
) jsou kódovány base64.
Odesílání pošty
Ale špatné zprávy je, protože nyní používáte nízkoúrovňovou knihovnu, musíte implementovat klientskou část Protokol SMTP vy sám. Ze stejného zdroje jako výše (upraveno mnou, abych zachoval pouze naprosto minimum nezbytných věcí ):
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);
Používání SSL/TLS
A teď k velmi špatným zprávám :některý server vyžadoval zabezpečené připojení . Nárokování něčeho jako 530 Must issue a STARTTLS command first
. Bohužel UTL_SMTP.STARTTLS
je podporováno pouze od Oracle Database 11g verze 2 (11.2.0.2).
Pokud máte to štěstí, že používáte nejnovější verzi Oracle, měli byste napsat něco takového, abyste otevřeli zabezpečené spojení se svým serverem:
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);
Chcete-li citovat dokumentaci společnosti Oracle:
V odpovídající dokumentaci naleznete jak vytvořit a spravovat peněženku
Ještě pár čtení:
- Dokumentace společnosti Oracle o odesílání e-mailů z PL/SQL
má také několik pěkných příkladů, které znázorňují, jak správně odeslat e-mailovou zprávu pomocí
UTL_SMTP
. - Viz stránku Wikipedie ověřování SMTP pro přepis typické relace SMTP.