sql >> Database teknologi >  >> RDS >> Oracle

Giv legitimationsoplysninger til UTL_MAIL.SEND for at omgå ORA-29278

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:



  1. Mysql Konverter kolonne til række (pivottabel)

  2. Count(*) vs Count(1) - SQL Server

  3. Mocking insert-forespørgsel til en MySQL-database ved hjælp af Moq

  4. Hvordan SYSDATE() virker i MariaDB