Jump to content

dev botao

Lentidão ao chamar a rotina para EnviarEmail


hugoeyng

Recommended Posts

  • Membros Pro

Olá, estou com uma dificuldade em um cliente onde o processo de envio do e-mail da NFe está levando um tempo muito fora do normal. No código fonte logo após a validação e retorno da nota eu realizo a chamada para o envio do e-mail:

                                            GravarLog('Chama enviar e-mail');
                                            NFe.NotasFiscais.Items[vloc_Contador].EnviarEmail(vloc_MailTo,
                                                                                aConfiguracao.Email.Assunto +
                                                                                ' Série: ' +
                                                                                IntToStr( NFe.NotasFiscais.Items[vloc_Contador].NFe.Ide.serie ) +
                                                                                ' Número: ' +
                                                                                IntToStr( NFe.NotasFiscais.Items[vloc_Contador].NFe.Ide.nNF ),
                                                                                mmEmailMsg.Lines,
                                                                                True,     // Enviar PDF junto
                                                                                aEmailCC, // Lista com emails que serão enviado cópias - TStrings
                                                                                nil);     // Lista de anexos - TStrings
                                            GravarLog('Depois da chamada e-mail');
                                            Sleep(300);
                                            GravarLog('Depois do sleep');

No log retorna o tempo antes e depois de entrar na rotina: 

02/09/2024 10:50:45 Chama enviar e-mail
02/09/2024 10:51:07 Enviando Email:
02/09/2024 10:51:07 Depois da chamada de e-mail
02/09/2024 10:51:07 Depois do sleep

Existe algum parâmetro ou timer que faça algum controle sobre esse comando? Li alguns tópicos antigos que tornava lento para anexar o arquivo, tem algum relato desse problema?

Fico no aguardo

Link to comment
Share on other sites

  • Membros Pro
11 minutos atrás, Daniel InfoCotidiano disse:

Boa tarde !
vc esta utilizando componentes ? eles estao atualizados?
No componente de email existe uma propriedade usarThread, habilite ela.

Boa tarde, os componentes estão atualizados e já estou com o usarThread habilitado

Link to comment
Share on other sites

  • Consultores

Boa tarde.

Por favor:

  • Consegue reduzir o escopo do problema?
    • Ele acontece somente neste cliente em específico?
    • Ele utiliza provedor de e-mail particular ou Gmail, HotMail e afins?
    • Somente uma nota está sendo enviada por vez?
    • Existem muitos destinatários, emails em cópia e cópia oculta?
    • Se você fizer um teste em seu ambiente também ocorre o problema?
  • Existe proxy configurado neste ambiente?
Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link to comment
Share on other sites

  • Membros Pro
1 hora atrás, Diego Foliene disse:

Boa tarde.

Por favor:

  • Consegue reduzir o escopo do problema?
    • Ele acontece somente neste cliente em específico?
    • Ele utiliza provedor de e-mail particular ou Gmail, HotMail e afins?
    • Somente uma nota está sendo enviada por vez?
    • Existem muitos destinatários, emails em cópia e cópia oculta?
    • Se você fizer um teste em seu ambiente também ocorre o problema?
  • Existe proxy configurado neste ambiente?

Boa tarde, a princípio estamos realizando alguns testes com algumas questões citadas.

- Em princípio somente nesse cliente
- Ele utilizado servidor particular
- Envia uma nota por vez, mas carregamos todos o lote no componente ACBRNFe
- São poucos destinatários
- Com a mesma configuração não conseguimos reproduzir o ambiente, porque nosso cliente utiliza Windows Server 2008, utilizando a porta 25 no smtp.

A questão do proxy reflete no envio do e-mail ou somente na comunicação com os webservices do ambiente da NFe? Caso refletir tentaremos adotar a configuração, mas a princípio ele envia o e-mail, mas tem uma demora após executar a função.

Conforme avançar nossos testes, publicaremos os resultados aqui no fórum

 

Link to comment
Share on other sites

  • Consultores
10 minutos atrás, hugoeyng disse:

- Com a mesma configuração não conseguimos reproduzir o ambiente, porque nosso cliente utiliza Windows Server 2008, utilizando a porta 25 no smtp.

Não deveria ter relação com velocidade, mas a porta 25 não é recomendada já faz um bom tempo. Verifique a possibilidade de uma conexão mais segura com o servidor de envio de email.

  • Like 2
Consultor SAC ACBr

Alexandre de Paula
Ajude o Projeto ACBr crescer - Assine o SAC                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

 

Link to comment
Share on other sites

  • Membros Pro

Bom dia, retornando sobre nossos testes. Eu modifiquei o fonte e monitorando(log) a rotina NotaFiscal.EnviarEmail da unit ACBrNFeNotasFiscais encontrei a seguinte situação: Alteração:
  if (EnviaPDF) then
    begin
      if Assigned(DANFE) then
        begin
          GravaLog('Salva PDF. Tempo: '+FormatDateTime('hh:nn:ss:zzz', Now - Inicio));
          DANFE.ImprimirDANFEPDF(FNFe);
          AnexosEmail.Add(DANFE.ArquivoPDF);
        end;
    end;
  GravaLog('EnviarEmail. Tempo: '+FormatDateTime('hh:nn:ss:zzz', Now - Inicio));

- Se no componente ACBRNFe.NotaFiscais somente com um item(NF) o tempo de processo é em media 1 a 2 segundos.
09:01:44:584 - Salva PDF. Tempo: 00:00:00:000
09:01:46:237 - EnviarEmail. Tempo: 00:00:01:653
 
- Se no componente ACBRNFe.NotaFiscais está com mais de um item(NF) o tempo de processo é em media de 8 a 10 segundos.
08:36:10:425 - Salva PDF. Tempo: 00:00:00:000
08:36:19:244 - EnviarEmail. Tempo: 00:00:08:819

O processo de envio é entre 1 ou 2 segundos após esse anexo, normal. Não consegui identificar o porque dessa situação. 

Link to comment
Share on other sites

  • Consultores

Bom dia.

2 hours ago, hugoeyng said:

- Se no componente ACBRNFe.NotaFiscais somente com um item(NF) o tempo de processo é em media 1 a 2 segundos.
09:01:44:584 - Salva PDF. Tempo: 00:00:00:000
09:01:46:237 - EnviarEmail. Tempo: 00:00:01:653
 
- Se no componente ACBRNFe.NotaFiscais está com mais de um item(NF) o tempo de processo é em media de 8 a 10 segundos.
08:36:10:425 - Salva PDF. Tempo: 00:00:00:000
08:36:19:244 - EnviarEmail. Tempo: 00:00:08:819

É gerado um PDF para cada NFe presente na lista, isso vai agregar no tempo total.

EDIT:

Perdão, o comportamento mencionado foi testando a rotina de impressão isoladamente.

Fiz novo teste com a rotina de e-mail e é gerado somente um arquivo.

  • Like 1
Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link to comment
Share on other sites

  • Membros Pro
51 minutos atrás, Diego Foliene disse:

Bom dia.

É gerado um PDF para cada NFe presente na lista, isso vai agregar no tempo total.

Mas no caso estou enviando o comando  NFe.NotasFiscais.Items[vloc_Contador].EnviarEmail por Item(NF). Porque geraria todos PDFs?

Link to comment
Share on other sites

  • Consultores
4 minutes ago, hugoeyng said:

Mas no caso estou enviando o comando  NFe.NotasFiscais.Items[vloc_Contador].EnviarEmail por Item(NF). Porque geraria todos PDFs?

Vou fazer um teste em meu ambiente para confirmar, um momento, por favor.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link to comment
Share on other sites

  • Consultores
2 hours ago, hugoeyng said:

Bom dia, retornando sobre nossos testes. Eu modifiquei o fonte e monitorando(log) a rotina NotaFiscal.EnviarEmail da unit ACBrNFeNotasFiscais encontrei a seguinte situação: Alteração:
  if (EnviaPDF) then
    begin
      if Assigned(DANFE) then
        begin
          GravaLog('Salva PDF. Tempo: '+FormatDateTime('hh:nn:ss:zzz', Now - Inicio));
          DANFE.ImprimirDANFEPDF(FNFe);
          AnexosEmail.Add(DANFE.ArquivoPDF);
        end;
    end;
  GravaLog('EnviarEmail. Tempo: '+FormatDateTime('hh:nn:ss:zzz', Now - Inicio));

- Se no componente ACBRNFe.NotaFiscais somente com um item(NF) o tempo de processo é em media 1 a 2 segundos.
09:01:44:584 - Salva PDF. Tempo: 00:00:00:000
09:01:46:237 - EnviarEmail. Tempo: 00:00:01:653
 
- Se no componente ACBRNFe.NotaFiscais está com mais de um item(NF) o tempo de processo é em media de 8 a 10 segundos.
08:36:10:425 - Salva PDF. Tempo: 00:00:00:000
08:36:19:244 - EnviarEmail. Tempo: 00:00:08:819

O processo de envio é entre 1 ou 2 segundos após esse anexo, normal. Não consegui identificar o porque dessa situação. 

Por favor, qual é o motor de relatórios que está utilizando o Fortes ou o Fast?

Pode disponibilizar o XML que está utilizando para testes? Se julgar que o mesmo tenha dados sensíveis e não possa ser disponibilizado direto aqui, envie para [email protected] com o link do tópico no corpo do e-mail para posterior identificação.

Apenas para contextualizar:

Modifiquei rotina do programa exemplo da NF-e deixando ela desta forma:

procedure TfrmACBrNFe.btnEnviarEmailClick(Sender: TObject);
var
  Para, Acabou: String;
  dtI, dtF: TDateTime;
  CC: Tstrings;
begin
  Para := '';
  if not(InputQuery('Enviar Email', 'Email de destino', Para)) then
    exit;

  ACBrNFe1.DANFE := ACBrNFeDANFeRL1;
  ACBrNFe1.NotasFiscais.Clear;
  while Acabou <> 'N' do
  begin
    OpenDialog1.Title := 'Selecione a NFe';
    OpenDialog1.DefaultExt := '*-nfe.XML';
    OpenDialog1.Filter := 'Arquivos NFe (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';

    OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Arquivos.PathSalvar;

    if OpenDialog1.Execute then
    begin
      //ACBrNFe1.NotasFiscais.Clear;
      ACBrNFe1.NotasFiscais.LoadFromFile(OpenDialog1.FileName);
    end;

    (InputQuery('Adicionar mais uma nota?', 'Continuar', Acabou));
  end;

  if ACBrNFe1.NotasFiscais.Count = 0 then exit;

  CC := TStringList.Create;
  try
    //CC.Add('[email protected]'); // especifique um email valido
    //CC.Add('[email protected]');    // especifique um email valido

    ConfigurarEmail;
    dtI := Now;
    ACBrNFe1.NotasFiscais.Items[0].EnviarEmail(Para
      , edtEmailAssunto.Text
      , mmEmailMsg.Lines
      , True  // Enviar PDF junto
      , CC    // Lista com emails que serao enviado copias - TStrings
      , nil // Lista de anexos - TStrings
      );
    dtF := Now;
    ShowMessage('DataI:' + FormatDateTime('hh:nn:ss:zzz', dtI) + sLineBreak + 'DataF:' + FormatDateTime('hh:nn:ss:zzz', dtF));

  finally
    CC.Free;
  end;

end;

Fazendo um teste carregando um XML com dados fictícios que continha um item o resultado foi:

Quote

[Window Title]
Acbrnfe_exemplo

[Content]
DataI:11:38:30:007
DataF:11:38:34:900

[OK]

Executando a rotina novamente, mas carregando agora 4 arquivos XML o resultado foi:

Quote

[Window Title]
Acbrnfe_exemplo

[Content]
DataI:11:40:36:879
DataF:11:40:41:117

[OK]

Veja que em ambos os casos a diferença foi mínima. Mesmo passando só um arquivo, levou 4 segundos.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link to comment
Share on other sites

  • Consultores

Em outro teste, modifiquei a rotina para carregar um mesmo XML de forma que o componente fica com 51 notas no count.

procedure TfrmACBrNFe.btnEnviarEmailClick(Sender: TObject);
var
  Para, Acabou: String;
  dtI, dtF: TDateTime;
  CC: Tstrings;
  i: Integer;
begin
  Para := '';
  if not(InputQuery('Enviar Email', 'Email de destino', Para)) then
    exit;

  ACBrNFe1.DANFE := ACBrNFeDANFeRL1;
  ACBrNFe1.NotasFiscais.Clear;

  OpenDialog1.Title := 'Selecione a NFe';
  OpenDialog1.DefaultExt := '*-nfe.XML';
  OpenDialog1.Filter := 'Arquivos NFe (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';

  OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Arquivos.PathSalvar;

  if OpenDialog1.Execute then
  begin
  for i:=0 to 50 do
  ACBrNFe1.NotasFiscais.LoadFromFile(OpenDialog1.FileName);
  end;

  if ACBrNFe1.NotasFiscais.Count = 0 then exit;

  CC := TStringList.Create;
  try
    //CC.Add('[email protected]'); // especifique um email valido
    //CC.Add('[email protected]');    // especifique um email valido

    ConfigurarEmail;
    dtI := Now;
    ACBrNFe1.NotasFiscais.Items[0].EnviarEmail(Para
      , edtEmailAssunto.Text
      , mmEmailMsg.Lines
      , True  // Enviar PDF junto
      , CC    // Lista com emails que serao enviado copias - TStrings
      , nil // Lista de anexos - TStrings
      );
    dtF := Now;
    ShowMessage('DataI:' + FormatDateTime('hh:nn:ss:zzz', dtI) + sLineBreak + 'DataF:' + FormatDateTime('hh:nn:ss:zzz', dtF));

  finally
    CC.Free;
  end;

end;

Novamente este foi meu resultado:

Quote

[Window Title]
Acbrnfe_exemplo

[Content]
DataI:11:50:53:571
DataF:11:50:58:571

[OK]

Todos mantendo um tempo entre 4 a 6 segundos.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link to comment
Share on other sites

  • Membros Pro
2 minutos atrás, Diego Foliene disse:

Em outro teste, modifiquei a rotina para carregar um mesmo XML de forma que o componente fica com 51 notas no count.

procedure TfrmACBrNFe.btnEnviarEmailClick(Sender: TObject);
var
  Para, Acabou: String;
  dtI, dtF: TDateTime;
  CC: Tstrings;
  i: Integer;
begin
  Para := '';
  if not(InputQuery('Enviar Email', 'Email de destino', Para)) then
    exit;

  ACBrNFe1.DANFE := ACBrNFeDANFeRL1;
  ACBrNFe1.NotasFiscais.Clear;

  OpenDialog1.Title := 'Selecione a NFe';
  OpenDialog1.DefaultExt := '*-nfe.XML';
  OpenDialog1.Filter := 'Arquivos NFe (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';

  OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Arquivos.PathSalvar;

  if OpenDialog1.Execute then
  begin
  for i:=0 to 50 do
  ACBrNFe1.NotasFiscais.LoadFromFile(OpenDialog1.FileName);
  end;

  if ACBrNFe1.NotasFiscais.Count = 0 then exit;

  CC := TStringList.Create;
  try
    //CC.Add('[email protected]'); // especifique um email valido
    //CC.Add('[email protected]');    // especifique um email valido

    ConfigurarEmail;
    dtI := Now;
    ACBrNFe1.NotasFiscais.Items[0].EnviarEmail(Para
      , edtEmailAssunto.Text
      , mmEmailMsg.Lines
      , True  // Enviar PDF junto
      , CC    // Lista com emails que serao enviado copias - TStrings
      , nil // Lista de anexos - TStrings
      );
    dtF := Now;
    ShowMessage('DataI:' + FormatDateTime('hh:nn:ss:zzz', dtI) + sLineBreak + 'DataF:' + FormatDateTime('hh:nn:ss:zzz', dtF));

  finally
    CC.Free;
  end;

end;

Novamente este foi meu resultado:

Todos mantendo um tempo entre 4 a 6 segundos.

Certo, nós utilizamos fastreport. Talvez seria interessante tentar executar esse seu teste no ambiente do nosso cliente, consegues encaminhá-lo para mim. Quais seriam as configurações dos componentes Email, ACBRNFe e NFEDANFEFR, no exemplo foi mantido o padrão?

Link to comment
Share on other sites

  • Consultores
12 minutes ago, hugoeyng said:

Certo, nós utilizamos fastreport. Talvez seria interessante tentar executar esse seu teste no ambiente do nosso cliente, consegues encaminhá-lo para mim. Quais seriam as configurações dos componentes Email, ACBRNFe e NFEDANFEFR, no exemplo foi mantido o padrão?

Sim, as configurações foram mantidas as mesmas, apenas a rotina foi modificada.

O SMTP utilizado foi o do GMail.

O XML utilizado foi gerado o próprio programa exemplo também(você pode utilizar o botão GerarNFe para criar ele).

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link to comment
Share on other sites

  • Moderadores
Em 06/09/2024 at 11:56, hugoeyng disse:

Certo, nós utilizamos fastreport. Talvez seria interessante tentar executar esse seu teste no ambiente do nosso cliente, consegues encaminhá-lo para mim. Quais seriam as configurações dos componentes Email, ACBRNFe e NFEDANFEFR, no exemplo foi mantido o padrão?

só pra ajudar a entender, qual versão do delphi e do fast report está usando?

  • Like 1
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Link to comment
Share on other sites

  • Consultores

Boa tarde, apenas para complementar nao encontrei acima.
Chegou a testar com o programa exemplo NFe q está em nosso repositório?
Outra pergunta.. ai na sua rede tem algum firewall ou servidor proxy? controle de usuarios na rede?

  • Like 1
Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Link to comment
Share on other sites

  • Membros Pro
1 hora atrás, Daniel InfoCotidiano disse:

Boa tarde, apenas para complementar nao encontrei acima.
Chegou a testar com o programa exemplo NFe q está em nosso repositório?
Outra pergunta.. ai na sua rede tem algum firewall ou servidor proxy? controle de usuarios na rede?

Boa tarde, eu efetuei as alterações sugeridas no programa exemplo e ele responde de maneira mais rápida. O que acho estranho é que minha implementação faz da mesma forma. A única diferença que não alimento o componente ACBRNFe com xml. Eu gero as informações, faço o processo de validar, assinar e transmitir e executo após o envio do e-mail e impressão. Tem um firewall/proxy mas que em tese não deveria influenciar porque no processo do envio propriamente dito o tempo é o mesmo do programa exemplo. Estamos adotando uma nova abordagem para criar vários lotes com somente uma NF até porque logo teremos de implementar o envio em forma síncrona. Logo que for possível testar, darei um feedback! 

  • Like 1
Link to comment
Share on other sites

×
×
  • 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.