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

📄 smtp.c

📁 在嵌入式linux下发送邮件的SMTP客户端程序。基于mips平台可直接使用
💻 C
📖 第 1 页 / 共 4 页
字号:
	}
	return TTRUE; 
} 

BOOL ProcedureCMD(int Type, char* buf)
{
	char	temp[3];	
	int		temp2 = 0;
	//开始处理从服务器接收到的数据 
	if(buf == NULL)
	{
		return TFALSE;
	}

	strncpy(temp, buf, 3); 
	temp2 = atoi(temp); 

	switch (Type) 
	{ 
	case CONNECTION_CHECK: 
		if (temp2 != 220) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 
		
	case HELLO_CHECK: 
		if (temp2 != 250) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 
	case MAIL_CHECK: 
		if (temp2 != 250) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 
	case RCPT_CHECK: 
		if (temp2 != 250) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 
	case DATA_START_CHECK: 
		if (temp2 != 354) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 
	case DATA_END_CHECK: 
		if (temp2 != 250) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 
	case QUIT_CHECK: 
		if (temp2 != 221) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 
	case DATA_CHECK: 
		if (temp2 != 354) 
		{ 
			strcpy(g_ErrorMessage, GetError(buf)); 
			return TFALSE; 
		} 
		break; 	
	}
	return TTRUE; 
}

BOOL ReadCommandResponse(int nExpectedCode)
{
	char*	pszOverFlowBuffer = NULL;
	char	sBuf[256];
	BOOL	bSuccess = TFALSE;
	memset(sBuf, 0, 256);
	bSuccess = ReadResponse(sBuf, 256, "\r\n", nExpectedCode, &pszOverFlowBuffer, 4096);
	if (pszOverFlowBuffer != NULL)
	{
		free(pszOverFlowBuffer);
		pszOverFlowBuffer = NULL;
	}
	
	return bSuccess;
}

