Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Delphi


Guest --devil69 --

Pergunta

Guest --devil69 --

Ola a todos!!

Eu tanho a seguinte duvida eu criei um programa em delphi utilizando o componente indy e um timer para enviar email..

O meu problema é quando ele não acha uma ligação a net ele fica dando erro...

Tem maneira de ocultar esse erro??

Se alguém me puder ajudar agradeco!!!

Obrigado.

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

Eu faria uma verificação de conexão com a internet antes de enviar, você poderia fazer dessa maneira:

Coloca um componente da Paleta Indy Clients IdIcmpClient, coloca o nome dele de pingador, coloca um Button e um Edit, então cria a seguinte function na seção Private

function VerificaConexao(IP: String): boolean;
Então logo abaixo completa ela assim
function TForm1.VerificaConexao(IP: String): boolean;
begin
  with Pingador do begin
    Host := IP;
    ReceiveTimeout := 500;
    Ping;
    if ReplyStatus.BytesReceived > 0 then
      result := true
    else
      result := false;
  end;
end;
Aí no OnClick do Button põe assim
procedure TForm1.Button1Click(Sender: TObject);
begin
  if VerificaConexao(Edit1.Text) then
    ShowMessage('Você está conectado')
  else
    ShowMessage('Não há conexão com a internet');
end;

Aí no text do Edit você coloca www.google.com.br que é um site que nunca sai do ar.

Aí você incrementa ele de uma maneira que se adapte ao seu projeto

valeu..

Editado por João Paulo Taraciuk
Incluída tag's CODE para melhorar a visualização, bem como identado o código. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

  • 0
Eu faria uma verificação de conexão com a internet antes de enviar, você poderia fazer dessa maneira:

Coloca um componente da Paleta Indy Clients IdIcmpClient, coloca o nome dele de pingador, coloca um Button e um Edit, então cria a seguinte function na seção Private

function VerificaConexao(IP: String): boolean;
Então logo abaixo completa ela assim
function TForm1.VerificaConexao(IP: String): boolean;
begin
  with Pingador do begin
    Host := IP;
    ReceiveTimeout := 500;
    Ping;
    if ReplyStatus.BytesReceived > 0 then
      result := true
    else
      result := false;
  end;
end;
Aí no OnClick do Button põe assim
procedure TForm1.Button1Click(Sender: TObject);
begin
  if EstaVivo(Edit1.Text) then
    ShowMessage('Você está conectado')
  else
    ShowMessage('Não há conexão com a internet');
end;

Aí no text do Edit você coloca www.google.com.br que é um site que nunca sai do ar.

Aí você incrementa ele de uma maneira que se adapte ao seu projeto

valeu..

Amigo eu fis tudo como voçe disse mas continua dando o erro (Socket error #11004 ) porque não acha ligaçao á internet..

Mas como eu faço para não aparecer este erro,mesmo com a internet desligada..quando volta-se a ligar ele fazia o seu trabalho normal....

Link para o comentário
Compartilhar em outros sites

  • 0

devil69, fora este nick "demoníaco", utilizar um timer para enviar e-mails periódicos e sem que uma mensagem de erro seja apresentada ao usuário.... meio suspeita esta aplicação <_< (esteja atento ao item 3.2 das regras do forum)

de qualquer modo, tente tratar a abertura da conexão utilizando um try...except...end, como:

procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    IdFTP1.Connect(True, -1);
    ShowMessage('Conexão ok');
  except
    ShowMessage('Conexão falhou');
  end;
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus ta dando erro (IdFTP1:Connect(True, -1);)...

Tem alguma ideia porque que da erro??

Obs:Embora pareca estranho não é nenhuma aplicaçao maliciosa!

devil69, foi só um exemplo, ou seja, a idéia principal é a de que você "cerque" a abertura da conexão com o host (servidor) como exemplificado. Eu nem sei se era este componente da paleta que você estava utilizando...

Se você colocar a parte do código onde você conecta com o servidor fica mais fácil alguém exemplificar. Convém também que você informe sempre o erro. Este não "tá dando erro" sugere que não seja o mesmo que você tinha antes, então, fica muito vago.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus eu to uzando os conponentes TidSmtp e o TidMessage na minha aplicação para o envio de email mais um timer como já tinha referido no poste acima mencionado!!!

Funciona tudo direitinho quando á ligação á internet, mas quando não á fica dando o erro (Socket error #11004) porque não existe ligaçao.

Eu quero saber se á alguma forma de esse erro não apareçer(Socket error #11004)!?

Desde já agradeço a ajuda!!!

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Então. O que quiz sugerir é que você tente tratar o erro na tentativa de conexão com o servidor.

Em algum lugar do programa você tem um IdSMTP1.Connect, então o exemplo ficaria assim:

procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    IdSMTP1.Connect; // tenta estabelecer a conexão
    ...
   // segue com seu código aqui, quando a conexão for estabelecida
  except
    // aqui fica sem comando algum, já que você não quer que algo ocorra nesta condição
  end;
end;

Catpou?!

Testa aí e vê como fica. É importante lembrar, que mesmo fazendo o tratamento das exceções, enquanto você está no ambiente de desenvolvimento (ou seja, executando via IDE do Delphi) e com a opção Integratting debuging habilitada no Delphi (o que é o ideal para desenvolvimento), ao ocorrer um erro, o programa será interrompido e desviado para o código do mesmo na IDE do Delphi e daí ao teclar F9 o mesmo continua. Então, se isto ocorrer, você pode então testar o programa, já compilado, por fora do delphi (o seu executável final) para tirar a dúvida.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus segui o seu exemplo mas agora em ves de o erro (Socket error #11004) fica dando o seguinte

(connection closed gracefully)..

O que devo fazer agora??

seria mais conveniente se você pudesse colocar a parte do código (procedure) onde você está fazendo este tratamento, assim ficaria mais fácil de verificar o que você está fazendo e dar alguma sugestão.

Link para o comentário
Compartilhar em outros sites

  • 0

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  idmessage.From.Address:=xxxx
  idmessage.Recipients.EMailAddresses:=xxxx
  idsmtp.AuthenticationType:=atlogin;
  idsmtp.UserName:=xxxx
  idsmtp.Password:=xxxx
  idsmtp.Host:=xxxxx
  idsmtp.Port:=xx
  try
    idsmtp1.connect;
  except
  end;
end;
end.

tá aqui micheus!!!

Fico muito grato!!

Editado por Micheus
Incluída tag's CODE para melhorar a visualização, bem como identado o código. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

  • 0

devil69 você tem dois componentes idsmtp ou foi apenas erro de digitação (tem um idsmtp e idsmtp1 no seu exemplo)

Eu fiz o teste com um form de email que eu tenho e ocorre o erro #11004, mas da forma como disse antes - apenas no ambiente de programação (executando por fora não aparece nada).

Então adaptei e coloquei um ShowMessage, para conferir, e daí ao executar por fora apresenta a mensagem de problema com a conexão. Logo, a abordagem deveria funcionar. Veja como está meu código (eu trato mais informações, inclusive):

procedure TFrmEMail.BitBtn3Click(Sender: TObject);
begin
 //Configuração do IdMessage (dados da mensagem)
  IdMessage1.From.Address := edMailUserName.Text; //e-mail do remetente
  IdMessage1.Recipients.EMailAddresses := mmMailTo.Text; //e-mail do destinatário
  IdMessage1.Subject := edMailAssunto.Text;
  IdMessage1.Body.Assign(RichEdit1.Lines);

 //Configuração do IdSMTP (dados do protocolo)
  IdSMTP1.Host := RecAPOUS.SMTP_Server;
  IdSMTP1.Port := StrToIntDef(RecAPOUS.SMTP_Port, 25);
  IdSMTP1.Username := RecAPOUS.SMTP_User_Name;
  IdSMTP1.Password := medMailUserPassword.Text;
  try
    IdSMTP1.Connect; //Estabelece a conexão
    try
      IdSMTP1.Authenticate; //Faz a autenticação
      try
        IdSMTP1.Send(IdMessage1);
      except
        on E:Exception do
          E.Message := 'Houve um erro ao tentando enviar a mensagem:'#10 +E.Message;
      end;
    except
      ShowMessage('Houve um erro na autenticação');
    end;
  except
    ShowMessage('Houve um erro na conexão');
  end;
end;

A única alteração que faço nas propriedades do idSMTP, após adicioná-lo ao form, é na propriedade AuthenticationType=atLogin;

No componente idMessage, não faço qualquer alteração de propriedades.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Funciona tudo direitinho quando á ligação á internet, mas quando não á fica dando o erro (Socket error #11004) porque não existe ligaçao.

So da erro(Socket error #11004) quando o timer tenta envia o email de x em x tempo..

Segui o seu exemplo mas sem sucesso se eu mudo a AuthenticationType:=atlogin; para Authencate ele (timer) não envia o email..

Tambem tanho esprementado a minha aplicaçao fora do ambiente de programacao o resultado e identico...

Quando não existe ligaçao com a internet ele não dá sempre erro so dá erro quando o timer tenta enviar o email ou seja x em x tempo depende para que foi programado...

Acho que agora me fis entender melhor espero!!

So quero ocultar o erro(Socket error #11004) quando timer tenta enviar o email e não existe ligaçao!!!

Obrigado pela sua atençao!!!

Link para o comentário
Compartilhar em outros sites

  • 0

devil69, quanto ao uso de IdSMTP1.Authenticate, é porque no meu caso se faz necessário o uso de autenticação no servidor (isso varia de servidor para servidor - é o caso do meu).

Quanto a se fazer entender, eu até já tinha entendido.

O exemplo, eu lhe passei após ter me desconectado da internet (só não fiz a desconexão física), e como disse, a mensagem ocorre apenas quando executado o programa no ambiente de desenvolvimento, ou seja, a partir do Delphi. Se executo o programa gerado (executável - .exe), não há qualquer mensagem de erro (exceto, no exemplo que postei, pois está programado para mostrar uma mensagem informando a falha na conexão). Assim, fica a pergunta sobre algo que até agora você não mencionou: Quando você executa o programa diretamente (o .exe), ocorre o erro?

Fora isto, não teria mais nada a acrescentar. Sinto muito.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Ocorre que o servidor de e-mail possui um limite de conexões consecutivas que está sendo

atingido. Daí a desconexão é automática.

Provavelmente, a utilização deste código está dentro de um laço.

Perceba que ele só conecta e nunca desconecta. Isto contribui para o atingimento do número de conexões

simultâneas do servidor.

Para solucionar o problema, basta desconectar após o envio da mensagem assim:

try

idsmtp1.connect;

idsmtp1.Send(IdMessage);

idsmtp1.Disconnect;

except

end;

Bom trabalho !!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...