Fórum Rotina pronta para mostrar IP dinamico #322011

23/05/2006

0

Com ajuda dos amigos do forum montei esta rotina que identifica o IP dinamico da internet e envia para um determinado e-mail. Se este utilitário ficar rodando em uma máquina e o IP mudar, ele envia um novo e-mail. Esta montado em 2 Units, uma para mostrar o IP e outra para enviar o e-mail. Foi feito em D6 com componentes Indy.

Espero que ajude.

Se alguem fizer alguma melhoria, coloque aqui.

Boa sorte

Quadrado.

unit UMostraIP;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, activex, OleCtrls, SHDocVw, StdCtrls, ExtCtrls, WinSock;

type
  TfmMostraIP = class(TForm)
    WebBrowser1: TWebBrowser;
    Memo1: TMemo;
    bbLerIP: TButton;
    Edit1: TEdit;
    bbCfg: TButton;
    Timer1: TTimer;
    procedure FormShow(Sender: TObject);
    procedure bbLerIPClick(Sender: TObject);
    function WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
    function WB_SaveHTMLCode(WebBrowser: TWebBrowser; const FileName: TFileName): Boolean;
    procedure bbCfgClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    function GetIPFromHost(var HostName, IPaddr, WSAErr: string): Boolean;
  private
    { Private declarations }
    nSite, nCnt : integer;
    cEndIP, cIPLocal, cHost, cErr : string;
  public
    { Public declarations }
  end;

var
  fmMostraIP: TfmMostraIP;

implementation

{$R *.dfm}

uses UEnviaMail;

procedure TfmMostraIP.FormShow(Sender: TObject);
begin
   if not GetIPFromHost(cHost, cIPLocal, cErr) then
     MessageDlg(cErr, mtError, [mbOk], 0);

   nSite := 1;
   nCnt := 1;
   cEndIP := ´´;
   WebBrowser1.Navigate(´http://www.modemclub.com.br/cgi-bin/mostraip.cgi´);
end;

function TfmMostraIP.WB_SaveHTMLCode(WebBrowser: TWebBrowser; const FileName: TFileName): Boolean;
var
  ps: IPersistStreamInit;
  fs: TFileStream;
  sa: IStream;
begin
  ps := WebBrowser.Document as IPersistStreamInit;
  fs := TFileStream.Create(FileName, fmCreate);
  try
    sa := TStreamAdapter.Create(fs, soReference) as IStream;
    Result := Succeeded(ps.Save(sa, True));
  finally
    fs.Free;
  end;
end;

function TfmMostraIP.WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var
  ps: IPersistStreamInit;
  ss: TStringStream;
  sa: IStream;
  s: string;
begin
  ps := WebBrowser.Document as IPersistStreamInit;
  s := ´´;
  ss := TStringStream.Create(s);
  try
    sa := TStreamAdapter.Create(ss, soReference) as IStream;
    Result := Succeeded(ps.Save(sa, True));
    if Result then ACode.Add(ss.Datastring);
  finally
    ss.Free;
  end;
end;

procedure TfmMostraIP.bbLerIPClick(Sender: TObject);
begin
   WB_SaveHTMLCode(Webbrowser1, ´endereço IP.txt´);

   Sleep(2000);

   Memo1.Lines.LoadFromFile(´endereço IP.txt´);

   WB_GetHTMLCode(Webbrowser1, Memo1.Lines);
   if nSite = 1 then    // alterna entre os 2 sites
   begin
      Edit1.Text := Copy(Memo1.Text, Pos(´face=Verdana><b>´, Memo1.Text)+16, 40);
      Edit1.Text := Copy(Edit1.Text, 1, Pos(´</b></font>´, Edit1.Text)-1);
   end
   else
   begin
      Edit1.Text := Copy(Memo1.Text, Pos(´<strong class="IP">´, Memo1.Text)+19, 40);
      Edit1.Text := Copy(Edit1.Text, 1, Pos(´</strong><br />´, Edit1.Text)-1);
   end;

   if cEndIP <> Edit1.Text then  // se IP diferente do anterior
   with fmEnviaMail do
   begin
      fmEnviaMail.MmDescricao.Lines.Clear;
      fmEnviaMail.MmDescricao.Lines.Add(fmMostraIP.Edit1.Text);
      fmEnviaMail.MmDescricao.Lines.Add(cIPLocal+´ ( ´+cHost+´ )´);
      fmEnviaMail.MmDescricao.Lines.Add(FormatDateTime(´"em "dd/mm/yyyy "às" hh:nn´, now));
      fmEnviaMail.MmDescricao.Lines.Add(WebBrowser1.LocationURL);

      fmEnviaMail.bbEnviarClick(Sender);   // envia e-mail
   end;

   cEndIP := Edit1.Text;
end;

procedure TfmMostraIP.bbCfgClick(Sender: TObject);
begin
   fmEnviaMail.ShowModal;
end;

procedure TfmMostraIP.Timer1Timer(Sender: TObject);
begin
   if (nCnt = 6) then
   begin
      nCnt := 1;
      bbLerIPClick(Sender);
      Exit;
   end;

   if nSite = 1 then
   begin
      WebBrowser1.Stop;
      WebBrowser1.Navigate(´www.meuip.com.br´);
      nSite := 2;
   end
   else
   begin
      WebBrowser1.Stop;
      WebBrowser1.Navigate(´http://www.modemclub.com.br/cgi-bin/mostraip.cgi´);
      nSite := 1;
   end;

   Inc(nCnt);
end;

function TfmMostraIP.GetIPFromHost(var HostName, IPaddr, WSAErr: string): Boolean;
type
  Name = array[0..100] of Char; 
  PName = ^Name;
var 
  HEnt: pHostEnt; 
  HName: PName;
  WSAData: TWSAData; 
  i: Integer; 
begin 
  Result := False;     
  if WSAStartup($0101, WSAData) <> 0 then begin 
    WSAErr := ´Winsock is not responding."´; 
    Exit; 
  end; 
  IPaddr := ´´; 
  New(HName); 
  if GetHostName(HName^, SizeOf(Name)) = 0 then
  begin 
    HostName := StrPas(HName^); 
    HEnt := GetHostByName(HName^); 
    for i := 0 to HEnt^.h_length - 1 do 
     IPaddr :=
      Concat(IPaddr,
      IntToStr(Ord(HEnt^.h_addr_list^[i])) + ´.´); 
    SetLength(IPaddr, Length(IPaddr) - 1); 
    Result := True;
  end
  else begin
   case WSAGetLastError of
    WSANOTINITIALISED:WSAErr:=´WSANotInitialised´;
    WSAENETDOWN      :WSAErr:=´WSAENetDown´;
    WSAEINPROGRESS   :WSAErr:=´WSAEInProgress´;
   end;
  end;
  Dispose(HName);
  WSACleanup;
end;

end.


e a Unit para envio de e-mail

unit UEnviaMail;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdMessage, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, IdPOP3;

type
  TfmEnviaMail = class(TForm)
    IdSMTP1: TIdSMTP;
    IdMessage1: TIdMessage;
    OpenDialog1: TOpenDialog;
    bbAnexar: TButton;
    bbEnviar: TButton;
    ListBox1: TListBox;
    EdDestino: TEdit;
    EdAssunto: TEdit;
    MmDescricao: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    IdPOP31: TIdPOP3;
    Edit4: TEdit;
    Label7: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    procedure bbEnviarClick(Sender: TObject);
    procedure bbAnexarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmEnviaMail: TfmEnviaMail;

implementation

{$R *.dfm}

procedure TfmEnviaMail.bbEnviarClick(Sender: TObject);
var Anexo:Integer;
begin
   IdPOP31.Host := Edit4.Text;    // pop.mail.provedor.com.br
   IdPOP31.UserId := Edit2.Text;   // seuemail
   IdPOP31.Password := Edit3.Text;   // suasenha

   IdPOP31.Connect;

   IdSMTP1.Host := Edit1.Text;  // smtp.mail.provedor.com.br
   IdSMTP1.UserId := Edit2.Text;  // seuemail
   IdSMTP1.Password :=  Edit3.Text;   // suasenha

   IdMessage1.Recipients.EMailAddresses := EdDestino.Text; // destino
   IdMessage1.Subject := EdAssunto.Text;
   IdMessage1.Body := MmDescricao.Lines;
   IdMessage1.From.Address := Edit5.Text;   // seuemail@provedor.com.br
   IdMessage1.From.Name := Edit6.Text;   // Seu Nome

   for Anexo := 0 to ListBox1.Items.Count-1 do
      TIdAttachment.Create(IdMessage1.MessageParts,
      TFilename(ListBox1.Items.Strings[Anexo]));

   IdSMTP1.Connect;
   try
      IdSMTP1.Send(IdMessage1);
   finally
      IdPOP31.Disconnect;
      IdSMTP1.Disconnect;
   end;
//   Application.MessageBox(´O E-mail Foi Enviado Com Sucesso!´, ´Confirmação´, MB_ICONINFORMATION + MB_OK);
end;

procedure TfmEnviaMail.bbAnexarClick(Sender: TObject);
begin
   if OpenDialog1.Execute then
      ListBox1.Items.Add(OpenDialog1.FileName);
end;

end.



Quadrado

Quadrado

Responder

Posts

26/05/2006

Quadrado

Na rotina anterior estava tendo problemas com a atualização do site. Nesta usa o traceroute pra detrminar o IP.

unit UMostraIPRoute;

{ Modificado de

  Delphi Traceroute utility
  -------------------------
  Author : Dirk Claessens <dirkcl@pandora.be>
  -------------------------------------------
}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent,
  IdComponent, IdRawBase, IdRawClient, IdIcmpClient, ComCtrls, Buttons,
  ExtCtrls;

const
  ICMP_TIMEOUT      = 5000;
  ICMP_MAX_HOPS     = 40;
  NULL_IP           = ´0.0.0.0´;

type
  TForm1 = class(TForm)
    edtHost: TEdit;
    Button1: TButton;
    Icmp: TIdIcmpClient;
    IdAntiFreeze1: TIdAntiFreeze;
    edIPDin: TEdit;
    Timer1: TTimer;
    SpeedButton1: TSpeedButton;
    procedure Button1Click(Sender: TObject);
    procedure ProcessResponse( Status: TReplyStatus );
    procedure PingNext;
    procedure Report( TTL: integer; ResponseTime: integer; Status: TReplyStatus;
                         info: string );
  private
    { Private declarations }
    FDestIP    : string;
    FHostName  : string;
    CurrentTTL : integer;
    PingStart  : cardinal;
    FStop      : boolean;
    cIPDin     : string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses IDStack, UEnviaMail;

procedure TForm1.Button1Click(Sender: TObject);
var
 OldMode : DWORD;
begin
 Application.ProcessMessages;
 CurrentTTL := 1;
 FHostName := edtHost.Text;
 ICMP.ReceiveTimeout := ICMP_TIMEOUT;
 ICMP.TTL  := CurrentTTL;

 OldMode := SetErrorMode( SEM_FAILCRITICALERRORS ); // trap DNS-errors!
 try
  FDestIP    := GStack.WSGetHostByName( FHostName); // lookup host IP with DNS
 except
  MessageBeep(0);  // Euh Aah...
  EXIT;
 end;
 SetErrorMode( OldMode );

 ICMP.Host := FDestIP;
 PingStart := GetTickCount;

 if not FStop then
 begin
   ICMP.Ping;
   Processresponse(ICMP.ReplyStatus);
 end;

end;

procedure TForm1.ProcessResponse( Status: TReplyStatus );
begin

{   case Status.ReplyStatusType of

   //------
   rsECHO :
    begin     // target host has responded
      Report( CurrentTTL, GetTickCount-PingStart, Status, ´DONE!´ );  // done!
    end;

   //------
   rsErrorTTLExceeded:
     begin  // Time-To-Live exceeded for an ICMP response.
 }       Report( CurrentTTL, GetTickCount-PingStart, Status, ´OK´ );
{        PingNext;
     end;

   //-------
   rsTimeOut :
     begin // - Timeout occurred before a response was received.
        Report( CurrentTTL, GetTickCount-PingStart, Status, ´TIMEOUT´ );
        PingNext;
     end;

   //-------
   rsErrorUnreachable:
     begin // - Destination unreachable
       Report( CurrentTTL, GetTickCount-PingStart, Status, ´DEST_UNREACH´ );
     end;

   //------
   rsError:
     begin // - An error has occurred.
       Report( CurrentTTL, GetTickCount-PingStart, Status, ´ERROR´ );
       PingNext;
     end;
   end   // case}
end;

procedure TForm1.PingNext;
var
  OldMode: DWORD;
begin
 if FStop then
    EXIT;

 inc(CurrentTTL);
 if CurrentTTL < ICMP_MAX_HOPS then
 begin
   ICMP.Host := FDestIP ;
   ICMP.TTL  := CurrentTTL;
   ICMP.ReceiveTimeout := ICMP_TIMEOUT;
   PingStart := GetTickCount;
   OldMode := SetErrorMode( SEM_FAILCRITICALERRORS );
   try
     ICMP.Ping;
   except
     edIPDin.Text :=  ´** ERROR **´;
   end;
   SetErrorMode( OldMode );
   Processresponse(ICMP.ReplyStatus);
 end;
end;

procedure TForm1.Report( TTL: integer; ResponseTime: integer; Status: TReplyStatus;
                         info: string );
var
 HostName : string;
begin
  Application.ProcessMessages;

  if (Status.FromIpAddress <> NULL_IP ) then
     cIPDin := Status.FromIpAddress
  else
     exit;

   if cIPDin <> edIPDin.Text then  // se IP diferente do anterior
   with fmEnviaMail do
   begin
      fmEnviaMail.EdAssunto.Text := ´IP atual - ´+
         FormatDateTime(´dd/mm/yyyy hh:nn´, now);
      fmEnviaMail.MmDescricao.Lines.Clear;
      fmEnviaMail.MmDescricao.Lines.Add(cIPDin);
//      fmEnviaMail.MmDescricao.Lines.Add(cIPLocal+´ ( ´+cHost+´ )´);
      fmEnviaMail.MmDescricao.Lines.Add(FormatDateTime(´"em "dd/mm/yyyy "às" hh:nn´, now));

      fmEnviaMail.bbEnviarClick(Self);   // envia e-mail
   end;

  edIPDin.Text := Status.FromIpAddress;

  Application.ProcessMessages;
end;

end.



Responder

Gostei + 0

26/05/2006

Leitorbinario

Obrigado por compartilhar.


Responder

Gostei + 0

26/05/2006

Paullsoftware

é amigo, um forte abraço eu estava procurando uma forma de acessar meu Router, já estava até pensando em desconfigurar o meu Modem ADSL, funciona perfeitamente com ele também né?


Responder

Gostei + 0

26/05/2006

Adriano Santos

é amigo, um forte abraço eu estava procurando uma forma de acessar meu Router, já estava até pensando em desconfigurar o meu Modem ADSL, funciona perfeitamente com ele também né?


Num entendi direito o que vc precisa Pall.


Responder

Gostei + 0

26/05/2006

Paullsoftware

[quote:aa29570efb=´Adriano Santos´]
é amigo, um forte abraço eu estava procurando uma forma de acessar meu Router, já estava até pensando em desconfigurar o meu Modem ADSL, funciona perfeitamente com ele também né?


Num entendi direito o que vc precisa Pall.[/quote:aa29570efb]

Então, acho que não entendeu foi eu... O que exatamente essa função faz?

Ele não detecta o IP da máquina (do servidor por exemplo) e envia para um e-mail? então posso adaptar para enviar para a estação ligada na rede... ou não? :shock:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar