使用vbs获得外网ip并发送到邮箱里
2014-05-12来源:易贤网

代码如下:

'* **************************************** *

'* 程序名称:GetIP.vbs

'* 程序说明:获得本地外网地址并发送到指定邮箱

'* 编码:lyserver

'* **************************************** *

Option Explicit

Call Main '执行入口函数

'- ----------------------------------------- -

' 函数说明:程序入口

'- ----------------------------------------- -

Sub Main()

Dim objWsh

Dim objEnv

Dim strNewIP, strOldIP

Dim dtStartTime

Dim nInstance

strOldIP = ""

dtStartTime = DateAdd("n", -30, Now) '设置起始时间

'获得运行实例数,如果大于1,则结束以前运行的实例

Set objWsh = CreateObject("WScript.Shell")

Set objEnv = CreateObject("WScript.Shell").Environment("System")

nInstance = Val(objEnv("GetIpToEmail")) + 1 '运行实例数加1

objEnv("GetIpToEmail") = nInstance

If nInstance > 1 Then Exit Sub '如果运行实例数大于1则退出,以防重复运行

'开启远程桌面

'EnabledRometeDesktop True, Null

'在后台连续检测外网地址,如果有变化则发送邮件到指定邮箱

Do

If Err.Number <> 0 Then Exit Do

If DateDiff("n", dtStartTime, Now) >= 30 Then '半小时检查一次IP

dtStartTime = Now '重置起始时间

strNewIP = GetWanIP '获得本地的公网IP地址

If Len(strNewIP) > 0 Then

If strNewIP <> strOldIP Then '如果IP发生了变化则发送

SendMail "发信人邮箱@sina.com", "密码", "收信人邮箱@sina.com", "路由器IP", strNewIP '发送IP到指定邮箱

strOldIP = strNewIP '重置原来的IP

End If

End If

End If

WScript.Sleep 2000 '延时2秒,以释放CPU资源

Loop Until Val(objEnv("GetIpToEmail")) > 1

objEnv.Remove "GetIpToEmail" '清除运行实例数变量

Set objEnv = Nothing

Set objWsh = Nothing

MsgBox "程序被成功终止!", 64, "提示"

End Sub

'- ----------------------------------------- -

' 函数说明:开启远程桌面

' 参数说明:blnEnabled是否开启,True开启,False关闭

' nPort远程桌面的端口号,默认为3389

'- ----------------------------------------- -

Sub EnabledRometeDesktop(blnEnabled, nPort)

Dim objWsh

If blnEnabled Then

blnEnabled = 0 '0表示开启

Else

blnEnabled = 1 '1表示关闭

End If

Set objWsh = CreateObject("WScript.Shell")

'开启远程桌面并设置端口号

objWsh.RegWrite "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Terminal Server/fDenyTSConnections", blnEnabled, "REG_DWORD" '开启远程桌面

'设置远程桌面端口号

If IsNumeric(nPort) Then

If nPort > 0 Then

objWsh.RegWrite "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Terminal Server/Wds/rdpwd/Tds/tcp/PortNumber", nPort, "REG_DWORD"

objWsh.RegWrite "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Terminal Server/WinStations/RDP-Tcp/PortNumber", nPort, "REG_DWORD"

End If

End If

Set objWsh = Nothing

End Sub

'- ----------------------------------------- -

' 函数说明:获得公网IP

'- ----------------------------------------- -

Function GetWanIP()

Dim nPos

Dim objXmlHTTP

GetWanIP = ""

On Error Resume Next

'创建XMLHTTP对象

Set objXmlHTTP = CreateObject("MSXML2.XMLHTTP")

'导航至http://www.ip138.com/ip2city.asp获得IP地址

objXmlHTTP.open "GET", "http://iframe.ip138.com/ic.asp", False

objXmlHTTP.send

'提取HTML中的IP地址字符串

nPos = InStr(objXmlHTTP.responseText, "[")

If nPos > 0 Then

GetWanIP = Mid(objXmlHTTP.responseText, nPos + 1)

nPos = InStr(GetWanIP, "]")

If nPos > 0 Then GetWanIP = Trim(Left(GetWanIP, nPos - 1))

End If

'销毁XMLHTTP对象

Set objXmlHTTP = Nothing

End Function

'- ----------------------------------------- -

' 函数说明:将字符串转换为数值

'- ----------------------------------------- -

Function Val(vNum)

If IsNumeric(vNum) Then

Val = CDbl(vNum)

Else

Val = 0

End If

End Function

'- ----------------------------------------- -

' 函数说明:发送邮件

' 参数说明:strEmailFrom:发信人邮箱

' strPassword:发信人邮箱密码

' strEmailTo:收信人邮箱

' strSubject:邮件标题

' strText:邮件内容

'- ----------------------------------------- -

Function SendMail(strEmailFrom, strPassword, strEmailTo, strSubject, strText)

Dim i, nPos

Dim strUsername

Dim strSmtpServer

Dim objSock

Dim strEML

Const sckConnected = 7

Set objSock = CreateWinsock()

objSock.Protocol = 0

nPos = InStr(strEmailFrom, "@")

'校验参数完整性和合法性

If nPos = 0 Or InStr(strEmailTo, "@") = 0 Or Len(strText) = 0 Or Len(strPassword) = 0 Then Exit Function

'根据邮箱名称获得邮箱帐号

strUsername = Trim(Left(strEmailFrom, nPos - 1))

'根据发信人邮箱获得ESMTP服务器名称

strSmtpServer = "smtp." & Trim(Mid(strEmailFrom, nPos + 1))

'组装邮件

strEML = "MIME-Version: 1.0" & vbCrLf

strEML = strEML & "FROM:" & strEmailFrom & vbCrLf

