Ir para conteúdo
  • Cadastre-se

dev botao

Enviar evento da NFe por e-mail


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

Recommended Posts

Boa tarde, após migração para trunk2 não consegui localizar mais o envio de evento (cancelamento ou carta de correção) por e-mail, antes eu fazia assim: ACBrNFe1.EnviarEmailEvento(). Agora eu associei o componente ACBrEmail ao componente ACBrNFe e após configurar as informações de e-mail no componente ACBrEmail eu consigo enviar as NFe, porém não achei algo para enviar os eventos. Agora devo enviar os eventos em separado apenas pelo componente ACBrEmail?

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Fundadores

Use a força... leia os fontes.. Veja o Demo da ACBrNFe (em Lazarus)

  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);
    CC:=TstringList.Create;
    try
      CC.Add('[email protected]'); //especifique um email válido
      CC.Add('[email protected]');    //especifique um email válido

      ACBrMail1.Host := edtSmtpHost.Text;
      ACBrMail1.Port := edtSmtpPort.Text;
      ACBrMail1.Username := edtSmtpUser.Text;
      ACBrMail1.Password := edtSmtpPass.Text;
      ACBrMail1.From := edtSmtpUser.Text;
      ACBrMail1.SetSSL := cbEmailSSL.Checked; // SSL - Conexão Segura
      ACBrMail1.SetTLS := cbEmailSSL.Checked; // Auto TLS
      ACBrMail1.ReadingConfirmation := False; //Pede confirmação de leitura do email
      ACBrMail1.UseThread := False;           //Aguarda Envio do Email(não usa thread)
      ACBrMail1.FromName := 'Projeto ACBr - ACBrNFe';

      ACBrNFe1.NotasFiscais.Items[0].EnviarEmail( Para, edtEmailAssunto.Text,
                                               mmEmailMsg.Lines
                                               , True  // Enviar PDF junto
                                               , CC    // Lista com emails que serão enviado cópias - TStrings
                                               , nil); // Lista de anexos - TStrings
    finally
      CC.Free;
    end;

 

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Ola Daniel boa noite, obrigado pela dica ai, mas eu ja tinha visto isso, e o envio do email da NFe ja esta OK, é que eu usava tbem o envio dos eventos por email com essa função, " ACBrNFe1.EnviarEmailEvento" e agora na nova função que seria " ACBrNFe1.EnviarEmail" não me da a opção gerarPDF, blz.

Desde ja agradeço a atenção, bom fim de semana...

Luciano...

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Humm.. então talvez seja o caso de ajustar os fontes do Trunk2... (tem alguns métodos que ficaram comentados no final da Unit... para estudo posterior)

Gostaria de propor alguma alteração nos fontes ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não estou com tempo para analisar isso no momento... Digo, não está na minha agenda implementar isso... então se se desejar sugerir melhorias para os fontes, posso analisá-las...

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Membros Pro

Boa tarde, 

Alguém conseguiu fazer o envio do e-mail utilizando a thread?

Quando passo o usothread := True, ocorre erro no procedimento abaixo:

Function TMimeMess.AddPartHTMLBinary(const Stream: TStream; const FileName, Cid: string; const PartParent: TMimePart): TMimepart;
begin
  Result := AddPart(PartParent);
  Result.DecodedLines.LoadFromStream(Stream);
  Result.MimeTypeFromExt(FileName);
  Result.Description := 'Included file: ' + FileName;
  Result.Disposition := 'inline';
  Result.ContentID := Cid;
  Result.FileName := FileName;
  Result.EncodingCode := ME_BASE64;
  Result.EncodePart; <== O ERRO OCORRE AQUI
  Result.EncodePartHeader;
end;

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Daniel,

Após acompanhar depurar o código vi que quando tem o PDF junto, no procedimento abaiixo fica travado:

function TMimeMess.AddPartHTMLBinaryFromFile(const FileName, Cid: string; const PartParent: TMimePart): TMimepart;
var
  tmp: TMemoryStream;
begin
  tmp := TMemoryStream.Create;
  try
    tmp.LoadFromFile(FileName); <== AQUI SIMPLESMENTE TRAVA
    Result :=AddPartHTMLBinary(tmp, ExtractFileName(FileName), Cid, PartParent);
  finally
    tmp.Free;
  end;
end;

Se tento enviar somente o XML ocorre  o erro: raised exception class $C0000005 with message 'access violation at 0x00000000: read of address 0x00000000'. Nesse procedimento:

for vAttempts := 1 to fAttempts do
  begin
    if fSMTP.Login then <== AQUI
      Break;
    if vAttempts >= fAttempts then
      SmtpError('SMTP Error: Unable to Login.');
  end;

O fato é que deixando a opção de uso da thread como false funciona. (Antes de atualizar para o trunk2 funcionava certinho com o uso da thread).

 

 

 

 

Editado por Paulo Alexandre Hostert
Link para o comentário
Compartilhar em outros sites

  • Fundadores

As linhas que você indicou... não há nada de errado nelas...

Como reproduzir o problema, usando o Demo do ACBrMail ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Você cria o componente em Runtime ou usa ele no formulário ?

Crie um mini projeto, que cause o erro, e anexe no fórum (zip)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Sim, o ACBrMail é criado em tempo de execução.

Vou criar o projeto para tentar reproduzir o problema...

Daniel, acabei de identificar o problema.

Comentei a parte onde destruo o componente ACBrMail funcionou. (Durante a execução da thread deve fazer alguma referencia..)

Agora vou ter que avaliar para ajustar isso, já que também estou criando em runtime.

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • Fundadores

O que pode estar ocorrendo... É que você está destruindo o componente, com a Thread ainda em execução...

O componente é o dono da Thread

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Daniel,

Ainda sobre o uso da thread, quando ocorre algum erro no envio, como como algum erro nas informações de SMTP, a segunda vez que faço o envio do e-mail, no mesmo objeto acbrmail ocorre a seguinte mensagem:  Cannot terminate an externally created thread. 
 

Sabe o que é?

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Daniel,

Resolvi o problema fazendo alguns ajustes na unit acbrmail, na thread para tratamento do erro:

Podemos ajustar isso no padrão?

{ TACBrThread }

constructor TACBrThread.Create(AOwner: TComponent);
begin
  FreeOnTerminate := True;
  fOwner          := AOwner;

  inherited Create(False);
end;

procedure TACBrThread.DoHandleException;
begin
  Application.ShowException(FException);
end;

procedure TACBrThread.Execute;
begin
  try
    if (not terminated) then
      TACBrMail(FOwner).SendMail;
  except
    HandleException;
  end;
end;

procedure TACBrThread.HandleException;
begin
  FException := Exception(ExceptObject);
  try
    Synchronize(DoHandleException);
  finally
    FException := nil;
  end;
end;

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não é uma boa o ACBrMail depender de "Forms"... pois ele pode ser usado em projetos não visuais (modo console)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Fundadores

A Thread poderia chamar um "call-back" ou evento... poderíamos usar algum evento do ACBrMail, para passar o erro... nesse caso, caberia a aplicação programar o evento, e decidir o que fazer com o erro...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2807 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.

The popup will be closed in 10 segundos...