Grundlæggende skal du bruge det "lavere niveau" UTL_SMTP
pakke for at sende de forskellige SMTP-meddelelser, der kræves af den fjerne SMTP-server.
Godkendelse
Fra Stefano Ghios 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);
Hovedproblemet her er, at du skal være i stand til at sende AUTH
besked ved hjælp af den "rigtige" godkendelsesordning for din server. Jeg kan ikke sige for "smtp.live.com" specifikt, men afhængigt af serverens konfiguration kan de være forskellige godkendelsesskemaer, såsom PLAIN
og LOGIN
, DIGEST_MD5
, ... Normalt (altid ?) parametrene (username
, password
) er base64-kodet.
Sender mail
Men de dårlige nyheder er, da du nu bruger et bibliotek på lavt niveau, skal du implementere klientdelen af SMTP-protokol dig selv. Fra samme kilde som ovenfor (redigeret af mig selv for kun at beholde de absolut minimum nødvendige ting ):
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);
Brug af SSL/TLS
Og nu til de meget dårlige nyheder :en eller anden server krævede en sikker forbindelse . Hævde noget som 530 Must issue a STARTTLS command first
. Desværre er UTL_SMTP.STARTTLS
understøttes kun fra Oracle Database 11g release 2 (11.2.0.2).
Hvis du er så heldig at bruge en nyere version af Oracle, bør du skrive sådan noget for at åbne en sikker forbindelse med din server:
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);
For at citere Oracles dokumentation:
Se venligst den tilsvarende dokumentation for at se hvordan du opretter og administrere tegnebog
Lidt flere læsninger:
- Oracles dokumentation om afsendelse af e-mail fra PL/SQL
har nogle gode eksempler, der også viser dig til korrekt at sende din e-mail med
UTL_SMTP
. - Se siden SMTP Authentication Wikipedia for en transskription af en typisk SMTP-session.