Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Berikan kredensial ke UTL_MAIL.SEND untuk melewati ORA-29278

Pada dasarnya Anda harus menggunakan "tingkat bawah" UTL_SMTP paket untuk mengirim berbagai pesan SMTP yang diperlukan oleh server SMTP jauh.

Otentikasi

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

Masalah utama di sini adalah Anda harus dapat mengirim AUTH pesan menggunakan skema otentikasi "benar" untuk server Anda. Saya tidak bisa mengatakan untuk "smtp.live.com" secara khusus, tetapi tergantung pada konfigurasi server, skema autentikasinya mungkin berbeda, seperti PLAIN dan LOGIN , DIGEST_MD5 , ... Biasanya (selalu ?) parameter (username , password ) dikodekan base64.

Mengirim email

Tapi berita buruknya adalah, karena Anda sekarang menggunakan pustaka tingkat rendah, Anda harus mengimplementasikan bagian klien dari Protokol SMTP dirimu sendiri. Dari sumber yang sama seperti di atas (diedit sendiri untuk hanya menyimpan barang yang benar-benar minimum yang diperlukan ):

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

Menggunakan SSL/TLS

Dan sekarang, untuk berita yang sangat buruk :beberapa server memerlukan koneksi aman . Mengklaim sesuatu seperti 530 Must issue a STARTTLS command first . Sayangnya, UTL_SMTP.STARTTLS hanya didukung mulai dari Oracle Database 11g rilis 2 (11.2.0.2).

Jika Anda cukup beruntung untuk menggunakan Oracle versi terbaru, Anda harus menulis sesuatu seperti itu untuk membuka koneksi aman dengan server Anda:

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

Mengutip dokumentasi Oracle:

Silakan lihat dokumentasi terkait untuk melihat cara membuat dan kelola dompet

Beberapa bacaan lagi:



  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-01795:jumlah maksimum ekspresi dalam daftar adalah 1000 , cara membagi string

  2. Buat pemicu yang memperbarui kolom di satu tabel saat kolom di tabel lain diperbarui

  3. Daftar Semua Pemicu di Oracle Database

  4. Fungsi ROUND(tanggal) di Oracle

  5. ORA-00900:pernyataan SQL tidak valid- saat menjalankan prosedur di Oracle 10g