По принцип трябва да използвате "по-ниското ниво" UTL_SMTP
пакет, за да изпратите различните SMTP съобщения, изисквани от отдалечения SMTP сървър.
Удостоверяване
От блога на Стефано Гио :
-- 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);
Основният проблем тук е, че трябва да можете да изпратите AUTH
съобщение, използвайки "правилната" схема за удостоверяване за вашия сървър. Не мога да кажа за "smtp.live.com" конкретно, но в зависимост от конфигурацията на сървъра, те може да са с различна схема за удостоверяване, като PLAIN
и LOGIN
, DIGEST_MD5
, ... Обикновено (винаги?) параметрите (username
, password
) са кодирани base64.
Изпращане на имейл
Но лошите новини тъй като сега използвате библиотека от ниско ниво, трябва да внедрите клиентската част на SMTP протокол себе си. От същия източник като по-горе (редактиран от мен, за да запазя само абсолютно минимално необходимите неща ):
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
А сега, за много лошите новини :някои сървъри изискват сигурна връзка . Изискване на нещо като 530 Must issue a STARTTLS command first
. За съжаление, UTL_SMTP.STARTTLS
се поддържа само от Oracle Database 11g версия 2 (11.2.0.2).
Ако имате достатъчно късмет да използвате скорошна версия на Oracle, трябва да напишете нещо подобно, за да отворите защитена връзка с вашия сървър:
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);
За да цитирам документацията на Oracle:
Моля, вижте съответната документация, за да видите как да създадете и управлявайте портфейла
Още малко четения:
- Документация на Oracle за изпращане на имейл от PL/SQL
има и някои хубави примери, показващи как правилно да изпратите вашето имейл съобщение чрез
UTL_SMTP
. - Вижте страницата на Wikipedia за SMTP удостоверяване за транскрипция на типична SMTP сесия.