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

📄 mailsend.c

📁 LINUX 平台下面 纯C的 短信和邮件发送程序
💻 C
字号:
#include "mailsend.h"


int sockfd;
int ret;
char *send_data;
char *recv_data;
char buffer[1024];

char CharSet[65]= 
{ 
		'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','+','/',
		'=' 
}; 


/*function name:base64encode
	this function is used for encoding the username passwd and mail context!
	arguments: 
		src, the string to encode
		base64code, the src string's base64code format 
		nstrlen, length of the src string
	return value: -1 error or 0 successful
*/
int base64encode(const char *src, char * b64code ,int nstrlen)
{
	
	int index=0;
	int i=0;
	int pad=0;
	char base64chsrc[1024]={'\0'};
	pad=base64char(src,base64chsrc,nstrlen);

	for (i=0;i<strlen(base64chsrc);i++)
	{
		index = (int) *(base64chsrc+i);
		*b64code++ = CharSet[index];
	}
	while(pad--)
	{
		*b64code++ = CharSet[64];
	}
	*b64code = '\0';
	return 0;
}


int base64char(const char *src, char * base64ch,int nstrlen)
{
	int i=0;
	int pad=0;
	char ch1=0,ch2=0;
	
	for (i=0;i<nstrlen;i++)
	{
		switch (i%3)
		{
		case 0:
			*base64ch++ = *(src+i)>>2;
			ch1 = *(src+i) & 0x03;
			break;
		case 1:
			ch2 = *(src+i) & 0x0f;
			*base64ch++ = *(src+i) >>4 | ch1 << 4;
			break;
		case 2:
			*base64ch++ = *(src+i) >> 6 | ch2 << 2 ;
			*base64ch++ = *(src+i) & 0x3f;
			break;
		default:
			break;
		}
		
	}
	if(nstrlen % 3 == 2)
	{
		*base64ch++ = ch2 <<2;
		pad++;
	}
	else if(nstrlen % 3 == 1)
	{
		*base64ch++ = ch1 <<4;
		pad +=2;
	}
	*base64ch = '\0';
	return pad;

}




/* Function name :connectHost
	This function is used for connect the remote SMTP server 
	with socket.
	arguments:smtp server addr as the string format.
	return value : the socket fd.
*/
int connectHost(const char *smtpaddr)
{
	struct sockaddr_in servaddr;
	struct hostent *pHostent;
	struct in_addr ** pptr;
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	if (sockfd<0)
	{
		fprintf(stderr,"Create socket error!\n");
		return -1;
	}
	bzero(&servaddr,sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(25);

	pHostent = gethostbyname(smtpaddr);              //Get the Mail Server 
	if(pHostent == NULL)
	{ 
		fprintf(stderr,"The Host Name is Invalid... \n"); 
		return -1;			
    } 
	pptr =(struct in_addr **)pHostent->h_addr_list;
	memcpy(&servaddr.sin_addr,*pptr,sizeof(struct in_addr));
	//connect the Mail server
	if (connect(sockfd,(struct sockaddr *)& servaddr,sizeof(servaddr)) < 0)	
	{
		fprintf(stderr,"Connect failed... \n"); 
		return -1;
	}
	
	if(getResponse() < 0) 
		return -1;
	return sockfd;	
}


/* Function name :getResponse
	This function is used for geting the Respone of  the remote SMTP server 
	arguments:void
	return value : if get right respone -1 else 0;
*/
int getResponse() 
{	
	memset(buffer,0,sizeof(buffer));
	ret = recv(sockfd,buffer,1024,0); 
	if(ret == SOCKET_ERROR) 
	{ 
		fprintf(stderr,"receive nothing\n"); 
		return -1; 
	} 
	buffer[ret]='\0'; 
	
	if(*buffer == '5') 
	{ 
		printf("the order is not support smtp host\n "); 
		return -1; 
	} 
	//printf("%s\n",buffer); 
	return 0; 
}

/* Function name :login
	This function is used for logining  the remote SMTP server 
	with your Email userID and password
	arguments:username,password with base64encode
	return value : if  right respone -1 else 0;
*/
int login(char *username,char *password)
{
	//printf("sockfd in login() %dusername %s\npassword %s\n",sockfd,username,password);
	char ch[100]; 
	if(username == "" || password == "") 
		return -1;
	
	send_data = "HELO server\r\n"; 
	//printf("%s\n",send_data);
	ret = send(sockfd,send_data,strlen(send_data),0); 
	if(ret == SOCKET_ERROR) 
	{ 
		return -1; 
	} 		
	if(getResponse() < 0) 
		return -1; 
	
	send_data = "AUTH LOGIN\r\n"; 
	//printf("%s\n",send_data);
	ret = send(sockfd,send_data,strlen(send_data),0); 
	if(ret == SOCKET_ERROR) 
	{ 
		return -1; 
	} 
	if(getResponse() < 0) 
		return -1; 
	sprintf(ch,"%s\r\n",username); 
	//printf("%s\n",ch);
	ret = send(sockfd,(char *)ch,strlen(ch),0); 
	if(ret == SOCKET_ERROR) 
	{ 
		return -1; 
	} 
	
	if(getResponse() < 0) 
		return -1; 
	
	sprintf(ch,"%s\r\n",password); 
	//printf("%s\n",ch);
	ret = send(sockfd,(char *)ch,strlen(ch),0); 
	if(ret == SOCKET_ERROR) 
	{ 
		return -1; 
	} 
	
	if(getResponse() < 0) 
		return -1; 
	
	return 0; 

}

/* Function name :sendmail
	This function is used for sending mail to  the remote SMTP server 
	arguments:
			from, mail form where?
			to, mail destination address
			cc, cc address
			subject,the mail subject
			context,the context of your mail
	return value : if  right respone -1 else 0;
*/
int sendmail(const char* from,const char * to,
			 const char * cc,const char * subject,
			 const char * context)
{
	char From[128];
	char To[128];
	char Cc[128];
	char Subject[512];
	char Context[6000]={0};
	
	
	if(from =="" ||to == ""||cc == ""||subject == ""||context == "")
	{
		fprintf(stderr,"arguments error!\n");
		return -1;
	}
	printf("Ready to send email ,Please standby!\n");
	/*MAIL FROM*/
	sprintf(From,"MAIL FROM: <%s>\r\n",from);
	if((ret= send(sockfd,From,strlen(From),0))== SOCKET_ERROR)
	{
		return -1;
	}
	if(getResponse() < 0)
		return -1;
	/*RCPT TO*/
	sprintf(To,"RCPT TO: <%s>\r\n",to);
	if((ret= send(sockfd,To,strlen(To),0))== SOCKET_ERROR)
	{
		return -1;
	}
	if(getResponse() < 0)
		return -1;
	
	/*DATA*/	
	send_data = "DATA\r\n";
	if((ret= send(sockfd,send_data,strlen(send_data),0))== SOCKET_ERROR)
	{
		return -1;
	}
	if(getResponse() < 0)
		return -1;
	
	/*From :*/
	memset(From,0,sizeof(From));	
	sprintf(From,"From: %s\r\n",from); 
	strcat(Context,From);

	/*To :*/
	memset(To,0,sizeof(To));
	sprintf(To,"To: %s\r\n",to); 
	strcat(Context,To);
	
	/*Cc :*/
	memset(Cc,0,sizeof(Cc));
	sprintf(Cc,"Cc: %s\r\n",cc);

	strcat(Context,Cc);
	/*Subject :*/
	memset(Subject,0,sizeof(Subject));
	sprintf(Subject,"Subject: %s\r\n",subject); 
	strcat(Context,Subject);
	/*"\r\n\r\n"*/
	strcat(Context,"\r\n\r\n");
	strcat(Context,context);
	/*  .  */
	strcat(Context,"\r\n.\r\n");
	if((ret= send(sockfd,Context,strlen(Context),0))== SOCKET_ERROR)
	{

		return -1;
	}
	if(getResponse() < 0)
		return -1;

	/*QUIT*/
	
	if((ret= send(sockfd,"QUIT\r\n",strlen("QUIT\r\n"),0))== SOCKET_ERROR)
	{
	
		return -1;
	}
	if(getResponse() < 0)
		return -1;
	
	return 0;
}



int mailinit(const char* server,const char * name,const char * passwd)
{

	char name64[180]={0};
	char passwd64[180]={0};
	base64encode(name,name64,strlen(name));
	base64encode(passwd,passwd64,strlen(passwd));
	if (connectHost(server)<0)
	{
		fprintf(stderr,"Can Not LOGIN !\n");
		return -1;
	}
	if(login(name64,passwd64) < 0)
	{
		fprintf(stderr,"Can Not LOGIN !\n");
		return -1;
	}
	return 0; 

}

int send_email(const char* server, const char * name, const char * passwd,
			   const char* from, const char * to, const char * cc,
				const char * subject, const char * context)
{
	
	if((mailinit(server,name,passwd))<0 )
	{
		fprintf(stderr,"Mail init failed!\n");
		close(sockfd);
		return -1;
	}
	
	if((sendmail(from,to,cc,subject,context))<0 )
	{
		fprintf(stderr,"Mail send failed!\n");
		close(sockfd);
		return -1;
	}

	printf("Mail Send Complete!\n");
	savelog("/var/local/mail_warning.log",to,context);
	close(sockfd);

	return 0;

}

⌨️ 快捷键说明

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