⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 嵌入式linux发送电子邮件程序.txt

📁 嵌入式linux发送电子邮件程序
💻 TXT
字号:
/*
		funtion : send email
		author  : liyanan
		data    : 2006-04-08
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>#include <sys/stat.h>
#include <unistd.h> 
#include <fcntl.h>#include <sys/ioctl.h>#include <netinet/in.h>
#include <sys/socket.h>
#include <linux/if_ether.h>
#include <net/if.h>#include <errno.h>#define   ETH_NAME  "eth0"
#define SD_BOTH 2#define SOCKET_ERROR -1#define INVALID_SOCKET -1
int s;
struct sockaddr_in remote;
unsigned short port;	
int rt;
char *send_data;
char *recv_data;
char *hostname;
struct hostent *ht;
char *usersrc,*userdes,*passsrc,*passdes;
char *From,*To,*Date,*Subject;
char *Filename;
int GetLocalAddress(char *szIPAddr)
{  int   sock;   
  struct   sockaddr_in   sin;   
  struct   sockaddr   sa;   
  struct   ifreq   ifr;                              
  sock = socket(AF_INET,   SOCK_DGRAM,   0);   
  if(sock == -1)   
  {   
  	printf("Error:get local IP socket fail!\n");   
    return  -1;                             
  }                   
  strncpy(ifr.ifr_name, ETH_NAME,IFNAMSIZ);   
  ifr.ifr_name[IFNAMSIZ - 1] = 0;                   
  if(ioctl(sock, SIOCGIFADDR, &ifr) < 0)   
  {
  	printf("Error:get local IP ioctl fail!");   
    return  -1;   
  }   
  memcpy(&sin,   &ifr.ifr_addr,   sizeof(sin));
  sprintf(szIPAddr,"%s",inet_ntoa(sin.sin_addr));   
  return  0; 
}int GetLocalMac(unsigned char *vmac){   	int sock;	int i;
	struct sockaddr_in sin;
	struct sockaddr sa;
	struct ifreq ifr;
	unsigned char mac[6];
		
	sock = socket(AF_INET, SOCK_DGRAM, 0);
	if (sock == -1)
	{
		perror("socket");
		return -1;		
	}
	
	strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);
	ifr.ifr_name[IFNAMSIZ - 1] = 0;
	
	memset(mac, 0, sizeof(mac));
	if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0)
	{
		perror("ioctl");
		return -1;
	}

	memcpy(&sa, &ifr.ifr_addr, sizeof(sin));
	memcpy(mac,sa.sa_data,6);	sprintf(vmac,"%.2X:%.2X:%.2X:%.2X:%0.2X:%0.2X\n",mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
	return 0;}
void Destory()
{
	if(s!=INVALID_SOCKET)
	{
		shutdown(s,SD_BOTH);
		close(s);
		//WSACleanup();
	}
	free(From);
	free(To);
	free(Date);
	free(Subject);
	free(Filename);

	free(recv_data);
	free(userdes);
	free(passdes);

}
void Base64_Code(unsigned char *chsrc, unsigned char *chdes)
{
	char chadd[3];
	unsigned char temp[4],t;
	
	int len,i;
	len = strlen((char *)chsrc);

    while(len>=3)
	{
		temp[0] = (*chsrc)>>2;
		t       = (*chsrc & 0x03)<<4;
		temp[1] = (*(chsrc+1)>>4)|t;
		t       = ((*(chsrc+1)<<2) & 0x3f);
		temp[2] = (*(chsrc+2)>>6)|t;
		temp[3] = (*(chsrc+2) & 0x3f);

		for(i=0;i<4;i++)
		{
			if(temp[i]>=0 && temp[i]<=25) 
				*(chdes+i) = temp[i]+65;
			if(temp[i]>=26 && temp[i]<=51) 
				*(chdes+i) = temp[i]+71;
			if(temp[i]>=52 && temp[i]<=61) 
				*(chdes+i) = temp[i]-4;
			if(temp[i]==62) 
				*(chdes+i) = 43;
			if(temp[i]==63) 
				*(chdes+i) = 47;
		}
        
		len -= 3;
		chsrc += 3;
		chdes += 4;
	}
    if(len!=0)
	{
		for(i=0;i<3;i++)
			chadd[i] = 0;
        memcpy(chadd,chsrc,len);

		temp[0] = chadd[0]>>2;
		t       = (chadd[0] & 0x03)<<4;
		temp[1] = (chadd[1]>>4)|t;
		t       = ((chadd[1]<<2) & 0x3f);
		temp[2] = (chadd[2]>>6)|t;
		temp[3] = chadd[2] & 0x3f;

		for(i=0;i<4;i++)
		{
			if(temp[i]>=0 && temp[i]<=25 && (i==0 || i==1)) *(chdes+i) = temp[i]+65;
			else  *(chdes+i) = 61;
			if(temp[i]>=26 && temp[i]<=51) *(chdes+i) = temp[i]+71;
			else if(temp[i]>=52 && temp[i]<=61) *(chdes+i) = temp[i]-4;
			else if(temp[i]==62) *(chdes+i) = 43;
			else if(temp[i]==63) *(chdes+i) = 47;
		}
		chdes += 4;
		*chdes = '\0';
		return;
	}
	*chdes = '\0';
}
void Base64_Decode(unsigned char *chsrc, unsigned char *chdes)
{
	unsigned char temp[4],t;
	int len,i;
	len = strlen((char *)chdes);
	while(len>=4)
	{
		for(i=0;i<4;i++)
		{
			if(*(chdes+i)>=65 && *(chdes+i)<=90) 
				 temp[i] = *(chdes+i)-65;
			if(*(chdes+i)>=97 && *(chdes+i)<=122) 
				temp[i] = *(chdes+i)-71;
			if(*(chdes+i)>=48 && *(chdes+i)<=57) 
				temp[i] = *(chdes+i)+4;
			if(*(chdes+i)==43) 
				temp[i] = 62;
			if(*(chdes+i)==47) 
				temp[i] = 63;
			if(*(chdes+i)==61)
				temp[i] = 0;
		}
		t = (temp[1]>>4)&0x03;
        *chsrc = (temp[0]<<2)|t;
		t = (temp[2]>>2)&0x0f;
		*(chsrc+1) = (temp[1]<<4)|t;
		t = temp[3];
		*(chsrc+2) = (temp[2]<<6)|t;

		chsrc += 3;
		chdes += 4;
		len   -= 4;
	}
	chsrc -= 3;
	for(i=0;i<3;i++)
	{
		if(*(chsrc+i) == 0)
		{
			*(chsrc+i) = '\0';
			break;
		}
	}
	if(i>=2)
		*(chsrc+3) = '\0';
}
int GetResponse()
{
	rt = recv(s,recv_data,1024,0);
	if(rt == SOCKET_ERROR)
	{		printf("receive nothing\n");
		return -1;
	}
	recv_data[rt]='\0';
	if(*recv_data == '5')	{		printf("the order is not support smtp host\n ");
		return -1;	}
	printf("%s\n",recv_data);
	return 1;
}
int CreateSocket()
{
	long t = 5000;
	s = socket(AF_INET,SOCK_STREAM,0);
	if(s == SOCKET_ERROR)
	{		printf("socket init error\n");
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	return 1;
}
int ConnectHost(const char *hostname)
{	//printf("socket id :%d\n",s);
	if(hostname == NULL)
		return -1;
	memset(&remote,0,sizeof(struct sockaddr));
	remote.sin_family = AF_INET;
	remote.sin_port   = htons(port);
	remote.sin_addr.s_addr = inet_addr(hostname);

	rt = connect(s,(struct sockaddr *)&remote,sizeof(struct sockaddr));
	if(rt == SOCKET_ERROR)
	{		printf("connect error\n");
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
    	//printf("connect the host ok :%d\n",port);
	if(!GetResponse())
		return -1;
	return 1;
}
int LogIn(char *username,char *password)
{
	char ch[100];
	if(username == NULL || password == NULL)
		return -1;
	usersrc = username;
	passsrc = password;
	Base64_Code((unsigned char *)usersrc,(unsigned char *)userdes);
	Base64_Code((unsigned char *)passsrc,(unsigned char *)passdes);

	send_data = "EHLO Localhost\r\n";
	
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}


	if(!GetResponse())
		return -1;
    
        send_data = "AUTH LOGIN\r\n";
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	if(!GetResponse())
		return -1;
	
        sprintf(ch,"%s\r\n",userdes);
	rt = send(s,(char *)ch,strlen(ch),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}

	if(!GetResponse())
		return -1;

	
	sprintf(ch,"%s\r\n",passdes);
	rt = send(s,(char *)ch,strlen(ch),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}

	if(!GetResponse())
		return -1;

	return 1;
}
int SendMail(const char *from,const char *to,const char *date,const char *subject,const char *data)
{
	if(from == NULL || to == NULL || date == NULL || subject == NULL)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	sprintf(From,"MAIL FROM: <%s>\r\n",from);
	rt = send(s,From,strlen(From),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	if(!GetResponse())
		return -1;

	sprintf(To,"RCPT TO: <%s>\r\n",to);
	rt = send(s,To,strlen(To),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	if(!GetResponse())
		return -1;

	send_data = "DATA\r\n";
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	if(!GetResponse())
		return -1;

	sprintf(From,"From: %s\r\n",from);
	rt = send(s,From,strlen(From),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
    
	sprintf(To,"To: %s\r\n",to);
	rt = send(s,To,strlen(To),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	

	sprintf(Date,"Date: %s\r\n",date);
	rt = send(s,Date,strlen(Date),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}

	sprintf(Subject,"Subject: %s\r\n",subject);
	rt = send(s,Subject,strlen(Subject),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	send_data = "\r\n";
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}

	rt = send(s,(char *)data,strlen(data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}

	send_data = "\r\n";
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	return 1;
}
int End()
{
	send_data = "\r\n";
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	send_data = "\r\n.\r\n";
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	if(!GetResponse())
		return -1;

        send_data = "QUIT\r\n";
	rt = send(s,send_data,strlen(send_data),0);
	if(rt == SOCKET_ERROR)
	{
		shutdown(s,SD_BOTH);
		close(s);
		return -1;
	}
	if(!GetResponse())
		return -1;
	return 1;
}
int main(int argc,char *argv[])
{
	char *host      = "202.108.252.140";  //smtp.tom.com
	char *username  = "****";
	char *password  = "****";
	char *m_From    = "****@****";
	char *m_To      = "****@****";
	char *m_date    = "2006-4-7,22:27";
	char *m_Subject = "the ip and mac address for ddns";
	char *m_data    = (char*)malloc(100);        char *ip = (char*)malloc(20);        if(argc < 1)        {            printf("agrv error\n");            free(m_data);            free(ip);        }        if(GetLocalAddress(ip) == -1)	{		printf("get lcoal ip fail\n");		free(ip);		return -1;	}	char *vmac = (char*)malloc(20);   	if(GetLocalMac(vmac) == -1)	{		printf("get local mac fail\n");		free(ip);		free(vmac);		return -1;	}	sprintf(m_data,"The IP Address :%s\nThe Mac Address:%s",ip,vmac);	//printf("%s\n",m_data);
	From      = (char*)malloc(40);//new char[40];
	To        = (char*)malloc(40);//new char[40];
	Date      = (char*)malloc(40);//new char[40];
	Subject   = (char*)malloc(40);//new char[40];
	Filename  = (char*)malloc(100);

	recv_data = (char*)malloc(512);
	userdes   = (char*)malloc(40);
	passdes   = (char*)malloc(40);
	port = 25;
	s    = INVALID_SOCKET;	
	if(!CreateSocket())
	{
		printf("socket create error\n");
		return -1;
	}	//printf("create the scoket\n");
	if(!ConnectHost(host))
	{
		printf("can not connect the host\n");
		return -1;
	}	//printf("connect the smtp host\n");
	if(!LogIn(username,password))
	{
		printf("login error\n");
		return -1;
	}	//printf("login\n");
	if(!SendMail(m_From,m_To,m_date,m_Subject,m_data))
	{
		printf("send mail error\n");
		return -1;
	}	//printf("send mail \n");
	if(!End())
	{
		printf("End error\n");
		return -1;
	}	//printf("send over\n");
	Destory();	return 0;
}


/*
int main(int argc,char *argv[])
{
	
	//char *host      = "smtp.tom.com";
	//char *username  = "hitliyanan";
	//char *password  = "830603";
	//char *m_From    = "hitliyanan@tom.com";
	//char *m_To      = "gudulyn@yahoo.com.cn";
	//char *m_date    = "2006-4-7,22:27";
	//char *m_Subject = "hello world";
	//char *m_data    = "It is a test";
	//void Init();


	if(argc < 9)
	{
		printf("Usage Error\n");
		return;
	}
	From      = (char*)malloc(40);//new char[40];
	To        = (char*)malloc(40);//new char[40];
	Date      = (char*)malloc(40);//new char[40];
	Subject   = (char*)malloc(40);//new char[40];
	Filename  = (char*)malloc(100);

	recv_data = (char*)malloc(512);
	userdes   = (char*)malloc(40);
	passdes   = (char*)malloc(40);
	port = 25;
	s    = INVALID_SOCKET;
	if(!CreateSocket())
	{
		printf("socket create error\n");
		return -1;
	}
	if(!ConnectHost(argv[1]))
	{
		printf("can not connect the host\n");
		return -1;
	}
	if(!LogIn(argv[2],argv[3]))
	{
		printf("login error\n");
		return -1;
	}
	if(!SendMail(argv[4],argv[5],argv[6],argv[7],argv[8]))
	{
		printf("send mail error\n");
		return -1;
	}
	if(!End())
	{
		printf("End error\n");
		return -1;
	}
	Destory();	return 0;
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -