Jump to content

Delphi chamada_delphi.png acbr.png

C6 chamada_c6.png botao.png

Problema Envio Email Após Imprimir Nfc


  • Este tópico foi criado há 2844 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

  • Consultores

Boa tarde

tentou colocar em um datamodule o componente e não ficar construindo ele!

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other 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.

Edited by Solivan

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

Link to comment
Share on other 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; 
 

 

 

 

Edited by Felipe Augusto Griebler
Link to comment
Share on other sites

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.