email via utl.smtp autenticado

Oracle

14/09/2005

estou fazendo o seguinte :


CREATE OR REPLACE PROCEDURE TESTE_ENVIA_EMAIL ( remetente varchar2 ,
destinatario varchar2 ,
assunto varchar2 ,
mensagem varchar2 ) as
c utl_smtp.connection;

username varchar2(256) := ´usuario´;
password varchar2(256) := ´senha´;

PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2) AS
BEGIN
utl_smtp.write_data(c, name || ´: ´ || header || utl_tcp.CRLF);
END;

BEGIN
c := utl_smtp.open_connection(´99.99.99.99´);--informo aqui o n ip
utl_smtp.helo(c, ´minhaempresa.com.br´); -- dominio

utl_smtp.command(c, ´AUTH LOGIN´);
utl_smtp.command(c, utl_encode.base64_encode (utl_raw.cast_to_raw(username)));
utl_smtp.command(c, utl_encode.base64_encode (utl_raw.cast_to_raw(password)));

utl_smtp.mail(c, remetente);
utl_smtp.rcpt(c, destinatario);
utl_smtp.open_data(c);
send_header(´From´ , remetente );
send_header(´To´ , destinatario );
send_header(´Subject´ , assunto );
utl_smtp.write_data(c, utl_tcp.CRLF || mensagem);
utl_smtp.close_data(c);
utl_smtp.quit(c);
EXCEPTION
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
utl_smtp.quit(c);
raise_application_error(-20000,
´A tentativa de enviar o e-mail gerou o seguinte erro: ´ || sqlerrm);
WHEN OTHERS THEN
RAISE;
END;
/






quando envio tomo o seguinte erro :


1 1 ORA-20000: A tentativa de enviar o e-mail gerou o seguinte erro: ORA-29279: SMTP permanent error: 535 Error: authentication failed
ORA-06512: at ´SAUDE.TESTE_ENVIA_EMAIL´, line 35
ORA-06512: at line 2

Alguém tem alguma luz ?

obs : O servidor requer autenticação

obs 2 : num exemplo original que peguei era

utl_smtp.command(c, demo_base64.encode(utl_raw.cast_to_raw(username)));
utl_smtp.command(c, demo_base64.encode(utl_raw.cast_to_raw(password)));

mas não vi esta function , em outra página vi a dica para mudar

grato


Motta

Motta

Curtidas 0

Respostas

Fernando Piccini

Fernando Piccini

14/09/2005

Ola Motta,

Bem! acho q tenho a solução pois fiz uma procedure igual :D
soh q funciona para versão 9i do Oracle no 8 na funciona!



mas antes gostaria de saber onde encontro a Packge ´utl_encode´? Pois preciso da function ´base64_encode´ que esta definida dentro deste pacote.

E se encotrar como faço para executar no meu oracle via SQL-plus, ou seja, q linha de comando devo executar?

desde ja agradeço


GOSTEI 0
Motta

Motta

14/09/2005

Fernando , uma function em que peguei de exemplo na web usava uma tal demo_base64 (uma página em japones) , não localizei em lugar nenhum isto , numa outra página achei que poderia trocar pela utl_encode (está na minha instalação, creio ser padrão do sys).

Vc tem a solução , tem uma sp que envie email autenticando smtp ?

Abraço

Motta


GOSTEI 0
Fernando Piccini

Fernando Piccini

14/09/2005

Ola Motta,

bem! cm vc me ajudou estou lhe retrebuindo :D
aki funcionou e acho q eh bem oq vc precisa!

resolve o problema da autenticação
obs: tb tive este problema ai fiz esta procedure e resolveu
ah! gostaria q se puder lista-se o link da onde vc achou a dica q sugeriu anteriormente, ou se achar mais alguma coisa, posta-se ai :D

vlw

CREATE OR REPLACE
PROCEDURE Enviar_Email(ds_mensagem_pvarchar2,
ds_email_origem_pvarchar2,
ds_email_destino_pvarchar2,
nm_usuario_pvarchar2) is

ds_email_origem_wvarchar2(40);
ds_smtp_wvarchar2(20);
ds_user_id_wvarchar2(50);
ds_senha_smtp_wvarchar2(50);

/* Abre conexão SMTP e HTTP */
CONEXAOUTL_SMTP.CONNECTION;

BEGIN

/* Abre conexão com um Servidor SMTP(Simple Mail Transfer Protocol), porta padrão SMTP é 25 */
CONEXAO:= utl_smtp.open_connection (ds_smtp_w,25);

UTL_SMTP.HELO (CONEXAO, ds_smtp_w);/* Endereço do servidor de SMTP*/
utl_smtp.command (CONEXAO, ´AUTH LOGIN´);
utl_smtp.command (CONEXAO, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw((ds_user_id_w)))));
utl_smtp.command (CONEXAO, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw((ds_senha_smtp_w)))));
UTL_SMTP.MAIL (CONEXAO, (´<´ || ds_email_origem_w || ´>´));/* E-mail de quem está mandando*/
UTL_SMTP.RCPT (CONEXAO, (´<´ || ds_email_destino_p || ´>´));/* Para quem vou mandar */
UTL_SMTP.DATA (CONEXAO, ds_mensagem_p);
UTL_SMTP.QUIT (CONEXAO);

Exception
WHEN OTHERS THEN
utl_smtp.quit (conexao);
raise_application_error(-20011,´Não foi possível enviar o e-mail devido ao seguinte erro: ´ || sqlerrm);
END Enviar_Email;
/


GOSTEI 0
Motta

Motta

14/09/2005

http://www.dbonline.cn/source/oracle/20031213before/SQL/How¬20to¬20Use¬20UTL_SMTP¬20Package¬20With¬20a¬20Mail¬20Server.htm

http://www.oracle.com/technology/sample_code/tech/pl_sql/htdocs/maildemo8i_sql.txt


GOSTEI 0
Motta

Motta

14/09/2005

Fernando, funcionou ok, mas como se coloca o Assunto (subject) desta forma ??


GOSTEI 0
Fernando Piccini

Fernando Piccini

14/09/2005

Ola,

Bem! parece engraçado, mas tb naum consegui colocar o assunto.
No meu teste, sempre vai sem assunto. Seria muito interessante que o mesmo aparece-se.

Se alguem suber poderia nos ajudar ai.

vlw pela colaboração


GOSTEI 0
Motta

Motta

14/09/2005

Já havia conseguido, esqueci de postar.

troque :

UTL_SMTP.DATA (CONEXAO, ds_mensagem_p);

por :


UTL_SMTP.OPEN_DATA(CONEXAO);
UTL_SMTP.WRITE_DATA(CONEXAO,´Subject´|| ´: ´ || ds_assunto || utl_tcp.CRLF);
UTL_SMTP.WRITE_DATA(CONEXAO, utl_tcp.CRLF || ds_mensagem_p);
UTL_SMTP.CLOSE_DATA(CONEXAO);



onde ds_assunto é o parametro do assunto tipo varchar2


valeu !


GOSTEI 0
Fernando Piccini

Fernando Piccini

14/09/2005

Ola motta :D

obrigado mais uma vez

grande abraço


GOSTEI 0
POSTAR