Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Dê credenciais para UTL_MAIL.SEND para ignorar ORA-29278


Basicamente você tem que usar o "nível inferior" UTL_SMTP pacote para enviar as várias mensagens SMTP exigidas pelo servidor SMTP distante.

Autenticação


Do blog de 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);  

O principal problema aqui é que você precisa enviar o AUTH mensagem usando o esquema de autenticação "certo" para seu servidor. Não posso dizer para "smtp.live.com" especificamente, mas dependendo da configuração do servidor, eles podem ser esquemas de autenticação diferentes, como PLAIN e LOGIN , DIGEST_MD5 , ... Normalmente (sempre?) os parâmetros (username , password ) são codificados em base64.

Enviando e-mail


Mas as más notícias é, como agora você está usando uma biblioteca de baixo nível, você precisa implementar a parte do cliente do Protocolo SMTP você mesma. Da mesma fonte acima (editado por mim mesmo para manter apenas o coisas absolutamente mínimas necessárias ):
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); 

Usando SSL/TLS


E agora, para as notícias muito ruins :algum servidor exigia uma conexão segura . Reivindicar algo como 530 Must issue a STARTTLS command first . Infelizmente, UTL_SMTP.STARTTLS é suportado apenas a partir do Oracle Database 11g versão 2 (11.2.0.2).

Se você tiver a sorte de usar uma versão recente do Oracle, deve escrever algo assim para abrir uma conexão segura com seu servidor:
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);

Para citar a documentação da Oracle:

Consulte a documentação correspondente para ver como criar e gerenciar carteira

Mais algumas leituras: