Ir para conteúdo
  • Cadastre-se

dev botao

Problema Envio Email Após Imprimir Nfc


  • Este tópico foi criado há 3522 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Quando executo o código abaixo (exemplo), não consigo enviar o email retorna o seguinte erro"smtp error :unable to login" se comento as três primeiras linhas e executo o email é enviado. Usei o componete acbrmail mas ocorre o mesmo problema com envio por TSMTPSend do Synapse.Vale notar que percebi que após a emissão da primeira nfc o aplicativo não consegue enviar mais nenhum email. 

 

 

//arquivo nfc

acbrnf1.NotasFiscais.LoadFromFile('D:\componentes_instalados\acbrnovo\Exemplos\ACBrNFe2\Delphi\51140712070962000104650010000000111000000110-nfe.xml');

 acbrnfdnfr1.FastFile := 'DANFeNFCe.fr3';
acbrnf1.NotasFiscais.Imprimir;
 
acbrml1.AddAddress('emailenvio');
acbrml1.Subject:='tetse';
try
acbrml1.Send();
except on E: Exception do
end;

segui debugando para descobrir  qual parte cria o problema e descobri que é na unit ACBrEAD na classe TACBrEAD essa classe é chamada pela função "notaUtil.GetURLQRCode" para gerar Hash code em sha1 o problema ocorro quando é o objeto da classe  TACBrEAD é destruido após gerar a url mais exatamente o problema ocorre ao invocar a função mostrada abaixo precisamente ao chamar o procedimento externo "EVP_cleanup();" Alguem deparou-se com o problema descrito e sabe como resolver o mesmo?

 

 

procedure TACBrEAD.FreeOpenSSL;

begin

  LiberarChave;

  {$IFDEF USE_libeay32}

     EVP_cleanup();

  {$ELSE}

EVPcleanup();

  {$ENDIF}

end;

 

 

Link para o comentário
Compartilhar em outros sites

Me deparei com o mesmo problema, ofereci a sugestão mas ninguém deu atenção. então o que fiz foi desenvolver um executavel somente para o envio, e assim solucionando o erro. passo como parametro pro executavel que gera tudo e envia...

Sistema de Automação Comercial para diversos segmentos
NF-e, NFC-e, SPED Fiscal - www.arenasoft.com.br

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Me deparei com o mesmo problema, ofereci a sugestão mas ninguém deu atenção. então o que fiz foi desenvolver um executavel somente para o envio, e assim solucionando o erro. passo como parametro pro executavel que gera tudo e envia...

 

Desculpe, mas porque você então não colocou isso no componente e submeteu no fórum para apreciação dos usuários e contribuiu com o projeto?

Só reclamar não adianta, o projeto é feito de ajuda, se todo mundo ajudar, a coisa anda, open-source é isso, eu tenho um problema resolvo, compartilho e a coisa cresce.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Eu não criei outro executável, criei outro formulário e coloquei os componentes do acbr nesse formulário...

crio o formulário qdo necessário e no final do processo libero ele...

O fato é que com OpensSSL, depois de gerar o QrCode, nada mais funciona... Se precisar fazer alguma coisa depois de gerar o qrcode, eu libero o formulário da memória, crio novamente, alimento os parâmetros do componente novamente e carrego o xml com loadfromfile. Sei que é uma gambiarra, mas foi a única forma de fazer funcionar..

Link para o comentário
Compartilhar em outros sites

Solivan você lembra o que você modificou ou não? Também tive a idéia de criar outro executável mas fica pouco elegante e fragmenta o sistema.

Esse conceito de que tudo deve ficar num unico executavel acho que não procede, peque um programa como corel draw e veja a quantidade de dll e exe que possui, eu acho que fica até bom pelo fato de você poder minimizar o enviador e continuar o que estiver fazendo sem ter que aguardar.

mas vou te passar o local onde dar o erro. O erro acontece ao gerar a Hash da url, exatamente depois que você libera da memória de alguma forma depois disso o erro começa a aparecer. o que eu fiz foi declarar o objeto como publico e na Inicialization crio e no Finalization libero da memória. ou seja crio quando a unit é criada e libero quando a mesma é liberada pelo sistema.

Editado por Solivan

Sistema de Automação Comercial para diversos segmentos
NF-e, NFC-e, SPED Fiscal - www.arenasoft.com.br

Link para o comentário
Compartilhar em outros sites

Descobri finalmente a origem do problema como descrito no primeiro tópico que o problema ocorria efetivamente quando depois de gerar a hash o componente chamava o procedimento   EVP_cleanup(); da biblioteca openssl. Olhando a documentação do openssl verifiquei que esse procedimento liberam os digests e ciphers ta tabela. Agora vou descrever a solução que encontrei.primeiramente declarei a unit libeay32 nos uses depois  antes de enviar o email realimentei a tabela com os digests e ciphers para fazer isso chameio os seguintes procedimentos do openssl OpenSSL_add_all_algorithms,  OpenSSL_add_all_ciphers, OpenSSL_add_all_digests,  ERR_load_crypto_strings. Demonstração abaixo no código.




//arquivo nfc
acbrnf1.NotasFiscais.LoadFromFile('D:\componentes_instalados\acbrnovo\Exemplos\ACBrNFe2\Delphi\51140712070962000104650010000000111000000110-nfe.xml');
 acbrnfdnfr1.FastFile := 'DANFeNFCe.fr3';
acbrnf1.NotasFiscais.Imprimir;
 
acbrml1.AddAddress('emailenvio');
acbrml1.Subject:='tetse';
 EVP_cleanup;//chamo para garantir que a tabela do openssl esta limpa
OpenSSL_add_all_algorithms;
  OpenSSL_add_all_ciphers;
  OpenSSL_add_all_digests;
  ERR_load_crypto_strings;


try
acbrml1.Send();
except on E: Exception do
end;

Ps. Essa solução não é a definitiva, pois o problema final esta no envio do email pelo Synapse mas não continuei pesquisando nesta biblioteca.

 

Ps2 Recomento uma solução tampão no código do componente ACBrMail como descrito abaixo

procedure TACBrMail.Send(UseThread: Boolean);
begin

 EVP_cleanup;//chamo para garantir que a tabela do openssl esta limpa
OpenSSL_add_all_algorithms;
OpenSSL_add_all_ciphers;
OpenSSL_add_all_digests;
ERR_load_crypto_strings;
if UseThread then begin if fThread <> nil Then fThread.Terminate; fThread := TACBrThread.Criar(Self); end else SendMail; end; 
 

 

 

 

Editado por Felipe Augusto Griebler
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3522 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.