Vejam abaixo:
&vrMailMessage.To.New( &NomeSacado, &EnderecoEmail )
&vrMailMessage.From.Address = 'XYZ@ABC.ORG.BR'
&vrMailMessage.From.Name = 'CLIENTE DE EMAIL'
&vrMailMessage.CC.New( 'NOME CLIENTE', 'email@cliente.com.br')
&vrMailMessage.Subject = 'Envio de E-mail de Boleto do Depto'
&vrMailMessage.HTMLText = &BoletoHtml
&vrSMTP.Timeout = 5000
&vrSMTP.Host = CON_PARAMETROS.PAR_HOST_EMAIL
&vrSMTP.Sender.Name = 'Depto'
&vrSMTP.Sender.Address = ' XYZ@ABC.ORG.BR’
&vrSMTP.Authentication = 1
&vrSMTP.UserName = CON_PARAMETROS.PAR_USER_EMAIL
&vrSMTP.Password = CON_PARAMETROS.PAR_USER_PASSWORD_EMAIL
Msg('Aguardando logon do servidor : SMTP.HOST.COM.BR , aguarde...Timeout(' + &vrSMTP.Timeout.ToString() + ')' , status)
&vrSMTP.Login()
If &vrSMTP.ErrCode = 0
&vrSMTP.Send(&vrMailMessage)
If &vrSMTP.ErrCode = 0
Msg('Email enviando para: ' + &EnderecoEmail + ' com sucesso!')
Else
Msg(&vrSMTP.ErrDescription)
Endif
Else
Msg(&vrSMTP.ErrDescription)
Endif
&vrSMTP.Logout()
Funcionava muito bem.. até a uns 15 dias atrás.. que o cliente (usuário) começou a NOS pressionar reclamando de travamento na máquina. Fiz o teste em OUTRAS máquinas OK, tudo funcionando muito bem até que descobrimos que num belo dia trocaram a máquina do cliente para um 64 BITS e não nos avisaram.
Adivinhem o que aconteceu ???
O envio de email começou a travar somente nesta máquina 64 bits.. apesar de estar com o WIN XP 32.. Desativamos o firewall, desativamos o anti-virus. Mas travar o que ??. devem estar curiosos ..
Durante o envio do e-mail via datatype SMTPsession.. é que estava travando , mesmo configurando o timeout na propriedade do SMTPSession?? pau do Timeout só a Artech e o suporte deverá me responder.
E ai .. o que responder ao cliente.. procura daqui , reza dali, consulta os universitários, GOOGLE do desespero, até que achamos algo parecido no WEB SAC da artech.
csharp try
csharp {
csharp string SMTPUserName = [!&NomeSacado!];
csharp string EMailTo = [!&EnderecoEmail!];
csharp string EMailSubject = "Envio de E-mail de Boleto do Depto ";
csharp string EMailMessage = [!&BoletoHtml!];
csharp string SMTPHost = "host.smtp.com.br";
csharp int SMTPPort = 25;
csharp string SMTPEmailPassword = "senha";
csharp System.Net.Mail.MailMessage mM = new System.Net.Mail.MailMessage();
csharp mM.From = new System.Net.Mail.MailAddress("email@envio.com.br");
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;
csharp System.Net.Mail.SmtpClient sC = new System.Net.Mail.SmtpClient(SMTPHost, SMTPPort);
csharp sC.EnableSsl = false;
csharp sC.Timeout = 5000;
csharp string strId;
csharp string strPassword;
csharp strId = "email@envio.com.br";
csharp strPassword = SMTPEmailPassword;
csharp sC.UseDefaultCredentials = false;
csharp sC.Credentials = new System.Net.NetworkCredential(strId, strPassword);
csharp sC.Send(mM);
csharp [!&statusEnvio!] = 1;
csharp }
csharp catch (System.Exception ex)
csharp {
csharp [!&statusEnvio!] = 0;
csharp [!&ErroDescricao!] = ex.Message;
csharp }
If &statusEnvio = 1
Msg('Mensagem enviada c/ sucesso pelo servidor smtp.host.com.br : (' + &statusEnvio.ToString() + ')')
Else
Msg('Mensagem não enviada p/ servidor smtp.host.com.br : (' + &statusEnvio.ToString() + ')')
Msg(&ErroDescricao.Trim())
Endif
Bingo . funcionou .. corretamente, dor de cabeça, c/os “;” no final das tags do csharp, entender o que cada instrução faz e como interage no GX.
Este problema/solução está reportado no SAC 28.830 , e será consertado somente no GX EVL UPGRADE 4.
Restou a nós uma conclusão ou exagero, PAU no Timeout(motivo do travamento) dos comandos(smtpSession) do GX ??? ou Pau nos comandos do GX 64 BITS ?? pois este problema não aconteceu nas outras máquinas (WIN XP 32 BITS, e WIN 2003) ???
Até quando vamos precisar apelar a linguagem(nativa) para resolvermos nosso problemas urgentíssimos ???
E os mesmos problemas recentes do GX 9.0 em 64 bits se repetirão no GX X EVL 1 ou EVL 2 ??? E na hora de utilizarmos linguagens mais recentes ??? Ruby apelaremos para quem ?? o Santo Darma Ruby ?? existe ?? no Japão ???
E oura coisa.. o código csharp gerado manualmente pelas tags CSHARP estão impossíveis de serem entendidos .. vejam abaixo:
/* User Code */
Boleto.CidadeSacado = AV54Cidade.Trim();
/* User Code */
Boleto.EstadoSacado = AV24Estado.Trim();
/* User Code */
Boleto.CepSacado = AV25CepSac.Trim();
AV6Hoje = DateTimeUtil.DToC( DateTimeUtil.Today( ), 4, "/") ;
/* User Code */
Boleto.DataDocumento = AV6Hoje;
AV7Vencime = DateTimeUtil.DToC( AV30Vencim, 4, "/") ;
/* User Code */
Boleto.DataVencimento = AV7Vencime.Trim();
/* User Code */
Boleto.NumeroDocumento = AV26Numero.Trim();
/* User Code */
Boleto.ValorDocumento = (double)AV27ValorD;
/* User Code */
Boleto.PercentualJurosDiaAtraso = (double)AV32Empres;
/* User Code */
Boleto.PercentualMultaAtraso = (double)AV33Empres;
/* User Code */
Boleto.PercentualDesconto = (double)AV34Empres;
/* User Code */
Boleto.DiasProtesto = AV35Empres;
/* User Code */
Boleto.PadroesBoleto.Demonstrativo = AV28Demons.Trim();
O código acima não ficaria mais fácil de entender se fosse conforme o código abaixo??( tudo bem que o código abaixo é em GX 9, talvez em GX X/EVL esteja melhor)
/* User Code */
Boleto.CidadeSacado = AV54Cidade.Trim();
Boleto.EstadoSacado = AV24Estado.Trim();
Boleto.CepSacado = AV25CepSac.Trim();
AV6Hoje = DateTimeUtil.DToC( DateTimeUtil.Today( ), 4, "/") ;
Boleto.DataDocumento = AV6Hoje;
AV7Vencime = DateTimeUtil.DToC( AV30Vencim, 4, "/") ;
Boleto.DataVencimento = AV7Vencime.Trim();
Boleto.NumeroDocumento = AV26Numero.Trim();
Boleto.ValorDocumento = (double)AV27ValorD;
Boleto.PercentualJurosDiaAtraso = (double)AV32Empres;
Boleto.PercentualMultaAtraso = (double)AV33Empres;
Boleto.PercentualDesconto = (double)AV34Empres;
Boleto.DiasProtesto = AV35Empres;
Boleto.PadroesBoleto.Demonstrativo = AV28Demons.Trim();
/* User Code */
Ou .. se o código abaixo
csharp string EMailSubject = "Envio de E-mail do Depto ";
csharp string EMailMessage = [!&BoletoHtml!];
csharp string SMTPHost = "host.de.envio";
csharp int SMTPPort = 25;
csharp string SMTPEmailPassword = "senha";
não poderia ser escrito assim e GX ?
CSHARP{
string EMailSubject = "Envio de E-mail do Depto ";
string EMailMessage = [!&BoletoHtml!];
string SMTPHost = "host.de.envio";
int SMTPPort = 25;
string SMTPEmailPassword = "senha";
Vai aqui nossa modesta experiência em geradores:
- Gerar código comentando linha a linha ajuda e muito a manutenção / debug por parte dos desenvolvedores;
- E o principal; a geração(sobreposição) de código nativo(feito pelo programador) sobre o código gerado pelo GX deveria ser respeitado e de responsabilidade do analista/desenvolvedor a qualquer momento e em qualquer situação.
Querem ver um exemplo clásico .. os códigos fontes gerados pelas principais classes do GX GXCommon, GXMail, GXDbi32, GXOffice, e pelo GXGeral .js deveriam estar de fácil acesso a equipe de desenvolvimento para que pudéssemos debugá-los e até alterá-los ao nosso gosto.
Claro , a Artech vai nos dizer que ai a responsabilidade de suporte dela terminaria até alterarmos o código fonte gerado, mas ai .. vamos responder .. aguardaríamos uma solução /debug até quando ?? a cada preview de 2 a dois meses ? até perdermos nosso contrato ??? por demora nesta solução por parte da Artech ???
Nós da área de TI, entendemos probleminhas, problemas e problemões..agora nossos clientes de diversas áreas não entendem e não gostam de esperar.
O post acima foi só para clarear a todos (nós, Artech , suporte e desenvolvedores) a que ponto chegamos na hora dos gargalos sérios.. e como podemos resolvê-los. O GX nos permite resolver vários problemas sérios de muitas maneiras.. (partir para a linguagem nativa é um deles.. ), mas o ideal é que não precisássemos disto.. mas se a pressão for grande não nos restará outro caminho.
Tunning de máquina, Tunning de banco de dados , Tunning de regras de negócios .. porque não Tunning de código gerado ???
Somos leigos a que nível a lógica gerada(pelo GX) pode variar .. mas somos objetivos no que precisa ser revolvido... contem conosco .. nossa ajuda .. , nossas orações.. só espero nos ajudarem na hora do prejuízo e na corda do pescoço por parte do cliente.
Boa sorte a Artech , ao EVL2 e aos geradores móveis.
Abraço
Ricardo
RCO Proc. De Dados
5 comentários:
Ola Ricardo,
Tivemos o mesmo problema com o sendmail e windows 7 64bits, e a solucao foi gerar a parte de envio com uma kb em windows xp32bits. Em nosso caso nem mesmo csharp resolveu. Apóio sua ideia sobre o csharp { ... }.
Ab, :)
Douglas
De fato o código aqui mostrado foi o que nos deu a solução também depois de testes em todas as plataformas de sistemas operacionais possiveis e versões diferentes de GX. Mas é importante salientar que uma grande quantidade de emails pode ainda travar no csharp portanto evitem enviar uma grande quantidade de emails de uma vez em suas aplicações
Vandré e Douglas.. bom saber disto(deste problema c/ vcs).
Agora o problema nosso foi apenas em emails unitários e esporádicos, não emails em lote.
Valeu e obrigado a todos.
Cara, esse código salvou minha vida !
Tava com problema de envio de email na locaweb. algum recurso de segurança deles tava bloqueando a dll do genexus e a porra do email não ia de jeito nenhum !
Contornei usando esse seu código e ficou perfeito !
Muito obrigado por compartilhar !
Abraço.
Olá Ricardo,
é bom ter uma solução alternativa em mãos, pois quando menos se espera o Gx nos deixa na mão, muitas vezes em algo que nem imaginamos que possa dar problema. Esse código c# é a mão na roda para esse problema, também passei por isso, mas a máquina não era 64 bits e quando ocorria o travamento de e-mail, toda aplicação travava.
Abraço
Postar um comentário