Oracle
 sql >> Database >  >> RDS >> Oracle

Fornisci le credenziali a UTL_MAIL.SEND per bypassare ORA-29278

Fondamentalmente devi usare il "livello inferiore" UTL_SMTP pacchetto per inviare i vari messaggi SMTP richiesti dal server SMTP distante.

Autenticazione

Dal blog di 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);  

Il problema principale qui è che devi essere in grado di inviare il AUTH messaggio utilizzando lo schema di autenticazione "giusto" per il tuo server. Non posso dire per "smtp.live.com" in particolare, ma a seconda della configurazione del server, potrebbero essere schemi di autenticazione diversi, come PLAIN e LOGIN , DIGEST_MD5 , ... Di solito (sempre ?) i parametri (username , password ) sono codificati in base64.

Invio di posta

Ma le cattive notizie poiché ora stai utilizzando una libreria di basso livello, devi implementare la parte client di Protocollo SMTP te stesso. Dalla stessa fonte di cui sopra (modificato da me stesso per mantenere solo il materiale assolutamente minimo necessario ):

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

Utilizzo di SSL/TLS

E ora, per le bruttissime notizie :alcuni server richiedevano una connessione sicura . Rivendicare qualcosa come 530 Must issue a STARTTLS command first . Sfortunatamente, UTL_SMTP.STARTTLS è supportato solo a partire da Oracle Database 11g versione 2 (11.2.0.2).

Se sei abbastanza fortunato da utilizzare una versione recente di Oracle, dovresti scrivere qualcosa del genere per aprire una connessione sicura con il tuo server:

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

Per citare la documentazione di Oracle:

Consulta la documentazione corrispondente per vedere come creare e gestire il portafoglio

Ancora qualche lettura: