Về cơ bản, bạn phải sử dụng "cấp thấp hơn" UTL_SMTP
gói để gửi các thông điệp SMTP khác nhau được yêu cầu bởi máy chủ SMTP ở xa.
Xác thực
-- 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);
Vấn đề chính ở đây là bạn cần có thể gửi AUTH
thông báo bằng cách sử dụng lược đồ xác thực "đúng" cho máy chủ của bạn. Tôi không thể nói cho "smtp.live.com" cụ thể, nhưng tùy thuộc vào cấu hình của máy chủ, chúng có thể là sơ đồ xác thực khác nhau, như PLAIN
và LOGIN
, DIGEST_MD5
, ... Thông thường (luôn luôn?) Các tham số (username
, password
) được mã hóa base64.
Gửi thư
Nhưng tin xấu là, vì bạn hiện đang sử dụng thư viện cấp thấp, bạn phải triển khai phần khách hàng của Giao thức SMTP chính bạn. Từ nguồn tương tự như trên (do chính tôi chỉnh sửa để chỉ giữ lại những thứ hoàn toàn tối thiểu cần thiết ):
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);
Sử dụng SSL / TLS
Và bây giờ, đối với tin rất xấu :một số máy chủ yêu cầu kết nối an toàn . Yêu cầu một cái gì đó như 530 Must issue a STARTTLS command first
. Rất tiếc, UTL_SMTP.STARTTLS
chỉ được hỗ trợ bắt đầu từ Oracle Database 11g phiên bản 2 (11.2.0.2).
Nếu bạn may mắn được sử dụng phiên bản Oracle gần đây, bạn nên viết một cái gì đó tương tự như vậy để mở một kết nối an toàn với máy chủ của bạn:
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);
Để trích dẫn tài liệu của Oracle:
Vui lòng xem tài liệu tương ứng để biết cách tạo và quản lý ví
Vài bài đọc thêm:
- Tài liệu của Oracle về cách gửi e-mail từ PL / SQL
có một số ví dụ hay mô tả bạn gửi đúng cách thư của mình bằng cách sử dụng
UTL_SMTP
. - Xem trang Wikipedia Xác thực SMTP để có bản sao của một phiên SMTP điển hình.