Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Podaj dane uwierzytelniające UTL_MAIL.SEND, aby ominąć ORA-29278

Zasadniczo musisz użyć „niższego poziomu” UTL_SMTP pakiet w celu wysłania różnych wiadomości SMTP wymaganych przez odległy serwer SMTP.

Uwierzytelnianie

Z bloga Stefano Ghio :

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

Głównym problemem jest to, że musisz mieć możliwość wysłania AUTH wiadomość przy użyciu "właściwego" schematu uwierzytelniania dla twojego serwera. Nie mogę powiedzieć o „smtp.live.com” konkretnie, ale w zależności od konfiguracji serwera, mogą to być różne schematy uwierzytelniania, takie jak PLAIN i LOGIN , DIGEST_MD5 , ... Zwykle (zawsze ?) parametry (username , password ) są zakodowane w base64.

Wysyłanie poczty

Ale zła wiadomość ponieważ używasz teraz biblioteki niskiego poziomu, musisz zaimplementować część kliencką Protokół SMTP się. Z tego samego źródła co powyżej (zredagowane przeze mnie, aby zachować tylko absolutnie minimum niezbędne rzeczy ):

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

Korzystanie z SSL/TLS

A teraz, bardzo złe wieści :niektóre serwery wymagały bezpiecznego połączenia . Twierdzenie czegoś takiego jak 530 Must issue a STARTTLS command first . Niestety, UTL_SMTP.STARTTLS jest obsługiwany tylko od wersji Oracle Database 11g 2 (11.2.0.2).

Jeśli masz szczęście używać najnowszej wersji Oracle, powinieneś napisać coś takiego, aby otworzyć bezpieczne połączenie z serwerem:

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

Cytując dokumentację Oracle:

Zapoznaj się z odpowiednią dokumentacją, aby dowiedzieć się, jak tworzyć i zarządzaj portfelem

Jeszcze kilka odczytów:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zagnieżdżone łączenie pętli w Oracle 11g

  2. SQL, aby znaleźć zduplikowane wpisy (w grupie)

  3. Różne daty Oracle 11g z TOAD

  4. sql (oracle), aby wybrać pierwsze 10 rekordów, potem następne 10 i tak dalej

  5. W SQL, co oznacza używanie nawiasów z OR?