Oracle
 sql >> база данни >  >> RDS >> Oracle

Дайте идентификационни данни на UTL_MAIL.SEND, за да заобиколите ORA-29278

По принцип трябва да използвате "по-ниското ниво" UTL_SMTP пакет, за да изпратите различните SMTP съобщения, изисквани от отдалечения SMTP сървър.

Удостоверяване

От блога на Стефано Гио :

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

Основният проблем тук е, че трябва да можете да изпратите AUTH съобщение, използвайки "правилната" схема за удостоверяване за вашия сървър. Не мога да кажа за "smtp.live.com" конкретно, но в зависимост от конфигурацията на сървъра, те може да са с различна схема за удостоверяване, като PLAIN и LOGIN , DIGEST_MD5 , ... Обикновено (винаги?) параметрите (username , password ) са кодирани base64.

Изпращане на имейл

Но лошите новини тъй като сега използвате библиотека от ниско ниво, трябва да внедрите клиентската част на SMTP протокол себе си. От същия източник като по-горе (редактиран от мен, за да запазя само абсолютно минимално необходимите неща ):

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

А сега, за много лошите новини :някои сървъри изискват сигурна връзка . Изискване на нещо като 530 Must issue a STARTTLS command first . За съжаление, UTL_SMTP.STARTTLS се поддържа само от Oracle Database 11g версия 2 (11.2.0.2).

Ако имате достатъчно късмет да използвате скорошна версия на Oracle, трябва да напишете нещо подобно, за да отворите защитена връзка с вашия сървър:

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

За да цитирам документацията на Oracle:

Моля, вижте съответната документация, за да видите как да създадете и управлявайте портфейла

Още малко четения:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. „ORA-00942:таблица или изглед не съществува“ само когато се изпълнява в съхранена процедура

  2. SQL груповата функция е вложена твърде дълбоко

  3. Oracle Query - Избиране на записи с помощта на данни от колона от първата таблица

  4. Концепция:Създайте Java програма и я заредете в Oracle DB - функцията Wrapper извиква java функция с връщане

  5. Какво представлява Oracle SQL и PL/SQL? Всичко, което един начинаещ трябва да знае