Zasadniczo musisz użyć „niższego poziomu” UTL_SMTP
pakiet w celu wysłania różnych wiadomości SMTP wymaganych przez odległy serwer SMTP.
Uwierzytelnianie
-- 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);
Głównym problemem jest to, że musisz mieć możliwość wysłania AUTH
wiadomość przy użyciu "właściwego" schematu uwierzytelniania dla twojego serwera. Nie mogę powiedzieć o „smtp.live.com” konkretnie, ale w zależności od konfiguracji serwera, mogą to być różne schematy uwierzytelniania, takie jak PLAIN
i LOGIN
, DIGEST_MD5
, ... Zwykle (zawsze ?) parametry (username
, password
) są zakodowane w base64.
Wysyłanie poczty
Ale zła wiadomość ponieważ używasz teraz biblioteki niskiego poziomu, musisz zaimplementować część kliencką Protokół SMTP się. Z tego samego źródła co powyżej (zredagowane przeze mnie, aby zachować tylko absolutnie minimum niezbędne rzeczy ):
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);
Korzystanie z SSL/TLS
A teraz, bardzo złe wieści :niektóre serwery wymagały bezpiecznego połączenia . Twierdzenie czegoś takiego jak 530 Must issue a STARTTLS command first
. Niestety, UTL_SMTP.STARTTLS
jest obsługiwany tylko od wersji Oracle Database 11g 2 (11.2.0.2).
Jeśli masz szczęście używać najnowszej wersji Oracle, powinieneś napisać coś takiego, aby otworzyć bezpieczne połączenie z serwerem:
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);
Cytując dokumentację Oracle:
Zapoznaj się z odpowiednią dokumentacją, aby dowiedzieć się, jak tworzyć i zarządzaj portfelem
Jeszcze kilka odczytów:
- Dokumentacja Oracle dotycząca wysyłania e-maili z PL/SQL
zawiera kilka fajnych przykładów pokazujących, jak poprawnie wysłać wiadomość e-mail przy użyciu
UTL_SMTP
. - Zobacz stronę Wikipedii dotyczącą uwierzytelniania SMTP do transkrypcji typowej sesji SMTP.