• 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

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4294450.html
Copyright © 2020-2023  润新知