Fórum Rotina pronta para mostrar IP dinamico #322011
23/05/2006
0
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
Curtir tópico
+ 0Posts
26/05/2006
Quadrado
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.
Gostei + 0
26/05/2006
Leitorbinario
Gostei + 0
26/05/2006
Paullsoftware
Gostei + 0
26/05/2006
Adriano Santos
Num entendi direito o que vc precisa Pall.
Gostei + 0
26/05/2006
Paullsoftware
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:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)