strEML = strEML & "TO:" & strEmailTo & vbCrLf

strEML = strEML & "Subject:" & "=?GB2312?B?" & Base64Encode(strSubject) & "?=" & vbCrLf

strEML = strEML & "Content-Type: text/plain;" & vbCrLf

strEML = strEML & "Content-Transfer-Encoding: base64" & vbCrLf & vbCrLf

strEML = strEML & Base64Encode(strText)

strEML = strEML & vbCrLf & "." & vbCrLf

'连接到邮件服务哭

objSock.Connect strSmtpServer, 25

'等待连接成功

For i = 1 To 10

If objSock.State = sckConnected Then Exit For

WScript.Sleep 200

Next

If objSock.State = sckConnected Then

'准备发送邮件

SendCommand objSock, "EHLO VBSEmail"

SendCommand objSock, "AUTH LOGIN" '申请进行SMTP会话

SendCommand objSock, Base64Encode(strUsername)

SendCommand objSock, Base64Encode(strPassword)

SendCommand objSock, "MAIL FROM:" & strEmailFrom '发信人

SendCommand objSock, "RCPT TO:" & strEmailTo '收信人

SendCommand objSock, "DATA" '以下为邮件内容

'发送邮件

SendCommand objSock, strEML

'结束邮箱发送

SendCommand objSock, "QUIT"

End If

'断开连接

objSock.Close

WScript.Sleep 200

Set objSock = Nothing

End Function

'- ----------------------------------------- -

' 函数说明:SendMail的辅助函数

'- ----------------------------------------- -

Function SendCommand(objSock, strCommand)

Dim i

Dim strEcho

On Error Resume Next

objSock.SendData strCommand & vbCrLf

For i = 1 To 50 '等待结果

WScript.Sleep 200

If objSock.BytesReceived > 0 Then

objSock.GetData strEcho, vbString

If (Val(strEcho) > 0 And Val(strEcho) < 400) Or InStr(strEcho, "+OK") > 0 Then

SendCommand = True

End If

Exit Function

End If

Next

End Function

'- ----------------------------------------- -

' 函数说明:创建Winsock对象,如果失败则下载注册后再创建

'- ----------------------------------------- -

Function CreateWinsock()

Dim objWsh

Dim objXmlHTTP

Dim objAdoStream

Dim objFSO

Dim strSystemPath

'创建并返回Winsock对象

On Error Resume Next

Set CreateWinsock = CreateObject("MSWinsock.Winsock")

If Err.Number = 0 Then Exit Function '创建成功,返回Winsock对象

Err.Clear

On Error GoTo 0

'获得Windows/System32系统文件夹位置

Set objFSO = CreateObject("Scripting.FileSystemObject")

strSystemPath = objFSO.GetSpecialFolder(1)

'如果系统文件夹中的mswinsck.ocx文件不存在,则从网站下载

If Not objFSO.FileExists(strSystemPath & "/mswinsck.ocx") Then

'创建XMLHTTP对象

Set objXmlHTTP = CreateObject("MSXML2.XMLHTTP")

'下载MSWinsck.ocx控件

objXmlHTTP.open "GET", "http://c3.good.gd:81/?FileId=223358", False

objXmlHTTP.send

'将MSWinsck.ocx保存到系统文件夹

Set objAdoStream = CreateObject("Adodb.Stream")

objAdoStream.Type = 1 'adTypeBinary

objAdoStream.open

objAdoStream.Write objXmlHTTP.responseBody

objAdoStream.SaveToFile strSystemPath & "/mswinsck.ocx", 2 'adSaveCreateOverwrite

objAdoStream.Close

Set objAdoStream = Nothing

'销毁XMLHTTP对象

Set objXmlHTTP = Nothing

End If

'注册MSWinsck.ocx

Set objWsh = CreateObject("WScript.Shell")

objWsh.RegWrite "HKEY_CLASSES_ROOT/Licenses/2c49f800-c2dd-11cf-9ad6-0080c7e7b78d/", "mlrljgrlhltlngjlthrligklpkrhllglqlrk" '添加许可证

objWsh.Run "regsvr32 /s " & strSystemPath & "/mswinsck.ocx", 0 '注册控件

Set objWsh = Nothing

'重新创建并返回Winsock对象

Set CreateWinsock = CreateObject("MSWinsock.Winsock")

End Function

'- ----------------------------------------- -

' 函数说明:BASE64编码函数

'- ----------------------------------------- -

Function Base64Encode(strSource)

Dim objXmlDOM

Dim objXmlDocNode

Dim objAdoStream

Base64Encode = ""

If strSource = "" Or IsNull(strSource) Then Exit Function

'创建XML文档对象

Set objXmlDOM = CreateObject("Microsoft.XMLDOM")

objXmlDOM.loadXML ("<?xml version='1.0' ?> <root/>")

Set objXmlDocNode = objXmlDOM.createElement("MyText")

objXmlDocNode.dataType = "bin.base64"

'将字符串转换为字节数组

Set objAdoStream = CreateObject("ADODB.Stream")

objAdoStream.mode = 3

objAdoStream.Type = 2

objAdoStream.open

objAdoStream.Charset = "GB2312"

objAdoStream.writetext strSource

objAdoStream.position = 0

objAdoStream.Type = 1

objXmlDocNode.nodeTypedValue = objAdoStream.read() '将转换后的字节数组读入到XML文档中

objAdoStream.Close

Set objAdoStream = Nothing

'获得BASE64编码

Base64Encode = objXmlDocNode.Text

objXmlDOM.documentElement.appendChild objXmlDocNode

Set objXmlDOM = Nothing

End Function

更多信息请查看IT技术专栏

推荐信息