sql >> Databasteknik >  >> RDS >> Oracle

Ge inloggningsuppgifter till UTL_MAIL.SEND för att kringgå ORA-29278

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:



  1. Metoder för att ställa in NLS-parametrar och deras prioriteringar (Oracle Database)

  2. Det gick inte att läsa in filen eller sammansättningen 'Oracle.ManagedDataAccess.EntityFramework

  3. Försöker uppdatera 640k rader i mySQL förlorar anslutningen till MySQL-servern under förfrågan

  4. The Eager Index Spool och The Optimizer