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:
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:
- (form) Assunto: VarChar(120);
- (form) Anexo: Blob;
- (form) TextoHTML: LongVarChar(2M);
- (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
//=====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
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.
Bom dia. Como posso pedir uma confirmação do e-mail enviado? Marinei
ResponderExcluirCaso 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?
ExcluirAbraços
Na realidade preciso do aviso semelhante ao configurado no outlook. Marinei
ResponderExcluirDesconheço uma função em genexus que realize isso. Você terá que programar em C#, para isto tome estes dois links como exemplo:
ExcluirRotina 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
Obrigada, vou olhar. Marinei
ResponderExcluirAmigo, estou com uma aplicação gerada na Ev1 U8 rodando em um servidor em minha casa.
ResponderExcluirPois 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.
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?
ResponderExcluirComo anexar uma imagem no corpo do email, como por exemplo uma assinatura.
ResponderExcluirEu 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
ResponderExcluirjava.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?
To com esse mesmo erro, alguma soluçao ?
ExcluirEstou com muita dificuldade em Gerar o Relatorio para Anexar no Email.
ResponderExcluirTeria por gentileza como me dar uma ideia de como realizar isto?
Pouca documentação na Internet, pouco uso da tecnologia.
ResponderExcluirboa sorte. kkkkkk
ResponderExcluirBom dia a todos lendo esta mensagem
ResponderExcluirSe 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
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
ResponderExcluirobjetivo é fornecer excelentes serviços financeiros profissionais e_mail: [islamicrefinancing@gmail.com]
Whatsapp; +15716666386