terça-feira, 15 de janeiro de 2013

Genexus - Envio de Email com Anexo

Essa matéria se propõem a analisar o método de envio de email com anexo adicionado, seja através de um caminho fixo do servidor, ou então a partir de uma variável blob. Esta variável, poderá por exemplo, vir de um atributo blob presente em alguma transação.

Trata-se de uma continuidade as tantas postagens a respeito deste assunto nos blogs da comunidade Genexus. Antes de continuar, sugiro uma leitura do post Genexus Mail, do excelente blog Genexando.
Para realizar este exemplo de envio de email, utilizarei 3 objetos Genexus: uma transação contendo os parâmetros de conexão com o host; uma web panel contendo três variáveis; e uma procedure.

Criação da Transação de Parâmetros

Geralmente quando iniciamos um projeto a transação de parâmetros estará presente na especificação do analista. É nesta transação que os dados de configurações do sistema serão registrados, e dentre estes registros possuímos os dados de conexão com o host smtp, responsável pelo envio de email através da aplicação.

Logo, nossa transação terá a seguinte estrutura:

Genexus Transação
Criação da Web Panel

Esta Web Panel criada não é essencial para o nosso exemplo, é apenas para demonstrar que poderemos passar o conteúdo deste email como parâmetro através de variáveis presentes em tela.

Então, apenas como exemplificação disto, adicionei na Form deste objeto três variáveis, além de outra que irei utilizar nos Eventos:
  1. (form) Assunto: VarChar(120);
  2. (form) Anexo: Blob;
  3. (form) TextoHTML: LongVarChar(2M);
  4. (eventos) SourceAnexo: VarChar(400);
Dessa forma, o usuário poderá determinar o Assunto e o Conteúdo da mensagem de email, além de anexar um documento. Ao clicar sobre o botão, o seguinte evento de usuário será executado:
Event Enter
//=====Captura o endereço gerado do documento anexado=====
&SourceAnexo = &Anexo.ToString()

//=====Chama Procedure de Envio de Email=====
EnviaEmail.Call(&Assunto,&TextoHTML,&SourceAnexo)
EndEvent
Criação da Procedure de Envio de Email

Por fim, precisamos programar a procedure que realizará o envio do email. Como este objeto não irá realizar gravação no banco de dados, podemos configurar a sua propriedade commit on exit, como "no".

Nesta procedure iremos receber os seguintes parâmetros (Rules):
parm(in:&Assunto,in:&TextoHTML,in:&SourceAnexo);
Estas variáveis recebidas possuem o mesmo DataType determinado na Web Panel anteriormente especificada.

Agora só nos falta programar os eventos, estes serão:
//=====Captura Dados de Conexão da Transação Parametros=====
for each
defined by ParametroId
//=====Host SMTP exemplo: smtp.live.com(outlook.com);
        //smtp.gmail.com(gmail.com)=====
&SMTPSession.Host = ParametroServidorSMTP.Trim()

//=====Autenticação: 1 (requer usuário e senha)=====
&SMTPSession.Authentication = ParametroAuthentication

//=====Dados de Login: Usuário e Senha=====
&SMTPSession.UserName = ParametroUserName.Trim()
&SMTPSession.Password = ParametroPassword.Trim()

//=====Remetente: Email e Nome=====
&SMTPSession.Sender.Address = ParametroSenderAdress.Trim()
&SMTPSession.Sender.Name = ParametroSenderName.Trim()
endfor

//=====Efetua o Login=====
&SMTPSession.Login()

//=====Verifica se ocorreu algum erro=====
if &SMTPSession.ErrCode <> 0
msg(&SMTPSession.ErrDescription)
else
//=====Insere o texto da mensagem=====
&MailMessage.HTMLText = &TextoHTML

//=====Insere o assunto da mensagem=====
&MailMessage.Subject = &Assunto

//=====Adiciona 1º Destinatário de email=====
&MailRecipient.Address = 'cicrano@hotmail.com'
&MailRecipient.Name = 'Cicrano'
&MailMessage.To.Add(&MailRecipient)

//=====Adiciona 2º Destinatário de email=====
&MailRecipient.Address = 'beltrano@outlook.com'
&MailRecipient.Name = 'Beltrano'
&MailMessage.To.Add(&MailRecipient)

//=====Adiciona email como Copia=====
&MailRecipient.Address = 'fulano@gmail.com'
&MailRecipient.Name = 'Fulano'
&MailMessage.CC.Add(&MailRecipient)

//=====Adiciona email como Copia Oculta=====
&MailRecipient.Address = 'genexus@outlook.com'
&MailRecipient.Name = 'Genexus'
&MailMessage.BCC.Add(&MailRecipient)

//=====Adiciona Anexo a partir de um caminho do servidor=====
&MailMessage.Attachments.Add('C:\Temp\VendaDiaria_20121217.csv')

//=====Adiciona Anexo a partir de uma variável Blob=====
if not &SourceAnexo.IsEmpty()
&MailMessage.Attachments.Add(&SourceAnexo)
endif

//=====Envia Email=====
&SMTPSession.Send(&MailMessage)

//=====Verifica se ocorreu erro=====
if &SMTPSession.ErrCode <> 0
msg(&SMTPSession.ErrDescription)
else
msg('Email enviado com sucesso!')
endif
endif
Observações

Duas observações a respeito deste código, o nome das variáveis são iguais aos seus tipos de dados. Por padrão a porta utilizada para o envio de email é a 25, normalmente utilizada pelos servidores SMTP. Caso seja necessário alterar esta porta, será preciso incluir o seguinte código antes de realizar o Login:
&SMTPSession.Port = 465

Pessoal, qualquer dúvida, incremento ou correção enviem através dos comentários ou pelo email genexus@outlook.com. Abraço.

15 comentários:

  1. Bom dia. Como posso pedir uma confirmação do e-mail enviado? Marinei

    ResponderExcluir
    Respostas
    1. Caso a resposta de "&SMTPSession.ErrCode" seja "0" o email foi enviado com sucesso, ou você desejaria um aviso de recebimento semelhante ao configurado no outlook por exemplo?
      Abraços

      Excluir
  2. Na realidade preciso do aviso semelhante ao configurado no outlook. Marinei

    ResponderExcluir
    Respostas
    1. Desconheço uma função em genexus que realize isso. Você terá que programar em C#, para isto tome estes dois links como exemplo:

      Rotina de envio de email C# em Genexus:
      http://genexus-developers.blogspot.com.br/2013/03/configuracao-de-servidores-erro-no.html

      Adicionar confirmação de recebimento e leitura:
      http://eduardospaki.blogspot.com.br/2009/10/e-mail-com-c.html

      Abraços

      Excluir
  3. Obrigada, vou olhar. Marinei

    ResponderExcluir
  4. Amigo, estou com uma aplicação gerada na Ev1 U8 rodando em um servidor em minha casa.
    Pois bem, este servidor esta na web por meio do DynDns porque meu link é Net e sem IP fixo.
    Quando minha aplicação tenta enviar o e-mail, me é apresentado o seguinte erro:
    "Uma solicitação de envio ou recebimento de dados não foi permitida porque o soquete não está conectado e (durante o envio em um soquete de datagrama usando-se uma chamada sendto) não foi fornecido um endereço".

    Sabe me dizer como resolvo esta questão ?

    Abraço.

    ResponderExcluir
  5. Tenho um relatório que é gerado com o uso de um procedimento. Como faço para adicionar um destes relatórios em anexo no e-mail se ele é gerado em tempo de execução?

    ResponderExcluir
  6. Como anexar uma imagem no corpo do email, como por exemplo uma assinatura.

    ResponderExcluir
  7. Eu tenho uma KB Win C# migrada do GX 90 para GX X Ev 2 (mesmo gerador) simplesmente abrindo a KB, que num objeto TRN existe uma variavel tipo OutlookSession que ao tentar executar a TRN produz um erro
    java.lang.ClassNotFoundException: Não foi possível carregar arquivo ou assembly 'Interop.Outlook ...'
    java.lang.ClassNotFoundException: Não foi possível carregar arquivo ou assembly 'Interop.Outlook, Version=9.2.0.0, Culture=neutral, PublicKeyToken=74ebdef9af814246' ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado.
    em GeneXus.Mail.Internals.OutlookSession.()
    em GeneXus.Mail.GXOutlookSession.()
    em GeneXus.Programs.tgert02.initialize()
    Já registrei diversas dlls GXMail.dll, GXOffice2.dll e o erro persiste.
    Alguma dica?

    ResponderExcluir
  8. Estou com muita dificuldade em Gerar o Relatorio para Anexar no Email.

    Teria por gentileza como me dar uma ideia de como realizar isto?

    ResponderExcluir
  9. Pouca documentação na Internet, pouco uso da tecnologia.

    ResponderExcluir
  10. Bom dia a todos lendo esta mensagem

    Se você está passando por tempos difíceis ou pobreza
    Se você tem dívidas e precisa de ajuda urgente para pagá-las
    Se você precisa de dinheiro para começar um negócio ou para qualquer ocasião importante
    Então aconselho que você solicite o cartão master / ATM já instalado, com este cartão master / ATM você pode sacar até $ 5000 grátis todos os dias durante 6 meses, usei este cartão master / ATM e gostei muito e ser feliz. Ligue / envie uma mensagem de texto em +1 (985) 465-8370 para obter este cartão mestre / caixa eletrônico. Email immedaite thomasunlimitedhackers@gmail.com

    Agradecer

    ResponderExcluir
  11. Você precisa de um empréstimo legítimo, honesto, respeitável e urgente? Sua busca por um empréstimo legítimo termina aqui hoje, pois estamos aqui para satisfazer suas necessidades financeiras. Se você tiver sido recusado um empréstimo por bancos ou instituições financeiras por qualquer motivo, não se preocupe mais sobre seus problemas financeiros, pois somos a solução para seu infortúnio financeiro. Fornecemos bilhões (moedas diferentes) em empréstimos comerciais para mais de 32.000 proprietários de empresas. Usamos nossa própria tecnologia de risco designada para fornecer o empréstimo comercial certo para que você possa crescer seu negócio. oferecemos empréstimos de todos os tipos com uma baixa taxa de juros e também com duração para reembolsar o empréstimo. Você tem um crédito ruim? Você precisa de dinheiro para pagar as contas? ou você acha que é necessário começar um novo negócio? Você tem um projeto inacabado devido ao financiamento insuficiente? Você precisa de dinheiro para investir em alguma especialidade que irá beneficiá-lo? ISLAMIC REFINANCING LOAN COMPANY
    objetivo é fornecer excelentes serviços financeiros profissionais e_mail: [islamicrefinancing@gmail.com]
    Whatsapp; +15716666386

    ResponderExcluir