I grund och botten måste du använda den "lägre nivån" UTL_SMTP
paket för att skicka de olika SMTP-meddelanden som krävs av den avlägsna SMTP-servern.
Autentisering
Från Stefano Ghios blogg :
-- 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);
Huvudproblemet här är att du måste kunna skicka AUTH
meddelande med "rätt" autentiseringsschema för din server. Jag kan inte säga för "smtp.live.com" specifikt, men beroende på serverns konfiguration kan de ha olika autentiseringsschema, som PLAIN
och LOGIN
, DIGEST_MD5
, ... Vanligtvis (alltid ?) parametrarna (username
, password
) är base64-kodade.
Skicka e-post
Men de dåliga nyheterna eftersom du nu använder ett lågnivåbibliotek måste du implementera klientdelen av SMTP-protokoll själv. Från samma källa som ovan (redigerad av mig själv för att bara behålla absolut minimum nödvändiga saker ):
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);
Använder SSL/TLS
Och nu till de mycket dåliga nyheterna :någon server krävde en säker anslutning . Gör anspråk på något som 530 Must issue a STARTTLS command first
. Tyvärr, UTL_SMTP.STARTTLS
stöds endast från och med Oracle Database 11g version 2 (11.2.0.2).
Om du har turen att använda en ny version av Oracle, bör du skriva något liknande för att öppna en säker anslutning 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);
För att citera Oracles dokumentation:
Se motsvarande dokumentation för att se hur du skapar och hantera plånbok
Några fler läsningar:
- Oracles dokumentation om att skicka e-post från PL/SQL
har några bra exempel som visar dig för att kunna skicka ditt e-postmeddelande korrekt med
UTL_SMTP
. - Se sidan SMTP-autentisering på Wikipedia för en transkription av en typisk SMTP-session.