sql >> Database >  >> RDS >> Oracle

Geef inloggegevens aan UTL_MAIL.SEND om ORA-29278 te omzeilen

In principe moet je het "lagere niveau" UTL_SMTP pakket om de verschillende SMTP-berichten te verzenden die nodig zijn voor de verre SMTP-server.

Verificatie

Van Stefano Ghio's 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);  

Het belangrijkste probleem hier is dat u de AUTH . moet kunnen verzenden bericht met behulp van het "juiste" authenticatieschema voor uw server. Ik kan niet zeggen voor "smtp.live.com" specifiek, maar afhankelijk van de serverconfiguratie kunnen ze een ander authenticatieschema hebben, zoals PLAIN en LOGIN , DIGEST_MD5 , ... Meestal (altijd ?) de parameters (username , password ) zijn met base64 gecodeerd.

E-mail verzenden

Maar het slechte nieuws is, aangezien u nu een bibliotheek op laag niveau gebruikt, moet u het clientgedeelte van de SMTP-protocol jezelf. Van dezelfde bron als hierboven (door mijzelf bewerkt om alleen de absoluut minimaal noodzakelijke dingen te behouden ):

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); 

SSL/TLS gebruiken

En nu, voor het zeer slechte nieuws :sommige servers hadden een beveiligde verbinding nodig . Iets claimen als 530 Must issue a STARTTLS command first . Helaas, UTL_SMTP.STARTTLS wordt alleen ondersteund vanaf Oracle Database 11g release 2 (11.2.0.2).

Als je het geluk hebt om een ​​recente versie van Oracle te gebruiken, zou je zoiets moeten schrijven om een ​​beveiligde verbinding met je server te openen:

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);

Om de documentatie van Oracle te citeren:

Raadpleeg de bijbehorende documentatie om te zien hoe u maakt en portemonnee beheren

Nog een paar lezingen:



  1. JDBC:meerdere resultaatsets retourneren via een enkele database-aanroep - werkt niet voor Oracle

  2. Hoe de tekenset en sortering van een kolom in MySQL in te stellen?

  3. Update Clob-kolom in Oracle

  4. Node.js MySQL-insert probleem