zoukankan      html  css  js  c++  java
  • C语言检查本机公网IP并发送邮件

        这是一个用来获取本机公网IP地址,并检查是否是配置里保存的IP地址,假设不是,就向指定的邮箱发送一个邮件,报告这个IP地址的一段小代码。放到开机启动中,电脑不设password的时候万一丢了,还能有个念想..........功能不强——仅仅简单实现了获取地址,发送邮件的功能,仅供练习之用,并且仅仅能用163的邮箱来发邮件......

        发送邮件的函数是百度上copy的,仅仅是简单的改动了一下尴尬尴尬尴尬

    #include <windows.h>
    #include <stdio.h>
    #include <WinSock.h>
    #include <URLMON.H>
    #include <FSTREAM>
    #include <iostream>
    #define N 500
    using namespace std;
    #pragma  comment(lib, "ws2_32.lib")
    #pragma comment(lib,"urlmon.lib")
    
    struct Base64Date6
    {
    	unsigned int d4:6;
    	unsigned int d3:6;
    	unsigned int d2:6;
    	unsigned int d1:6;
    };
    // 协议中加密部分使用的是base64方法
    char ConvertToBase64  (char   c6);
    void EncodeBase64     (char   *dbuf, char *buf128, int len);
    void SendMail         (char   *emailTo,char *emailFrom,char *emailPd,char *body);
    int  OpenSocket       (struct sockaddr *addr);
    
    int CheckIP(char currentIP[])       //0读取文件失败,1IP非信任 2下载文件失败 3信任的IP地址
    {
    	HRESULT hr=URLDownloadToFile(0,"http://www.ip138.com/ips1388.asp","currentIP.txt",0,NULL);
    	if(hr!=S_OK)
    	{
    		return 2;
    	}
    	ifstream readFile("IPlist.txt");
    	if(!readFile)
    	{
    		cout<<"Can't find IPlist.txt"<<endl;
    		return 0;
    	}
    	char listIP[N];
    	readFile.getline(listIP,N,'
    ');
    	readFile.close();
    	readFile.clear();
    	readFile.open("currentIP.txt");
    	if(!readFile)
    	{
    		cout<<"Can't find currentIP.txt"<<endl;
    		return 0;
    	}
    	char readTemp[N*4];
    	while(!readFile.eof())
    	{
    			readFile.getline(readTemp,N*4,'
    ');  //getline函数參数说明:參数1-->指针头,參数2-->最大读取值,參数3-->读取结束符
    			if(readFile.fail()) break;
    			else 
    			{
    				char *temp=strstr(readTemp,"您的IP地址是");
    				if(temp!=NULL)
    				{
    					temp=strchr(temp,'[');
    					for(int i=0;;i++)
    					{
    						if(temp[i+1]==']') 
    						{
    							currentIP[i]='';
    							break;
    						}
    						else
    							currentIP[i]=temp[i+1];
    					}
    					break;
    				}
    			}
    	}
    	readFile.close();
    	readFile.clear();
    	char *p=strstr(listIP,currentIP);
    	if(p!=NULL) 
    	{
    		cout<<"Been trusted!"<<endl;
    		return 3;
    	}
    	else 
    	{
    		cout<<"Unknown Address!Send E-mail immediately!"<<endl;
    		return 1;
    	}
    }
    
    int main()
    {
    	char currentIP[16];
    	int n=0,ir;
    	while(1)
    	{
    		ir=CheckIP(currentIP);
    		if(ir==2)
    		{
    			if(n!=10)
    			{
    				cout<<"Connection failed...It's too bad!I will try again one minute later."<<endl;
    				n++;
    				Sleep(60*1000);
    			}
    			else
    			{
    				cout<<"Connection failed for 10 times.Application will exit immediately!"<<endl;
    				return 0;
    			}
    		}
    		else 
    			break;
    	}
    	if(ir==0)
    	{
    		cout<<"Read file error!Application will exit immediately!"<<endl;
    		return 0;
    	}
    	else if(ir==3)
    	{
    		cout<<"Been trusted!Have fun!"<<endl;
    		return 0;
    	}
    	else 
    	{
    		char emailTo[100];
    		char emailFrom[100];
    		char emailPd[100];
    		fstream readFile("email.ini");
    		if(!readFile)
    		{
    			cout<<"Can't open email.ini"<<endl;
    			return 0;
    		}
    		while(!readFile.eof())
    		{
    			readFile.getline(emailTo,100,'
    ');  //getline函数參数说明:參数1-->指针头,參数2-->最大读取值,參数3-->读取结束符
    			readFile.getline(emailFrom,100,'
    ');
    			readFile.getline(emailPd,100,'
    ');
    		}
    		readFile.close();
    		readFile.clear();
    		char EmailContents[N]   = "From: "YourPC"<110110110@163.com>
    "
    			"To: "MyMaster"<911911911@163.com>
    "
    			"Subject: IP address has been changed!
    
    ";
    		strcat(EmailContents,"The address is:");
    		strcat(EmailContents,currentIP);
    		strcat(EmailContents,"!!!Please check!");
    		SendMail(emailTo,emailFrom,emailPd,EmailContents);
    		return 0;
    	}
    }
    
    char ConvertToBase64(char uc)
    {
    	if(uc < 26)
    	{
    		return 'A' + uc;
    	}
    	if(uc < 52)
    	{
    		return 'a' + (uc - 26);
    	}
    	if(uc < 62)
    	{
    		return '0' + (uc - 52);
    	}
    	if(uc == 62)
    	{
    		return '+';
    	}
    	return '/';
    }
    
    // base64的实现
    void EncodeBase64(char *dbuf, char *buf128, int len)
    {
    	struct Base64Date6 *ddd      = NULL;
    	int           i        = 0;
    	char          buf[256] = {0};
    	char          *tmp     = NULL;
    	char          cc       = '';
    
    	memset(buf, 0, 256);
    	strcpy_s(buf, 256, buf128);
    	for(i = 1; i <= len/3; i++)
    	{
    		tmp             = buf + (i-1)*3;
    		cc              = tmp[2];
    		tmp[2]          = tmp[0];
    		tmp[0]          = cc;
    		ddd             = (struct Base64Date6 *)tmp;
    		dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
    		dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
    		dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
    		dbuf[(i-1)*4+3] = ConvertToBase64((unsigned int)ddd->d4);
    	}
    	if(len % 3 == 1)
    	{
    		tmp             = buf + (i-1)*3;
    		cc              = tmp[2];
    		tmp[2]          = tmp[0];
    		tmp[0]          = cc;
    		ddd             = (struct Base64Date6 *)tmp;
    		dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
    		dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
    		dbuf[(i-1)*4+2] = '=';
    		dbuf[(i-1)*4+3] = '=';
    	}
    	if(len%3 == 2)
    	{
    		tmp             = buf+(i-1)*3;
    		cc              = tmp[2];
    		tmp[2]          = tmp[0];
    		tmp[0]          = cc;
    		ddd             = (struct Base64Date6 *)tmp;
    		dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
    		dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
    		dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
    		dbuf[(i-1)*4+3] = '=';
    	}
    	return;
    }
    // 发送邮件
    void SendMail(char *emailTo,char *emailFrom,char *emailPd,char *body)
    {
    	int     sockfd     = {0};
    	char    buf[1500]  = {0};
    	char    rbuf[1500] = {0};
    	char    login[128] = {0};
    	char    pass[128]  = {0};
    	WSADATA WSAData;
    	struct sockaddr_in their_addr = {0};
    	WSAStartup(MAKEWORD(2, 2), &WSAData);
    	memset(&their_addr, 0, sizeof(their_addr));
    
    	their_addr.sin_family = AF_INET;
    	their_addr.sin_port   = htons(25);
    	hostent* hptr         = gethostbyname("smtp.163.com"); 
    	memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length); 
    	printf("IP of smpt.163.com is : %d:%d:%d:%d
    ", 
    		their_addr.sin_addr.S_un.S_un_b.s_b1, 
    		their_addr.sin_addr.S_un.S_un_b.s_b2, 
    		their_addr.sin_addr.S_un.S_un_b.s_b3, 
    		their_addr.sin_addr.S_un.S_un_b.s_b4); 
    
    	// 连接邮件server,假设连接后没有响应,则2 秒后又一次连接
    	sockfd = OpenSocket((struct sockaddr *)&their_addr);
    	memset(rbuf, 0, 1500);
    	while(recv(sockfd, rbuf, 1500, 0) == 0)
    	{
    		cout<<"reconnect..."<<endl;
    		Sleep(2000);
    		sockfd = OpenSocket((struct sockaddr *)&their_addr);
    		memset(rbuf, 0, 1500);
    	}
    
    	cout<<rbuf<<endl;
    
    	// EHLO
    	memset(buf, 0, 1500);
    	sprintf_s(buf, 1500, "EHLO HYL-PC
    ");
    	send(sockfd, buf, strlen(buf), 0);
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"EHLO REceive: "<<rbuf<<endl;
    
    	// AUTH LOGIN
    	memset(buf, 0, 1500);
    	sprintf_s(buf, 1500, "AUTH LOGIN
    ");
    	send(sockfd, buf, strlen(buf), 0);
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"Auth Login Receive: "<<rbuf<<endl;
    
    	// USER
    	memset(buf, 0, 1500);
    	sprintf_s(buf, 1500, emailFrom);//你的邮箱账号
    	memset(login, 0, 128);
    	EncodeBase64(login, buf, strlen(buf));
    	sprintf_s(buf, 1500, "%s
    ", login);
    	send(sockfd, buf, strlen(buf), 0);
    	cout<<"Base64 UserName: "<<buf<<endl;
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"User Login Receive: "<<rbuf<<endl;
    
    	// PASSWORD
    	sprintf_s(buf, 1500, emailPd);//你的邮箱password
    	memset(pass, 0, 128);
    	EncodeBase64(pass, buf, strlen(buf));
    	sprintf_s(buf, 1500, "%s
    ", pass);
    	send(sockfd, buf, strlen(buf), 0);
    	cout<<"Base64 Password: "<<buf<<endl;
    
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"Send Password Receive: "<<rbuf<<endl;
    	// MAIL FROM
    	char mailFrom[100]="MAIL FROM: <";
    	strcat(mailFrom,emailFrom);
    	strcat(mailFrom,">
    ");
    	memset(buf, 0, 1500);
    	sprintf_s(buf, 1500, mailFrom);
    	send(sockfd, buf, strlen(buf), 0);
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"set Mail From Receive: "<<rbuf<<endl;
    	// RCPT TO 第一个收件人
    	sprintf_s(buf, 1500, "RCPT TO:<%s>
    ", emailTo);
    	send(sockfd, buf, strlen(buf), 0);
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"Tell Sendto Receive: "<<rbuf<<endl;
    
    	// DATA 准备開始发送邮件内容
    	sprintf_s(buf, 1500, "DATA
    ");
    	send(sockfd, buf, strlen(buf), 0);
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"Send Mail Prepare Receive: "<<rbuf<<endl;
    
    	// 发送邮件内容,
    .
    内容结束标记
    	sprintf_s(buf, 1500, "%s
    .
    ", body);
    	send(sockfd, buf, strlen(buf), 0);
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"Send Mail Receive: "<<rbuf<<endl;
    
    	// QUIT
    	sprintf_s(buf, 1500, "QUIT
    ");
    	send(sockfd, buf, strlen(buf), 0);
    	memset(rbuf, 0, 1500);
    	recv(sockfd, rbuf, 1500, 0);
    	cout<<"Quit Receive: "<<rbuf<<endl;
    
    	//清理工作
    	closesocket(sockfd);
    	WSACleanup();
    	return;
    }
    // 打开TCP Socket连接
    int OpenSocket(struct sockaddr *addr)
    {
    	int sockfd = 0;
    	sockfd=socket(PF_INET, SOCK_STREAM, 0);
    	if(sockfd < 0)
    	{
    		cout<<"Open sockfd(TCP) error!"<<endl;
    		exit(-1);
    	}
    	if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)
    	{
    		cout<<"Connect sockfd(TCP) error!"<<endl;
    		exit(-1);
    	}
    	return sockfd;
    } 

    附上资源下载地址:http://download.csdn.net/detail/yangyangsnr/7367321

  • 相关阅读:
    spring MVC fromeWork 與webwork2 mvc 比較
    JAVA Oauth 认证服务器的搭建
    HTTPS的工作原理
    理解HTTP幂等性
    支付交易一般性准则
    设计模式六大原则
    腾讯微信技术总监周颢:一亿用户增长背后的架构秘密
    Valid Parentheses
    4Sum
    Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4294450.html
Copyright © 2011-2022 走看看