Enviar email pelo gmail.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

Pessoal bom dia!

Estou enfrentando o seguinte problema:
Mudamos o nosso servidor de email para o Gmail, e esse novo servidor requer autenticação para enviar os email.
Eu não tenho a minima idéia de fazer essas autenticação, antes, não era necessario porque o outro servidor não requeria autenticação.
Tentei usar o utl_smtp.command, mas, mesmo assim não foi.
alguém sabe como fazer essa autenticação no gmail?

o codigo que estou usando como base foi gentilmente cedido pelo Victor Hugo

Selecionar tudo

CREATE  OR  REPLACE  PROCEDURE  pr_envia_email_teste(  p_remetente    IN  VARCHAR2, -- usar formato "<e-mail>"  
                                                    p_destinatario  IN VARCHAR2, -- usar formato "<e-mail>"
                                                    p_assunto       IN VARCHAR2,
                                                    p_mensagem      IN VARCHAR2,
                                                    p_password      IN VARCHAR2 -- Senha para autenticacao no SMTP Server
                                                  )IS
 --Declarando variaveis                                                  
 v_mail_conn      utl_smtp.connection;
 v_mail_reply     utl_smtp.replies;
 crlf             varchar2(2) := chr(13)||chr(10);
 v_corpo_mensagem varchar2(2000);
 p_mailhost       varchar2(15):= 'smtp.gmail.com'; -- IP do SMTP Server
 p_dominio        varchar2(50):= 'evandro.saito@tanger.com.br'; -- Domínio na web
 p_username      varchar2(50):= 'evandro.saito@tanger.com.br'; -- Endereço de e-mail para autenticacao no SMTP Server


BEGIN
  --email
  v_corpo_mensagem := 'Date: ' ||    TO_CHAR(SYSDATE,'dd Mon yy hh24:mi:ss')||crlf||
                      'From: ' ||p_remetente||crlf||
                      'To: ' ||p_destinatario||crlf||
                      'Subject: ' ||p_assunto ||crlf||
                      p_mensagem;

  v_mail_conn := utl_smtp.open_connection(p_mailhost,25);
  --autenticação
  utl_smtp.helo(v_mail_conn, p_dominio);
  utl_smtp.command(v_mail_conn, 'AUTH LOGIN');
  utl_smtp.command(v_mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_username))));
  utl_smtp.command(v_mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_password))));
  --enviando
  utl_smtp.mail(v_mail_conn, p_remetente);
  utl_smtp.rcpt(v_mail_conn, p_destinatario);
  utl_smtp.DATA(v_mail_conn, v_corpo_mensagem);
  --saindo
  utl_smtp.quit(v_mail_conn);

 exception  when others then
   raise_application_error(-20002,'não foi possivel enviar o email!!!'||sqlerrm);
end;

usando essa procedure o seguinte erro é retornado
ORA-29278: erro transiente de SMTP: 421 Service not available

Desde já agradeço.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Qual a versão do Oracle?

Não sei se no Oracle 11G é possível, mas ate o 10G o Oracle não possui suporte a SSL (conexao segura), o servidor do gmail requer isso,
uma vez vi na internet um programa que faz uma gambiarra, ele faz um tunnel.
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

Olá Diego, a versão do oracle é 10G....tem como você me passar onde viu essa gambiarra?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

seguinte...


tenho uma aplicaçao java aqui e fiz uma rotina de envio de email porem não funcionava so que de acordo com o erro eu pude perceber que da minha maquina isso não era possivel dai fiz o deploy da aplicaçao no servidor e este por sua vez tinha permissao de envio de email dai funcionou

claro que você deve estar alterando isso direto no banco e este já enviava email porem ele (servidor) pode não ter permissao de acessar o smtp do gmail por exemplo e dai gera esse erro

da uma olhada aqui
http://mportes.blogspot.com/2005/07/env ... emplo.html
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

outra coisa

a porta não e 25 não



http://mail.google.com/support/bin/answ ... swer=13287
# Configure your client to match the settings below:
Incoming Mail (POP3) Server - requires SSL: pop.gmail.com
Use SSL: Yes
Port: 995
Outgoing Mail (SMTP) Server - requires TLS: smtp.gmail.com (use authentication)
Use Authentication: Yes
Use STARTTLS: Yes (some clients call this SSL)
Port: 465 or 587
Account Name: your full email address (including @gmail.com or @your_domain.com)
Email Address: your email address (username@gmail.com or username@your_domain.com)
Password: your Gmail password
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

cara não funciona devido ao SSL, não adianta..
tem que fazer um tunnel pra um lugar que tenha o recurso de SSL
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

evandro_shindi:

não encontro mais o link cara, eu postei esse link no profissionaloracle.com,
não cheguei a testar aquilo, outra solução é carregar a API java.mail no banco e usar java source para mandar.

espero ter ajudado
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

diegolenhardt

eu sou da filosofia:
Se não puder ajudar atrapalhe pois o importante e participar
Se eu não tivesse exposto o meu caso talvez você não sugerisse uma java store procedure como solução... eu entedi que a 10g não tem um recurso necessário mas resolvi postar minhas observaçoes mesmo assim..

evandro_shindi

se optar por java.. você pode fazer algo desse tipo

Selecionar tudo

	/**
	 * envia email com arquivo anexo
	 * @throws EmailException
	 */
	public void enviaEmailComAnexo() throws EmailException{
		
		// cria o anexo 1.
		EmailAttachment anexo1 = new EmailAttachment();
		anexo1.setPath("teste/teste.txt"); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)
		anexo1.setDisposition(EmailAttachment.ATTACHMENT);
		anexo1.setDescription("Exemplo de arquivo anexo");
		anexo1.setName("teste.txt");		
		
		// cria o anexo 2.
		EmailAttachment anexo2 = new EmailAttachment();
		anexo2.setPath("teste/teste2.jsp"); //caminho do arquivo (RAIZ_PROJETO/teste/teste2.jsp)
		anexo2.setDisposition(EmailAttachment.ATTACHMENT);
		anexo2.setDescription("Exemplo de arquivo anexo");
		anexo2.setName("teste2.jsp");		
		
		// configura o email
		MultiPartEmail email = new MultiPartEmail();
		email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
		email.addTo("teste@gmail.com", "Guilherme"); //destinatário
		email.setFrom("teste@gmail.com", "Eu"); // remetente
		email.setSubject("Teste -> Email com anexos"); // assunto do e-mail
		email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail
		email.setAuthentication("teste", "xxxxx");
		email.setSmtpPort(465);
		email.setSSL(true);
		email.setTLS(true);
		
		// adiciona arquivo(s) anexo(s)
		email.attach(anexo1);
		email.attach(anexo2);
		// envia o email
		email.send();
	}
e baixar a jar para carregar no banco
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

Victor,
eu useis as duas portas do smtp, já tentei conectar com o pop para dps enviar, e não vai....
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

diego,
o ideal para mim seria usar alguma alternativa do oracle mesmo, sem ter que usar o java, mas, se não tiver jeito....
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Eu quis deixar claro que não era problema, e sim não suportado, pois senão o cara ia ficar procurando achar o problema onde não tem problema, e isso seria chato não acha?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Aqui está a solução para este caso:

http://monkeyonoracle.blogspot.com/2009 ... h-ssl.html

Ele usa um aplicativo chamado STunnel que vai fazer a parte do SSL, como disse nunca usei, mas deve funcionar,

abraço
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

penso que não pois quem procura acaba achando...

With UTL_HTTP, you can write PL/SQL programs that communicate with Web (HTTP) servers. UTL_HTTP also contains a function that can be used in SQL queries. The package also supports HTTP over the Secured Socket Layer protocol (SSL), also known as HTTPS, directly or through an HTTP proxy. Other Internet-related data-access protocols (such as the File Transfer Protocol (FTP) or the Gopher protocol) are also supported using an HTTP proxy server that supports those protocols.


CONNECTION Type

Use this PL/SQL record type to represent the remote hosts and TCP/IP ports of a network connection that is kept persistent after an HTTP request is completed, according to the HTTP 1.1 protocol specification. The persistent network connection may be reused by a subsequent HTTP request to the same host and port. The subsequent HTTP request may be completed faster because the network connection latency is avoided. connection_table is a PL/SQL table of connection.

For a direct HTTP persistent connection to a Web server, the host and port fields contain the host name and TCP/IP port number of the Web server. The proxy_host and proxy_port fields are not set. For an HTTP persistent connection that was previously used to connect to a Web server using a proxy, the proxy_host and proxy_port fields contain the host name and TCP/IP port number of the proxy server. The host and port fields are not set, which indicates that the persistent connection, while connected to a proxy server, is not bound to any particular target Web server. An HTTP persistent connection to a proxy server can be used to access any target Web server that is using a proxy.

