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:
- Dokumentasi Oracle tentang pengiriman email dari PL/SQL
memiliki beberapa contoh bagus yang juga menggambarkan Anda untuk mengirim pesan email dengan benar menggunakan
UTL_SMTP
. - Lihat laman Wikipedia Autentikasi SMTP untuk transkripsi sesi SMTP biasa.