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

📄 email.c

📁 嵌入式linux下的Email客户端
💻 C
字号:
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h> #include <string.h>#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>#define PORT 25 //smtp port#define SIZE 41984 //define mail commands#define EHLO 0#define AUTH 1#define USER 2#define PASS 3#define MAIL 4#define RCPT 5#define DATA 6#define CONT 7#define QUIT 8void base64enc(const char *,char *);int email(){int sockfd;struct sockaddr_in server_addr;struct hostent *server_ip;int numbytes=0,i=0;char username[20]="";//mail usernamechar passwd[20]="";//mail passwd//buff store data by recv(),char buff[512]="",tmp[4]="";char * p;char alarmcontext[SIZE]="";char ch;int ret=0;//function returnFILE *f_open,*f_write, *f_jpg;char *msg[9]={""};char *n_return[9]={""}; //return numbermsg[EHLO]="ehlo smtp.163.com\n";msg[AUTH]="auth login\n";base64enc("alarm_01",username);strcat(username,"\n");msg[USER]=username;base64enc("123456",passwd);strcat(passwd,"\n");msg[PASS]=passwd;msg[MAIL]="mail from:<alarm_01@163.com>\n";msg[RCPT]="rcpt to:<alarm_02@163.com>\n";msg[DATA]="data\n";msg[QUIT]="quit\n";n_return[EHLO]="250";n_return[AUTH]="334";n_return[USER]="334";n_return[PASS]="235";n_return[MAIL]="250";n_return[RCPT]="250";n_return[DATA]="354";n_return[CONT]="250";/*jpegfiel en64 to 123.txt*/en64_out("123.jpg", "456.txt");/*-----------------------------read from 123.txt, add it to msg[CONT]-----------------------------*/if((f_open=fopen("123.txt","r")) ==NULL){	perror("fopen error");	return(-1);}p=alarmcontext;while ((ch = getc(f_open)) != EOF)       	{		*p=ch;		p++;	}if((f_jpg=fopen("456.txt","r")) ==NULL){	perror("fopen error");	return(-1);}while ((ch = getc(f_jpg)) != EOF)       	{		*p=ch;		p++;	}		*p=0;strncat(alarmcontext,"\n.\n",3);//cat "\n.\n" to data msg[CONT]=alarmcontext; //printf("msg[CONT]:\n%s\n", msg[CONT]);fclose(f_jpg);fclose(f_open);/*------------------------------connect server,and send command------------------------------*///because the host connect to internet by dail,//so,it is possiabe that host have not connected when it start//then we sleep 3 seconds,and try again until the host connect to internet//we know the connection status by gethostbyname(),but this way is not always correctwhile((server_ip=gethostbyname("smtp.163.com"))==NULL){herror("gethostbyname error");sleep(3);}//create a socketif((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){	perror("socket error");	return(-1);}//address informationserver_addr.sin_family=AF_INET;//host byte orderserver_addr.sin_port=htons(PORT);//short,network byte orderserver_addr.sin_addr=*((struct in_addr *)server_ip->h_addr);//server ipbzero(&(server_addr.sin_zero),8);//zero the rest of struct//connect serverif(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1){	perror("connect error");	return(-1);}//if connect success,server return "220"if((numbytes=recv(sockfd,buff,SIZE,0))==-1){	perror("recv error");	return(-1);} //clean tmpfor(i=0;i<4;i++)	tmp[i]='\0';strncpy(tmp,buff,3);if(strcmp(tmp,"220")!=0)	return (-1);//send msgs. if any step has a mistake,the "while" will be breaked,then send "quit" to end connection printf("begin send msgs\n");i=EHLO;while(i<QUIT){	if((numbytes=send(sockfd, msg[i], strlen(msg[i]), 0))==-1)	{		perror("send error");		break;	}	//sleep(1);we dont have to use it,because recv() can choke itself until it received data	if((numbytes=recv(sockfd,buff,SIZE,0)) == -1)	{		perror("recv error");		break;	} 	strncpy(tmp,buff,3);//printf("command:%s\n",msg);//printf("return buff:%s\n",buff);//printf("should return:%s\n",n_return);if(strcmp(tmp, n_return[i])==0) 	i++;else	break;}//send quit to end mail connectionif((numbytes=send(sockfd,msg[QUIT],strlen(msg[QUIT]),0))==-1){	perror("send error");	return(-1);}close(sockfd);return (0);}/*-------------------------base64 encode function-------------------------*/void base64enc(const char *instr, char *outstr){     char *table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";    int   instr_len=0,i=0,j=0,pad=0;     unsigned char buf1[4]="", buf2[4]="";        instr_len=strlen(instr);        pad=instr_len%3;        for(i=0; i<instr_len; i +=3)         {          if(i == instr_len-pad)                  strncpy(buf1,&instr[i],pad);            else               strncpy(buf1,&instr[i],3);              buf2[0] = buf1[0] >> 2;             buf2[1] = ((buf1[0] & 0x03) << 4) | (buf1[1] >> 4);             buf2[2] = ((buf1[1] & 0x0f) << 2) | (buf1[2] >> 6);             buf2[3] = buf1[2] & 0x3f;             for(j=0;j<4;j++)                   buf2[j]=table[buf2[j]];                        if(i==instr_len-pad)               for(j=3;j>pad;j--)                     buf2[j]='=';       	strncat(outstr, buf2, 4);      }   }  

⌨️ 快捷键说明

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