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:
- documentação da Oracle sobre envio de e-mail de PL/SQL
também tem alguns bons exemplos que descrevem você para enviar corretamente sua mensagem de e-mail usando
UTL_SMTP
. - Consulte a página da Wikipedia sobre autenticação SMTP para uma transcrição de uma sessão SMTP típica.