- 论坛徽章:
- 0
|
- /***************************************************
- * mail sender (1.0)
- * Author:wangdeju 2005-11
- ****************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #define SMTPSERVPORT 25
- #define MAXDATASIZE 1024
- #define MAXMAILSIZE 4096000
- char *blank="\r\n";
- char *blank2=">\r\n";
- char *blank3="\r\n\r\n";
- char *blank4=".\r\n";
- char *blank5=">\r\n\r\n";
- int sockfd;
- /*base64 encoding*/
- int base64(char *s,char *d)
- {
- char CharSet[64]={
- 'A','B','C','D','E','F','G','H',
- 'I','J','K','L','M','N','O','P',
- 'Q','R','S','T','U','V','W','X',
- 'Y','Z','a','b','c','d','e','f',
- 'g','h','i','j','k','l','m','n',
- 'o','p','q','r','s','t','u','v',
- 'w','x','y','z','0','1','2','3',
- '4','5','6','7','8','9','+','/'};
- unsigned char In[3];
- unsigned char Out[4];
- int cnt=0;
- if(!s||!d) return 0;
- for(;*s!=0;)
- {
- if(cnt+4>76)
- {
- *d++='\n';
- cnt=0;
- }
- if(strlen(s)>=3)
- {
- In[0]=*s;
- In[1]=*(s+1);
- In[2]=*(s+2);
- Out[0]=In[0]>>2;
- Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
- Out[2]=(In[1]&0x0f)<<2|(In[2]&0xc0)>>6;
- Out[3]=In[2]&0x3f;
- *d=CharSet[Out[0]];
- *(d+1)=CharSet[Out[1]];
- *(d+2)=CharSet[Out[2]];
- *(d+3)=CharSet[Out[3]];
- s+=3;
- d+=4;
- }
- else if(strlen(s)==1)
- {
- In[0]=*s;
- Out[0]=In[0]>>2;
- Out[1]=(In[0]&0x03)<<4|0;
- *d=CharSet[Out[0]];
- *(d+1)=CharSet[Out[1]];
- *(d+2)='=';
- *(d+3)='=';
- s+=1;
- d+=4;
- }
- else if(strlen(s)==2)
- {
- In[0]=*s;
- In[1]=*(s+1);
- Out[0]=In[0]>>2;
- Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
- Out[2]=(In[1]&0x0f)<<2|0;
- *d=CharSet[Out[0]];
- *(d+1)=CharSet[Out[1]];
- *(d+2)=CharSet[Out[2]];
- *(d+3)='=';
- s+=2;
- d+=4;
- }
- cnt+=4;
- }
- *d='\0';
- return 1;
- }
- /*print the usage*/
- int usage(char *proName)
- {
- printf("usage:%s smtpserver user passwd mailfrom rcptto subject sendfile flag[0/1]\n",proName);
- printf(" sendfile is the file contant the mail body\n");
- printf(" flag 1:MIME Support 0:Not\n");
- printf(" author wangdeju mail:wanderjeep@sohu.com \n");
- return 1;
- }
- /* chech The Status through the Message receive from Smtp Server */
- int chechSendEchoStatus(char *echoStatus)
- {
- char c;
- int i;
- c=*echoStatus;
- i=(int)c;
- switch (i)
- { case 50:
- return 1;
- break;
- case 51:
- return 1;
- break;
- case 53:
- return 0;
- break;
- default:
- return 0;
- }
- }
- /*send mail procotol */
- int sendMail(int d_sockfd,char *d_uid,char *d_pass,char *d_from,char *d_recp,char *d_data)
- {
- int iLength;
- char *buf;
- char *myd_pass,*myd_uid;
- char *mailFrom,*recpTo;
- buf=(char *)malloc(MAXDATASIZE);
- if(buf==NULL)
- return 1000;
- mailFrom=(char *)malloc(strlen(d_from)+strlen("MAIL FROM:<")+strlen(blank2));
- if(mailFrom==NULL)
- return 1000;
- recpTo=(char *)malloc(strlen(d_recp)+strlen("RCPT TO:<")+strlen(blank2));
- if(recpTo==NULL)
- return 1000;
- strcpy(mailFrom,"MAIL FROM:<");
- strcpy(mailFrom+strlen("MAIL FROM:<"),d_from);
- strcpy(mailFrom+strlen("MAIL FROM:<")+strlen(d_from),blank2);
- recpTo=strcpy(recpTo,"RCPT TO:<");
- strcpy(recpTo+strlen("RCPT TO:<"),d_recp);
- strcpy(recpTo+strlen("RCPT TO:<")+strlen(d_recp),blank2);
-
- myd_uid=(char *)malloc(strlen(d_uid)+strlen(blank));
- if(myd_uid==NULL)
- return 1000;
- myd_pass=(char *)malloc(strlen(d_pass)+strlen(blank));
- if(myd_pass==NULL)
- return 1000;
- strcpy(myd_uid,d_uid);
- strcpy(myd_uid+strlen(d_uid),blank);
- strcpy(myd_pass,d_pass);
- strcpy(myd_pass+strlen(d_pass),blank);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("------------LOGIN------------------\n");
- printf("received: %s \n",buf);
-
- send(d_sockfd,"HELO SMTP\r\n",strlen("HELO SMTP\r\n"),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("------------HELO SENT------------------\n");
- printf("received: %s \n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1200;
-
- send(d_sockfd,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("-------------AUTH LOGIN SENT--------------------------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1201;
-
- send(d_sockfd,myd_uid,strlen(myd_uid),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("--------------------BASE64 UID SENT--------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1202;
- send(d_sockfd,myd_pass,strlen(myd_pass),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("-------------------BASE64 PASS SENT----------------------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1203;
-
- send(d_sockfd,mailFrom,strlen(mailFrom),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("------------------MAIL FROM SENT----------------------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1204;
- send(d_sockfd,recpTo,strlen(recpTo),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("--------------------RCPT TO SENT----------------------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1205;
- send(d_sockfd,"DATA\r\n",strlen("DATA\r\n"),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("--------------------DATA SENT--------------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1206;
-
- send(d_sockfd,d_data,strlen(d_data),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("------------------DATA BODY SENT--------------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1207;
-
- send(d_sockfd,"QUIT\r\n",strlen("QUIT\r\n"),0);
- iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
- printf("---------------QUIT------------\n");
- printf("received: %s\n",buf);
- if(chechSendEchoStatus(buf)!=1)
- return 1208;
- free(buf);
- free(myd_uid);
- free(myd_pass);
- free(mailFrom);
- free(recpTo);
- return 1;
- }
- /*create mail head and body and support for MIME*/
- int createMailInfo(char *fileName,char *mailDataInfo,char *subject,char *mailFrom,char *to,int flag)
- {
- FILE *fp;
- char c;
- int readcount;
-
- readcount=0;
-
- fp=fopen(fileName,"r");
- if(fp==NULL)
- return 1001;
- /*check if memory overflow ;think the other protocol char size is 1024*/
- if(strlen(subject)+strlen(mailFrom)+strlen(to)+1024>MAXMAILSIZE)
- return 1300;
- /*MAIL HEAD */
- strcpy(mailDataInfo,"Subject:");
- readcount=readcount+strlen("Subject:");
- strcpy(mailDataInfo+readcount,subject);
- readcount=readcount+strlen(subject);
- strcpy(mailDataInfo+readcount,blank);
- readcount=readcount+strlen(blank);
- /* MIME SUPPORT */
- if(flag==1) {
- strcpy(mailDataInfo+readcount,"MIME-Version: 1.0\r\nContent-Type: text/html\r\n");
- readcount=readcount+strlen("MIME-Version: 1.0\r\nContent-Type: text/html\r\n");
- }
- strcpy(mailDataInfo+readcount,"From:<");
- readcount=readcount+strlen("From:<");
- strcpy(mailDataInfo+readcount,mailFrom);
- readcount=readcount+strlen(mailFrom);
- strcpy(mailDataInfo+readcount,blank2);
- readcount=readcount+strlen(blank2);
- strcpy(mailDataInfo+readcount,"To:<");
- readcount=readcount+strlen("To:<");
- strcpy(mailDataInfo+readcount,to);
- readcount=readcount+strlen(to);
- strcpy(mailDataInfo+readcount,blank5);
- readcount=readcount+strlen(blank5);
- /*MAIL BODY and avoid the memory overflow*/
- while((c=fgetc(fp))!=EOF && readcount<MAXMAILSIZE-6) {
- strcpy(mailDataInfo+readcount,&c);
- readcount++;
- }
- strcpy(mailDataInfo+readcount,blank4);
- readcount=readcount+strlen(blank4);
- strcpy(mailDataInfo+readcount,"\0");
- fclose(fp);
-
- return 1;
- }
- /*connetct to smtp server*/
- int connectToServer(char *hostName)
- {
- struct hostent *host;
- struct sockaddr_in serv_addr;
- if((host=gethostbyname(hostName))==NULL)
- return 1011;
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- return 1012;
-
- serv_addr.sin_family=AF_INET;
- serv_addr.sin_port=htons(SMTPSERVPORT);
- serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
- bzero(&(serv_addr.sin_zero),8);
- if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
- return 1013;
-
- return 1;
- }
- /*translate the error num to message and print it*/
- void showErrorMsg(int i)
- {
- switch(i) {
- case 1000:
- printf("Can not alloc memory\n");
- break;
- case 1001:
- printf("Can not Open file\n");
- break;
- case 1011:
- printf("Get host by name error\n");
- break;
- case 1012:
- printf("Create socket error\n");
- break;
- case 1013:
- printf("Connect to smtp server error\n");
- break;
- case 1021:
- printf("Read conf file smtp.conf\n");
- break;
- case 1200:
- printf("Send HELO Error\n");
- break;
- case 1201:
- printf("Send AUTH LOGIN Error\n");
- break;
- case 1202:
- printf("Send UID Error\n");
- break;
- case 1203:
- printf("Send PASS Error\n");
- break;
- case 1204:
- printf("Send MAIL FROM Error\n");
- break;
- case 1205:
- printf("Send RCPT TO Error\n");
- break;
- case 1206:
- printf("Send DATA Error\n");
- break;
- case 1207:
- printf("Send DATA BODY Error\n");
- break;
- case 1208:
- printf("Send QUIT\n");
- break;
- case 1300:
- printf("To avoid memory overflow ,program exit\n");
- break;
- default:
- printf("Error create!\n");
- }
- }
- /* main program */
- int main(int argc, char *argv[])
- {
- char *s_uid,*d_uid,*s_pass,*d_pass;
- char *mailData;
- int funResult;
- if(argc<9) {
- usage(argv[0]);
- return 0;
- }
- mailData=(char *)malloc(MAXMAILSIZE);
- if(mailData==NULL) {
- showErrorMsg(1000);
- return 0;
- }
- s_uid=(char *)malloc(strlen(argv[2]));
- if(s_uid==NULL) {
- showErrorMsg(1000);
- return 0;
- }
- d_uid=(char *)malloc(strlen(argv[2])*2);
- if(d_uid==NULL) {
- showErrorMsg(1000);
- return 0;
- }
- strcpy(s_uid,argv[2]);
- base64(s_uid,d_uid);
- s_pass=(char *)malloc(strlen(argv[3]));
- if(s_pass==NULL) {
- showErrorMsg(1000);
- return 0;
- }
- d_pass=(char *)malloc(strlen(argv[3])*2);
- if(d_pass==NULL) {
- showErrorMsg(1000);
- return 0;
- }
- strcpy(s_pass,argv[3]);
- base64(s_pass,d_pass);
- funResult=connectToServer(argv[1]);
- if(funResult!=1) {
- showErrorMsg(funResult);
- return 0;
- }
- funResult=createMailInfo(argv[7],mailData,argv[6],argv[4],argv[5],atoi(argv[8]));
- if(funResult!=1) {
- showErrorMsg(funResult);
- return 0;
- }
- // printf("%s\n",mailData);
- // printf("uid is:%sand pass is:%s\n",d_uid,d_pass);
- funResult=sendMail(sockfd,d_uid,d_pass,argv[4],argv[5],mailData);
- if(funResult!=1) {
- showErrorMsg(funResult);
- return 0;
- }
-
- close(sockfd);
- free(s_uid);
- free(d_uid);
- free(s_pass);
- free(d_pass);
- free(mailData);
- }
复制代码
[ 本帖最后由 mq110 于 2007-3-5 16:48 编辑 ] |
|