Ir para conteúdo
  • Cadastre-se

dev botao

ACbrMail - Solicitação de Melhorias


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

Recommended Posts

Desenvolvi uma aplicação utilizando Threads, para emissão de NFe e, me deparei com um problema ao envio de emails, se por algum motivo o sistema gerar um erro, ele exibe uma caixa de dialogo na tela. Então, criei uma propriedade dentro do ACBrMail para que o Desenvolvedor escolha a forma que deseja trabalhar, se o sistema exibe ou não a mensagem de erro(se escolher não, o sistema manterá a mensagem do Excetion em uma variável, permitindo o uso dela posteriormente). Segue o código para ser analisado e, se possível, acrescido aos fontes do Projeto ACBr.

ACBrMail.pas

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Moderadores
Em 18/12/2015 at 21:27, Paulo Augusto disse:

Bom andei fazendo testes aki e mesmo marcando a opcao UseThread = True, no componente, ao executar (debugando) notei que a propriedade UseThreadNow esta false, ou seja, nao esta respeitando a marcacao no componente..

Truck2

Atualizei hoje

 

alguma sugestão?

 

Sim tenta aplicar a correção que achar necessário e depois testar! se funcionar repassa aqui que havailiamos

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

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

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Para informar Bugs, por favor forneça um passo a passo de como reproduzi-lo nos Demos do ACBr

Notei que na sua sugestão de implementação, os métodos "GetMensagemErro" e "SetMensagemErro", estão órfãos...

 

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

Boa noite,

Oque eu quero e se houver algum e-mail invalido (não existir no provedor ) não dar a mensagem para continuar com os outros e-mail , e enviar normal para os restantes !!!

O código que eu comentei e funcionou foi este :

  // Sending MailTo //
  MailProcess(pmsSendTo);

  for i := 0 to fMIMEMess.Header.ToList.Count - 1 do
  begin
    for vAttempts := 1 to fAttempts do
    begin
      if fSMTP.MailTo(GetEmailAddr(fMIMEMess.Header.ToList.Strings))then
        Break;

      if vAttempts >= fAttempts then   /////////////////////////////////////////SE EU COMENTAR AQUI E ABAIXO NAO DA MSG E ENVIA O E-MAIL 
        SmtpError('SMTP Error: Unable to send MailTo.');
    end;
  end;

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não dá pra compreender o seu post... na verdade se você comentar o IF, tudo que fará é com que o Erro seja disparado na 1a tentativa...

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

Bom dia , Daniel

Vou tentar explicar melhor.

Estou enviando e-mails da NF-e , e para adicionar os e-mails dos destinatários adiciono assim : ACBrMail1.AddAddress(lbxEmail.Items, '');
Nesta lista eu tenho uma função para verificar se o e-mail é valido (se tem @ e etc ), mas nesta função não valida se o e-mail digitado existe de verdade por exemplo:
[email protected]  (vamos dizer que por falta de atenção digitou errado) , so que nesta lista existe 3 e-mails sendo 2 valido 1 errado inexistente.

Quando disparo envio vai dar esta msg : SmtpError('SMTP Error: Unable to send MailTo.');
Eu queria ver se tem como o componente ignorar este e-mail invalido e enviar para os outros o e-mail normal

Não sei se foi claro não minha explicação.

Obrigado, pela atenção.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Eu entendi o que quer dizer. Você entendeu que não podemos simplesmente comentar ou remover a linha?

Em caso positivo, por favor, anexe o arquivo alterado com a proposição dessa nova funcionalidade para que possa ser analisado.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Podemos modificar para "coletar" todos os erros, durante o Loop, e disparar o exception apenas após o Loop..

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

corrijam-me se estiver errado, contudo creio que todo o processo de validação a esse nivel (email correto, mas nao existe) é efetuado no servidor de email, sendo que se estamos a falar de email em lote (com mais de 1 destinatario) não tem como controlar qual dos emails é incorreto, contudo o email é enviado para os restantes que estiverem corretos.

Onde quero chegar é que se está a enviar emails em lote o erro que retorna serve para avisar que 1 ou mais email estao errados. se queres controlar a emissao a esse nivel granular basta criares o loop para cada email que envias e controlares o retorno de erros um a um. isso compete a aplicação e nao ao componente fazer.

 

Editado por 3Soft Sistemas
Link para o comentário
Compartilhar em outros sites

Boa tarde, muito bom expor sua opinião , mas não vejo a todo vapor desta forma .Na minha aplicação eu faço a tal validação .
Acredito que não tem sentido: exemplo envio de uma NF-e :
eu fazer um loop nos destinatários , se o componente pode enviar de uma única vez para todos .
E outro exemplo se estou criando uma mala direta com 1000 e-mail fazer este loop seria ... invalido na minha opinião claro.

So para efeito de conhecimento
neste link tem um classe , que acessa um WS para validar o e-mail no provedor :
http://www.activedelphi.com.br/forum/viewtopic.php?t=84162&sid=efbe3005507e0303c6b41b0cc508076b

Obrigado

Link para o comentário
Compartilhar em outros sites

seja qual for o sistema que uses para validar o email ele tem sempre de ser efetuado 1 a 1  dentro de um loop. Mais uma vez isso compete a politica de desenvolvimento da aplicação e não ao componente. o componente deve funcionar bem seja para enviar emails em lote ou individual, e isso ele faz.

pessoalmente não vejo vantagem em que o componente faça isso pois o tempo de processo para enviar 1000 email em lote é substancialmente menor que enviar 1 a 1, algo que nao vejo vantagem, mesmo que depois tenha maior controle no retorno de erros. Creio que compete á aplicação e, por acrescimo aos utilizadores da aplicação, validar os email que usam.

uma  opçao melhor para isso seria colocares um botao de validação do email nos cadastros onde ele possa existir, passando assim a responsabilidade dessa operação para o utilizador

Editado por 3Soft Sistemas
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Humm... penso que já temos a solução... use o evento: "OnMailException"... observe que se você informar "TrowIt := False", a exceção não será lançada...

procedure TForm1.ACBrMail1MailException(const AMail: TACBrMail;
  const E: Exception; var ThrowIt: Boolean);
begin
  ShowMessage(E.Message);
  ThrowIt := False;
  mLog.Lines.Add('*** Erro ao Enviar o email: '+ AMail.Subject);
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

Daniel, tanto deixando esta variável como false ou true a mensagem chega do mesmo jeito.
A propriedade do componente UseThread também setando ela direto designer ou execução ela sempre fica como false.

Então eu forcei a variável(fUseThread) para true no código , a mensagem não aparece, porem o e-mail não continua o seu envio para o destinatário que esta correto.
Obrigado

  try
    fGetLastSmtpError := pMsgError;
    MailProcess(pmsError);

   fUseThread:= true;

   if not fUseThread then
     DoException( Exception.Create(pMsgError) );
  finally
    Clear;
  end;

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Novamente Não compreendo o que você quer dizer... por favor crie um mini-projeto que descreva o problema que você deseja demonstrar...

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á 3012 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.