Guest --devil69 -- Postado Janeiro 14, 2008 Denunciar Share Postado Janeiro 14, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 João Paulo Taraciuk Postado Janeiro 14, 2008 Denunciar Share Postado Janeiro 14, 2008 (editado) 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 Privatefunction 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 projetovaleu.. Editado Janeiro 14, 2008 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 ;) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 14, 2008 Denunciar Share Postado Janeiro 14, 2008 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 Privatefunction 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 projetovaleu..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.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 João Paulo Taraciuk Postado Janeiro 14, 2008 Denunciar Share Postado Janeiro 14, 2008 devil69, eu editei o tópico, pois havia um erro no Button1Click, ao invés de if EstaVivo(Edit1.Text) then, fica if VerificaConexao(Edit1.Text) then. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 14, 2008 Denunciar Share Postado Janeiro 14, 2008 Amigo continua dando o erro (Socket error #11004)...não sei mais o que fazer para que este erro não apareça,se ouver mais opnioes eu agradeço... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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!!Obrigado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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?? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 (editado) 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 Janeiro 15, 2008 por Micheus Incluída tag's CODE para melhorar a visualização, bem como identado o código. Utilize a identação também ;) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 15, 2008 Denunciar Share Postado Janeiro 15, 2008 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!!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 16, 2008 Denunciar Share Postado Janeiro 16, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 devil69 Postado Janeiro 16, 2008 Denunciar Share Postado Janeiro 16, 2008 Quando você executa o programa diretamente (o .exe), ocorre o erro?Não!!Mas como tá programado para enviar email de x em x tempo quando ele tenta enviar o email e que ocorre o erro. (timer)Obrigado por tudo!!Abraços. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Georgenor Almeida Postado Abril 28, 2010 Denunciar Share Postado Abril 28, 2010 Ocorre que o servidor de e-mail possui um limite de conexões consecutivas que está sendoatingido. 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õessimultâ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 !!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
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
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.