?? smtp.c
字號:
}
return TTRUE;
}
BOOL ProcedureCMD(int Type, char* buf)
{
char temp[3];
int temp2 = 0;
//開始處理從服務(wù)器接收到的數(shù)據(jù)
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;
//參數(shù)檢測
if((pszBuffer == NULL) || (pszTerminator == NULL))
{
return TFALSE;
}
//獲取結(jié)束符的長度
nTerminatorLen = strlen(pszTerminator);
//接收獲得的數(shù)據(jù)
pszRecvBuffer = pszBuffer;
nBufSize = nInitialBufSize;
//循環(huán)獲得響應(yīng)知道遇到結(jié)束符或者超時
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;
}
//沒有數(shù)據(jù)接受到
else if (bReadible == TFALSE)
{
Sleep(100);
}
*/
//從socket接收數(shù)據(jù)
//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)
{
//以空字符結(jié)束字符串
if (pszRecvBuffer)
pszBuffer[nReceived] = '\0';
strcpy(g_sLastCommandResponse, pszRecvBuffer); //分離出最后一個響應(yīng)
return TFALSE;
}
else
{
nData = strlen(pszRecvBuffer);
//重新設(shè)置超時起始時間
if (nData > 0)
{
time( &strattime );
//增加獲得的數(shù)據(jù)
nReceived += nData;
}
//以空字符結(jié)束字符串
if (pszRecvBuffer != NULL)
{
pszRecvBuffer[nReceived] = '\0';
}
if (nBufRemaining-nData == 0) //檢查是否還有空間
{
//申請新的緩沖區(qū)
nBufSize += nGrowBy; //增加緩沖區(qū)
pszNewBuf = (char*)malloc(nBufSize);
//內(nèi)存分配失敗
if(pszNewBuf == NULL)
{
return TFALSE;
}
//將原來的內(nèi)容復(fù)制到新的緩沖區(qū)中,并用新的緩沖區(qū)接收數(shù)據(jù)
if (pszRecvBuffer)
strcpy(pszNewBuf, pszRecvBuffer);
pszRecvBuffer = pszNewBuf;
//刪除原來緩沖區(qū)
if (*ppszOverFlowBuffer)
{
free(ppszOverFlowBuffer);
ppszOverFlowBuffer = NULL;
}
//將新的緩沖區(qū)內(nèi)容存入溢出緩沖區(qū)
*ppszOverFlowBuffer = pszNewBuf;
}
}
// 檢查結(jié)束符是否被找到
// 檢查是否到了響應(yīng)結(jié)束,否則提前停止循環(huán)讀取數(shù)據(jù),如果有可能會有多行響應(yīng)
iRet = strncmp( &pszRecvBuffer[ nReceived - nTerminatorLen ], pszTerminator, nTerminatorLen );
if(iRet == 0)
{
bFoundTerminator = TTRUE;
}
else
{
bFoundTerminator = TFALSE;
}
}
//去掉結(jié)束符
pszRecvBuffer[ nReceived - nTerminatorLen ] = '\0';
//處理多行響應(yīng)
bSuccess = TFALSE;
do
{
//檢查響應(yīng)是否是錯誤碼
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;
}
// 分離上一次響應(yīng)
strcpy(g_sLastCommandResponse, pszRecvBuffer);
// 檢查是否有多行響應(yīng)
pszRecvBuffer = strstr( pszRecvBuffer, pszTerminator );
if (pszRecvBuffer)
{
// 跳過結(jié)束符
pszRecvBuffer += nTerminatorLen;
}
} while ( !bSuccess && pszRecvBuffer );
return bSuccess;
}
// 按照錯誤號準(zhǔn)備錯誤信息
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;
}
//發(fā)送MAIL命令
BOOL Mail(SMTP struMail)
{
return MailCMD(struMail.m_strSendFrom);
}
//設(shè)置附件的文件信息
void SetFile(SMTP* struMail, char* strFileName)
{
strcpy(struMail->m_strFile, strFileName);
}
//獲取郵件的源地址信息
char* GetSendFrom(SMTP struMail)
{
return struMail.m_strSendFrom;
}
//設(shè)置郵件的源地址信息
void SetSendFrom(SMTP* struMail, char* strSendFrom)
{
strcpy(struMail->m_strSendFrom, strSendFrom);
}
//獲取郵件的目的址信息
char* GetSendTo(SMTP struMail)
{
return struMail.m_strSendTo;
}
//設(shè)置郵件的目的址信息
void SetSendTo(SMTP* struMail, char* strSendTo)
{
strcpy(struMail->m_strSendTo, strSendTo);
}
//設(shè)置郵件的SMPT服務(wù)器信息
void SetSMTPServer(SMTP* struMail, char* strSMTPServer)
{
strcpy(struMail->m_strSMTPServer, strSMTPServer);
}
//設(shè)置用戶的密碼信息
void SetPWD(SMTP* struMail, char* strPWD)
{
strcpy(struMail->m_strPWD, strPWD);
}
//設(shè)置用戶的帳號信息
void SetUSERID(SMTP* struMail, char* strUSERID)
{
strcpy(struMail->m_strUSERID, strUSERID);
}
//設(shè)置郵件的正文信息
void SetMailText(SMTP* struMail, char* strMailText)
{
strcpy(struMail->m_strMailText, strMailText);
}
//設(shè)置郵件的標(biāo)題信息
void SetMailSubject(SMTP* struMail, char* strMailSubject)
{
strcpy(struMail->m_strMailSubject, strMailSubject);
}
//設(shè)置郵件的發(fā)送人信息
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;
}
}
}
//發(fā)送郵件信息
//sendmail [server] [user] [password] [to] [weekly] [time]*/
//輸入?yún)?shù)說明:
//pServer:SMTP服務(wù)器, 格式:smtp.sina.com.cn
//pUsrID: SMTP服務(wù)器的用戶ID
//pPWD: SMTP服務(wù)器的指定用戶ID對應(yīng)的密碼;
//pTo:郵件的發(fā)送目的地的郵箱地址,如charlie.xiang@asokausa.com
//weekly:發(fā)送的周信息,如果是0,則表示每天發(fā)送,如果是1-7則表示對應(yīng)的星期幾發(fā)送;
//hour:發(fā)送郵件的具體時刻,如果是8則表示8點(diǎn)發(fā)送郵件;
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);
//參數(shù)檢測
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;
}
//對數(shù)據(jù)進(jìn)行初始化(SMTP服務(wù)器、FROM信息、TO信息、USER信息、PWD信息一定要設(shè)置,否則無法發(fā)送郵件)
SetSMTPServer(&m_smtp, pServer);
SetUSERID(&m_smtp, pUsrID);
SetPWD(&m_smtp, pPWD);
SetSendTo(&m_smtp, pTo);
//設(shè)置郵件的缺省信息
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)
{
//根據(jù)設(shè)置的時間信息發(fā)送郵件
time( &long_time );
newtime = localtime( &long_time );
strTimeBuf = asctime(newtime);
strWeek = substr(strTimeBuf,0, 3); //星期信息 如:Tue
strTime = substr(strTimeBuf, 11, 2); //詳細(xì)時間信息 只取出小時的信息
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -