📄 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 + -