The ssl field indicates if Secured Socket Layer (SSL) is being used in an HTTP persistent connection. An HTTPS request is an HTTP request made over SSL. For an HTTPS (SSL) persistent connection connected using a proxy, the host and port fields contain the host name and TCP/IP port number of the target HTTPS Web server and the fields will always be set. An HTTPS persistent connection to an HTTPS Web server using a proxy server can only be reused to make another request to the same target Web server.
Syntax

TYPE connection IS RECORD (
host VARCHAR2(256),
port PLS_INTEGER,
proxy_host VARCHAR2(256),
proxy_port PLS_INTEGER,
ssl BOOLEAN
);
TYPE connection_table IS TABLE OF connection INDEX BY BINARY_INTEGER;
http://www.stanford.edu/dept/itss/docs/ ... u_http.htm
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

manda email com ele?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

tem ssl no 10g
so quis enfatizar que talvez o utl_smtp pode não suportar SSL mais o utl_http sim

8)
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

instalei o stunnel e esta funcionando como o autor dos post descreveu. Porem ainda sim não consigo enviar emails.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

think java
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

então java é minha unica solução...ou trocamos o servidor...rs
bom eu estava me esquivando de usar java porque eu simplesmente não sei absolutamente nada sobre ele(java). Existe algum tutorial ou algo que possa usar para aprender de forma rapida, para solucionar esse meu problema?
Dicas também será muito bem vindas.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

eu montei a classe
CommonsMail

Selecionar tudo

create or replace and compile java source named commonsmail as
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.commons.mail.SimpleEmail;

public class CommonsMail {

    public CommonsMail() throws EmailException, MalformedURLException {
        enviaEmailSimples();
        enviaEmailComAnexo();
        enviaEmailFormatoHtml();
    }

    /**
     * envia email simples(somente texto)
     * @throws EmailException
     */
    public void enviaEmailSimples() throws EmailException {

        SimpleEmail email = new SimpleEmail();
        email.setHostName("smtp.gmail.com"); //o servidor SMTP para envio do e-mail
        email.addTo("evandro.saito@tanger.com.br", "Evandro"); //destinatário
        email.setFrom("evandro.saito@tanger.com.br", "Evandro"); // remetente
        email.setSubject("Teste -> Email simples"); // assunto do e-mail
        email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail
        email.setAuthentication("teste", "xxxxx");
        email.setSmtpPort(465);
        email.setSSL(true);
        email.setTLS(true);
        email.send();
    }


    /**
     * envia email com arquivo anexo
     * @throws EmailException
     */
   /* public void enviaEmailComAnexo() throws EmailException{

        // cria o anexo 1.
        EmailAttachment anexo1 = new EmailAttachment();
        anexo1.setPath("teste/teste.txt"); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)
        anexo1.setDisposition(EmailAttachment.ATTACHMENT);
        anexo1.setDescription("Exemplo de arquivo anexo");
        anexo1.setName("teste.txt");

        // cria o anexo 2.
        EmailAttachment anexo2 = new EmailAttachment();
        anexo2.setPath("teste/teste2.jsp"); //caminho do arquivo (RAIZ_PROJETO/teste/teste2.jsp)
        anexo2.setDisposition(EmailAttachment.ATTACHMENT);
        anexo2.setDescription("Exemplo de arquivo anexo");
        anexo2.setName("teste2.jsp");

        // configura o email
        MultiPartEmail email = new MultiPartEmail();
        email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
        email.addTo("teste@gmail.com", "Guilherme"); //destinatário
        email.setFrom("teste@gmail.com", "Eu"); // remetente
        email.setSubject("Teste -> Email com anexos"); //assunto do e-mail
        email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail
        email.setAuthentication("teste", "xxxxx");
        email.setSmtpPort(465);
        email.setSSL(true);
        email.setTLS(true);

        // adiciona arquivo(s) anexo(s)
        email.attach(anexo1);
        email.attach(anexo2);
        // envia o email
        email.send();
    }*/


    /**
     * Envia email no formato HTML
     * @throws EmailException
     * @throws MalformedURLException
     */
  /*  public void enviaEmailFormatoHtml() throws EmailException, MalformedURLException {

        HtmlEmail email = new HtmlEmail();

        -- adiciona uma imagem ao corpo da mensagem e retorna seu id
--        URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
--        String cid = email.embed(url, "Apache logo");

        -- configura a mensagem para o formato HTML
        email.setHtmlMsg("<html>Logo do Apache - <img ></html>");

        // configure uma mensagem alternativa caso o servidor não suporte HTML
        email.setTextMsg("Seu servidor de e-mail não suporta mensagem HTML");

        email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
        email.addTo("teste@gmail.com", "Guilherme"); //destinatário
        email.setFrom("teste@gmail.com", "Eu"); // remetente
        email.setSubject("Teste -> Html Email"); // assunto do e-mail
        email.setMsg("Teste de Email HTML utilizando commons-email"); //conteudo do e-mail
        email.setAuthentication("teste", "xxxxx");
        email.setSmtpPort(465);
        email.setSSL(true);
        email.setTLS(true);
        // envia email
        email.send();
    }   */


    /**
     * @param args
     * @throws EmailException
     * @throws MalformedURLException
     */
    public static void main(String[] args) throws EmailException, MalformedURLException {
        new CommonsMail();
    }

}

SO que ela da uma erro, e eu não sei onde é... estou executando via pl/sql developer, e so aparece a seguinte msg "Compiled with errors" e não mostra mais nada...onde sera que esta meu erro?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

victorhugomuniz escreveu:
se optar por java.. você pode fazer algo desse tipo

Selecionar tudo

	/**
	 * envia email com arquivo anexo
	 * @throws EmailException
	 */
	public void enviaEmailComAnexo() throws EmailException{
		
		// cria o anexo 1.
		EmailAttachment anexo1 = new EmailAttachment();
		anexo1.setPath("teste/teste.txt"); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)
		anexo1.setDisposition(EmailAttachment.ATTACHMENT);
		anexo1.setDescription("Exemplo de arquivo anexo");
		anexo1.setName("teste.txt");		
		
		// cria o anexo 2.
		EmailAttachment anexo2 = new EmailAttachment();
		anexo2.setPath("teste/teste2.jsp"); //caminho do arquivo (RAIZ_PROJETO/teste/teste2.jsp)
		anexo2.setDisposition(EmailAttachment.ATTACHMENT);
		anexo2.setDescription("Exemplo de arquivo anexo");
		anexo2.setName("teste2.jsp");		
		
		// configura o email
		MultiPartEmail email = new MultiPartEmail();
		email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
		email.addTo("teste@gmail.com", "Guilherme"); //destinatário
		email.setFrom("teste@gmail.com", "Eu"); // remetente
		email.setSubject("Teste -> Email com anexos"); // assunto do e-mail
		email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail
		email.setAuthentication("teste", "xxxxx");
		email.setSmtpPort(465);
		email.setSSL(true);
		email.setTLS(true);
		
		// adiciona arquivo(s) anexo(s)
		email.attach(anexo1);
		email.attach(anexo2);
		// envia o email
		email.send();
	}
e baixar a jar para carregar no banco
deve estar faltando o jar
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Apos rodar ela, de o comando show errors,
acho que vai mostrar o que está errado.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

outra coisa

commonsmail

CommonsMail

o nome do objeto do banco tem que ser igual ao nome da classe e acho q o nome do objeto tem que vir entre aspas

da uma olhada aqui
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

como eu importo o jar para dentro do banco?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

loadjava
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

ok, usei o loadjava da seguinte maneira
loadjava -user usuario/senha@banco c:\java\SimpleEmail.java

e deu o seguinte erro.

Selecionar tudo

Erro enquanto abria o arquivo
rror while opening file: c:javacommons-email-1.2-srcsrcjavaorgapachecommonsmailSimpleEmail.java
    Exception java.io.FileNotFoundException: c:javacommons-email-1.2-srcsrcjavaorgapachecommonsmailSimpleEmail.java (No such file or directory)
The following operations failed
     c:javacommons-email-1.2-srcsrcjavaorgapachecommonsmailSimpleEmail.java: opening file
exiting  : Failures occurred during processing
evandro_shindi
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 28 Out 2009 8:50 am
Localização: Lins-Sp
Evandro Saito

Pessoal resolvi o problema, porem sem usar a autenticação.
Criamos um servidor de email, e uma conta generica tipo adm@empresa.com.br, e com isso usamos as procedures normais de enviar email.

vlw, abraços
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Também era possível fazer um servidor de e-mail no linux com SMTP Relay,
ou seja, você colocaria root@servidor e ao chegar a mensagem nesse endereco ele faria por tras o relay para enviar com a conta do gmail,

=]

já fiz isso e funciona,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes