Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cung cấp thông tin đăng nhập cho UTL_MAIL.SEND để bỏ qua ORA-29278

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

Từ blog của 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);  

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ư PLAINLOGIN , 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi khi thực thi chú thích ODCIEXTTABLEOPEN

  2. Không thể tìm thấy trình điều khiển Oracle jdbc

  3. Cách khôi phục hoặc thay đổi mật khẩu Oracle sysdba

  4. Oracle 11g OFFSET FETCH báo lỗi

  5. Trở về từ Thế giới mở 2013