BOOL ReadResponse(char* pszBuffer, int nInitialBufSize, char* pszTerminator, int nExpectedCode, char** ppszOverFlowBuffer, int nGrowBy)
{
	int			nTerminatorLen = 0;
	char*		pszRecvBuffer = NULL;
	int			nBufSize = 0;
	BOOL		bFoundTerminator = TFALSE;
	int			nReceived = 0;	
	time_t		strattime;
	time_t		endtime;
	//BOOL		bReadible = TFALSE;
	int			nBufRemaining = 0;
	int			nData = 0;
	char*		pszNewBuf = NULL;
	BOOL		bSuccess = TFALSE;
	char		sCode[4];
	int 		iRet = 0;

	
	//参数检测
	if((pszBuffer == NULL) || (pszTerminator == NULL)) 
	{
		return TFALSE;
	}
	
	//获取结束符的长度
	nTerminatorLen = strlen(pszTerminator);
	
	//接收获得的数据
	pszRecvBuffer = pszBuffer;
	nBufSize = nInitialBufSize;
	
	//循环获得响应知道遇到结束符或者超时	
	time( &strattime );	
	while (!bFoundTerminator)
	{
		//超时
		// printf("Begin do with time out  !\n");
		time( &endtime );
		if ((endtime - strattime) >=	g_dwTimeout)
		{
			printf("Revice Date time out and the g_dwTimeout is %d!\n", g_dwTimeout);
			pszRecvBuffer[nReceived] = '\0';			
			strcpy(g_sLastCommandResponse, pszRecvBuffer); 
			return TFALSE;
		}
		
		/*
		//检查socket是否可读
		if (!IsReadable(bReadible))
		{
			pszRecvBuffer[nReceived] = '\0';
			strcpy(g_sLastCommandResponse, pszRecvBuffer); 
			return TFALSE;
		}
		
		//没有数据接受到
		else if (bReadible == TFALSE) 
		{			
			Sleep(100); 
		}
		*/
		
		//从socket接收数据
		//Allows allow one space for the NULL terminator
		nBufRemaining = nBufSize-nReceived-1;
		if (nBufRemaining < 0)
		{
			nBufRemaining = 0;
		}
		//printf("Receive param :pszRecvBuffer: %s  nReceived: %d  nBufRemaining: %d !\n", pszRecvBuffer,nReceived,nBufRemaining);
		if(Receive(pszRecvBuffer+nReceived, nBufRemaining) == TFALSE)
		{
			//以空字符结束字符串
			if (pszRecvBuffer)
				pszBuffer[nReceived] = '\0';
			strcpy(g_sLastCommandResponse, pszRecvBuffer); //分离出最后一个响应
			return TFALSE; 
		}	
		else
		{	
			nData = strlen(pszRecvBuffer);			
			//重新设置超时起始时间
			if (nData > 0)
			{
				time( &strattime );
				//增加获得的数据
				nReceived += nData;							   
			}	
			
			//以空字符结束字符串			
			if (pszRecvBuffer != NULL)
			{
				pszRecvBuffer[nReceived] = '\0';
			}
			if (nBufRemaining-nData == 0) //检查是否还有空间
			{
				//申请新的缓冲区
				nBufSize += nGrowBy; //增加缓冲区
				pszNewBuf = (char*)malloc(nBufSize);
				//内存分配失败
				if(pszNewBuf == NULL)
				{
					return TFALSE;
				}
				
				//将原来的内容复制到新的缓冲区中,并用新的缓冲区接收数据
				if (pszRecvBuffer)
					strcpy(pszNewBuf, pszRecvBuffer);
				pszRecvBuffer = pszNewBuf;
				
				//删除原来缓冲区
				if (*ppszOverFlowBuffer)
				{
					free(ppszOverFlowBuffer);
					ppszOverFlowBuffer = NULL;
				}
				
				//将新的缓冲区内容存入溢出缓冲区
				*ppszOverFlowBuffer = pszNewBuf;        
			}
		}
		
		// 检查结束符是否被找到
		// 检查是否到了响应结束,否则提前停止循环读取数据,如果有可能会有多行响应		
		iRet = strncmp( &pszRecvBuffer[ nReceived - nTerminatorLen ], pszTerminator, nTerminatorLen );
		if(iRet == 0)
		{			
			bFoundTerminator = TTRUE;
		}
		else
		{			
			bFoundTerminator = TFALSE;
		}
		
	}
	
	//去掉结束符
	pszRecvBuffer[ nReceived - nTerminatorLen ] = '\0';
	
	//处理多行响应
	bSuccess = TFALSE;	
	do
	{
		//检查响应是否是错误码		
		memset(sCode, 0, 4);
		strncpy(sCode, pszRecvBuffer, 3 );
		sCode[3] = '\0';
		sscanf(sCode, "%d", &g_nLastCommandResponseCode );		
		if(g_nLastCommandResponseCode == nExpectedCode)
		{			
			bSuccess = TTRUE;
		}
		else
		{			
			bSuccess = TFALSE;
		}
		
		
		// 分离上一次响应
		strcpy(g_sLastCommandResponse, pszRecvBuffer);
		
		// 检查是否有多行响应
		pszRecvBuffer = strstr( pszRecvBuffer, pszTerminator );
		if (pszRecvBuffer)
		{
			// 跳过结束符
			pszRecvBuffer += nTerminatorLen;	
		}
		
	} while ( !bSuccess && pszRecvBuffer );	

	return bSuccess;
}



// 按照错误号准备错误信息 
char* GetError(char* Response) 
{ 
	char*	strRet = NULL;
	strRet = (char*)malloc(256);
	if(strRet == NULL)
	{
		return NULL;
	}
	
	if(find(Response, "211")) 
	{
		strcpy(strRet, "System status or system help reply"); 
		return strRet;
	}
	
	if(find(Response, "214")) 
	{
		strcpy(strRet, "Help Message"); 
		return strRet;
	}
	
	if(find(Response, "220")) 
	{
		strcpy(strRet, "Service is ready"); 
		return strRet;
	}
	
	if(find(Response, "221")) 
	{
		strcpy(strRet, "Service closing transmission channel"); 
		return strRet;
	}
	
	if(find(Response, "250")) 
	{
		strcpy(strRet, "Requested mail action okay, completed"); 
		return strRet;
	}
	
	if(find(Response, "251")) 
	{
		strcpy(strRet, "user not local: will forward to forward path");
		return strRet;  
	}
	
	if(find(Response, "354")) 
	{
		strcpy(strRet, "Start mail input; end with."); 
		return strRet;
	}
	
	strcpy(strRet, "No Error Number is matched with "); 
	strcat(strRet, Response);
	return strRet;
	
} 

//发送MAIL命令
BOOL Mail(SMTP struMail) 
{ 
	return MailCMD(struMail.m_strSendFrom); 
}


//设置附件的文件信息
void SetFile(SMTP* struMail, char* strFileName) 
{ 
	strcpy(struMail->m_strFile, strFileName); 
	
}

//获取邮件的源地址信息
char* GetSendFrom(SMTP struMail) 
{ 
	return struMail.m_strSendFrom; 
}

//设置邮件的源地址信息
void SetSendFrom(SMTP* struMail, char* strSendFrom) 
{ 
	strcpy(struMail->m_strSendFrom, strSendFrom); 
	
}

//获取邮件的目的址信息
char* GetSendTo(SMTP struMail) 
{ 
	return struMail.m_strSendTo; 
}

//设置邮件的目的址信息
void SetSendTo(SMTP* struMail, char* strSendTo) 
{ 
	strcpy(struMail->m_strSendTo, strSendTo); 
	
}


//设置邮件的SMPT服务器信息
void SetSMTPServer(SMTP* struMail, char* strSMTPServer) 
{ 
	strcpy(struMail->m_strSMTPServer, strSMTPServer); 
	
}


//设置用户的密码信息
void SetPWD(SMTP* struMail, char* strPWD) 
{ 
	strcpy(struMail->m_strPWD, strPWD); 
	
}


//设置用户的帐号信息
void SetUSERID(SMTP* struMail, char* strUSERID) 
{ 
	strcpy(struMail->m_strUSERID, strUSERID); 
	
}

//设置邮件的正文信息
void SetMailText(SMTP* struMail, char* strMailText) 
{ 
	strcpy(struMail->m_strMailText, strMailText); 
	
}


//设置邮件的标题信息
void SetMailSubject(SMTP* struMail, char* strMailSubject) 
{ 
	strcpy(struMail->m_strMailSubject, strMailSubject); 
	
}


//设置邮件的发送人信息
void SetSenderName(SMTP* struMail, char* strSenderName) 
{ 
	strcpy(struMail->m_strSenderName, strSenderName); 
	
}

//判断是否是带附件的邮件
void ISMIME(SMTP struMail )
{   
	if(strlen(struMail.m_strFile ) >0 )
	{	
		g_bMIME = TTRUE;			
	}
	else
	{
		g_bMIME = TFALSE;	
	}
	
}

//BOOL IsSameTime(char* strTime, int hour)

BOOL IsSameWeek(char* strWeek, int weekly)
{
	//printf("The value of strWeek is %s and the weekly is %d!\n", strWeek, weekly);
	switch (weekly) 
	{ 
	case 1: 					//星期一
		if (strcasecmp(strWeek, "Mon") == 0) 
		{ 			
			return TTRUE; 
		} 
		else
		{
			return TFALSE; 
		}
		
	case 2: 					//星期二
		if (strcasecmp(strWeek, "Tue") == 0) 
		{ 			
			return TTRUE; 
		} 
		else
		{
			return TFALSE; 
		}
		
	case 3: 					//星期三
		if (strcasecmp(strWeek, "Wed") == 0) 
		{ 			
			return TTRUE; 
		} 
		else
		{
			return TFALSE; 
		}
		
	case 4: 					//星期四
		if (strcasecmp(strWeek, "Thu") == 0) 
		{ 			
			return TTRUE; 
		} 
		else
		{
			return TFALSE; 
		}
		
	case 5: 					//星期五
		if (strcasecmp(strWeek, "Fri") == 0) 
		{ 			
			return TTRUE; 
		} 
		else
		{
			return TFALSE; 
		}
		
	case 6: 					//星期六
		if (strcasecmp(strWeek, "Sat") == 0) 
		{ 		
			return TTRUE; 
		} 
		else
		{
			return TFALSE; 
		}
		
	case 7: 					//星期日
		if (strcasecmp(strWeek, "Sun") == 0) 
		{ 			
			return TTRUE; 
		} 
	default:
		{
			return TFALSE; 			
		}
	}
}
//发送邮件信息
//sendmail [server] [user] [password] [to] [weekly] [time]*/
//输入参数说明:
//pServer:SMTP服务器, 格式:smtp.sina.com.cn
//pUsrID: SMTP服务器的用户ID
//pPWD: SMTP服务器的指定用户ID对应的密码;
//pTo:邮件的发送目的地的邮箱地址,如charlie.xiang@asokausa.com
//weekly:发送的周信息,如果是0,则表示每天发送,如果是1-7则表示对应的星期几发送;
//hour:发送邮件的具体时刻,如果是8则表示8点发送邮件;

BOOL sendmail(char* pServer, char* pUsrID, char* pPWD,char *pFrom,char* pTo, int weekly, int hour) 
{
	
	SMTP 			m_smtp; 
	//int				Rreqtime = 60*15;			
	//int				iTime = 0;
	time_t		long_time; 
	struct 		tm	*newtime;   
	char*			strWeek = NULL;	
	char*			strTime = NULL;		
	BOOL			bDay = TFALSE;
	BOOL			bSendMail = TFALSE;
	int				iHour = 0;
	char*			strTimeBuf = NULL;
	int				i;
	
	//初始化行速局
	Initialize(&m_smtp);

	//参数检测
	if((pServer==NULL)||(pUsrID==NULL)||(pPWD==NULL)||(pTo==NULL))
	{
			printf("invalid input parameter!\n");
			return TFALSE;
	}
	
	if((weekly<0)||(weekly>7))
	{
			printf("The value of  weekly is invalid!\n");
			return TFALSE;
	}
	
	if((hour<0)||(hour>24))
	{
			printf("The value of  hour is invalid!\n");
			return TFALSE;
	}
	
	if((pServer==NULL)||(pUsrID==NULL)||(pPWD==NULL)||(pTo==NULL))
	{
			printf("Invaid input parameter!\n");
			return TFALSE;
	}
	
	if(weekly == 0)
	{
		bDay = TTRUE;
	}
	else
	{
		bDay = TFALSE;
	}			
	
	//对数据进行初始化(SMTP服务器、FROM信息、TO信息、USER信息、PWD信息一定要设置,否则无法发送邮件)
	SetSMTPServer(&m_smtp, pServer);
	SetUSERID(&m_smtp, pUsrID);
	SetPWD(&m_smtp, pPWD);
	SetSendTo(&m_smtp, pTo);
	
	//设置邮件的缺省信息
	SetSendFrom(&m_smtp, pFrom);
	SetSenderName(&m_smtp, "Motorola");			
	SetMailSubject(&m_smtp, "Logs for MDU Gateway");
	SetMailText(&m_smtp, "Logs");     
	SetFile(&m_smtp, "/ifx/web/syslog.cat");	   //Linux 格式文件
     
	//检查邮件的信息是否合法
	if(!CheckMailInfo(m_smtp))
	{
		printf("The Info of MAIL is invalid!\n");
		return TFALSE;
		
	}
	
	while(1)
	{
		//根据设置的时间信息发送邮件
		time( &long_time );               
		newtime = localtime( &long_time ); 	
		strTimeBuf = asctime(newtime);	
		strWeek = substr(strTimeBuf,0, 3);								//星期信息 如:Tue
		strTime = substr(strTimeBuf, 11, 2);	 						//详细时间信息 只取出小时的信息

⌨️ 快捷键说明

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