📄 smtp.c
字号:
}
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 + -