sábado, 2 de março de 2013

Configuração de Servidores - Erro no envio de emails

Configuração Servidor
Uma das dificuldades de se trabalhar com aplicações web, são as configurações dos servidores, seja de produção ou homologação.

Quando iniciamos com o Genexus, temos um desafio inicial, que é correta configuração do ambiente, tanto para compilar aplicações em Java quando em .Net. Após esta configuração inicial, do ambiente de desenvolvimento, temos um outro desafio: A configuração dos servidores de produção e homologação. 

Esta tarefa se torna árdua em virtude das "N" combinações possíveis de ambiente. Podemos trabalhar com SQL Server 2005 em um servidor Windows Server 2003, 32 bits, ou talvez com Postgresql em um sistemos operacional Windows Server 2008 64 bits. Além destas possíveis combinações, temos as diferentes versões  do Genexus. Tudo isso combinado, se torna um pesadelo para qualquer profissional da TI.

Bom pessoal, vou compartilhar um erro que enfrentei nesta última semana. Estou trabalhando em um projeto na versão do Genexus Upgrade 2, ao publicar o sistema em um ambiente Windows Server 2008 64 bits, enfrentei uma dificuldade nos envios de email pela aplicação.

Independente da configuração do firewall, ele podia inclusive estar desligado, e das portas configuradas através da programação da procedure, eu sempre recebia a mesma mensagem:

"An error occurs while communicating with the remote host."

Esta mensagem aparecia logo na hora de realizar o login junto ao host. Cheguei inclusive, a dar privilégios totais de segurança para o usuário IIS, isso, para verificar se era alguma configuração do servidor. Porém, mesmo assim, nada disso trouxe um efeito positivo.

Após algumas pesquisas e pesquisas, encontrei um post de um usuário, isso em 2010, onde este, afirma ter encontrado um bug ao realizar envios  de emails em um servidor Windows 7 64 bits, este usuário estava programando na versão Upgrads 2 do genexus, a mesma que a minha.

Segundo a artech, este bug foi corrigido na versão Upgrade 7, logo, as outras versões devem apresentar o mesmo problema.
E qual a solução proposta?

Encontrei no blog Genexando, uma rotina de envio de email em CSharp, a ser implementada no genexus. Esta programação contorna o problema, porém restringe a aplicação para um único gerador, caso deseja compliar em Java, deverá criar a mesma rotina em Java.

Vamos lá pra o código. Criei um objeto Procedure no Genexus, e em Source programe:
//=====Variáveis utilizadas - poderão ser recebidas como parâmetros=====

//=====Host de conexão - Varchar(40)=====
&SMTPHost = 'smtp.gmail.com.br'

//=====Usuário e senha de conexão -Varchar(40)=====
&SMTPUserName = 'Usuario'
&SMTPEmailPassword = 'senha'

//=====Enviar o email para... - Varchar(40)=====
&EMailTo = 'edu_ferroni@hotmail.com'

//=====Assunto - Varchar(40) e Mensagem - LongVarchar=====
&EMailSubject = 'Assunto'
&EMailMessage = 'Mensagem'

//=====Código nativo CSharp=====
csharp try
csharp {
csharp System.Net.Mail.MailMessage mM = new System.Net.Mail.MailMessage();

csharp mM.From = new System.Net.Mail.MailAddress([!&SMTPUserName!]);
csharp mM.To.Add([!&EMailTo!]);
csharp mM.Subject = [!&EMailSubject!];
csharp mM.Body = [!&EMailMessage!];
csharp mM.IsBodyHtml = true;
csharp mM.Priority = System.Net.Mail.MailPriority.High;

//=====Porta de conexão utilizada: 587=====
csharp System.Net.Mail.SmtpClient sC = new System.Net.Mail.SmtpClient([!&SMTPHost!], 587);
csharp string strId;
csharp string strPassword;
csharp strId = [!&SMTPUserName!];
csharp strPassword = [!&SMTPEmailPassword!];
csharp sC.Credentials = new System.Net.NetworkCredential(strId, strPassword);
csharp sC.Send(mM);

//=====Verifica status: 1 = envio com sucesso; 0 = erro ao enviar=====
csharp [!&statusEnvio!] = 1;
csharp }
csharp catch (System.Exception ex)
csharp {
csharp [!&statusEnvio!] = 0;
csharp }

Agradeço ao Genexando pelo código, me ajudou bastante, e espero que ajude a quem mais precisar.

Com o tempo irei postar mais sobre este assunto, configuração de ambientes. Irá inclusive, me ajudar a documentar os processos que venho passando.

Grande abraço.

3 comentários:

  1. Como faz um bom adicionar código para GeneXus c # ??

    ResponderExcluir
  2. não consegui aplicar esse fonte csharp como adiciona ele ao fonte genexus ?

    ResponderExcluir