?? smtp.c
字號:
iHour = atoi(strTime);
//如果是指定星期幾發(fā)送,則需要匹配星期和時間信息, 如果需要每天發(fā)送,只需要匹配時間信息
if((IsSameWeek(strWeek, weekly) == TTRUE)||(bDay == TTRUE))
{
//匹配時間信息
if(iHour == hour)
{
//需要重發(fā)郵件5次,確保郵件發(fā)送成功;
for(i=0; i<5; i++)
{
if(SendMailInfo(m_smtp) == TFALSE)
{
printf("Send mail fail and this is %d times!\n", i+1);
}
else
{
bSendMail = TTRUE;
break;
}
}
}
}
//如果發(fā)送郵件成功,則繼續(xù)等待最小一個小時+15分鐘
if(bSendMail == TTRUE)
{
sleep(60*60 + 60*15);
bSendMail = TFALSE;
}
//沒有郵件發(fā)送,則缺省等待2分鐘
else
{
sleep(60*2);
}
}
}
//發(fā)送郵件信息
BOOL SendMailInfo(SMTP struMail)
{
//創(chuàng)建套接字
Create();
//連接SMTP服務(wù)器
if(!ConnectSMTP(struMail))
{
printf("Connect fail!\n");
return TFALSE;
}
//發(fā)送MAIL命令
if(!Mail(struMail))
{
printf("Mail fail!\n");
return TFALSE;
}
//發(fā)送TO命令
if(!SetTo(struMail))
{
printf("SetTo fail!\n");
return TFALSE;
}
//發(fā)送DATA命令
if(!Data(struMail))
{
printf("Data fail!\n");
return TFALSE;
}
sleep(1);
//發(fā)送QUIT命令
if(!Disconnect())
{
printf("Disconnect fail!\n");
return TFALSE;
}
//關(guān)閉sokcet通訊連接
CloseSocket();
return TTRUE;
}
//檢查郵件信息的合法性
BOOL CheckMailInfo(SMTP struMail)
{
BOOL bRet = TTRUE;
//檢查SMTP服務(wù)器的信息
if(strlen(struMail.m_strSMTPServer) <= 0)
{
printf("The Info of SMTP Server is invalid!\n");
return TFALSE;
}
//檢查FROM的信息
if(strlen(struMail.m_strSendFrom ) <= 0)
{
printf("The Info of From is invalid!\n");
return TFALSE;
}
//檢查用戶帳號信息
if(strlen(struMail.m_strUSERID ) <= 0)
{
printf("The Info of USERID is invalid!\n");
return TFALSE;
}
//檢查密碼信息
if(strlen(struMail.m_strPWD) <= 0)
{
printf("The Info of PWD is invalid!\n");
return TFALSE;
}
//檢查TO的信息
if(strlen(struMail.m_strSendTo) <= 0)
{
printf("The Info of TO is invalid!\n");
return TFALSE;
}
return bRet;
}
//對指定的字符串進行BASE64編碼
void EnCodeString(char* strSoure,char* strEnCode)
{
char* pszBody = NULL;
int dwSize = 0;
int nBodySize = 0;
char* pszEncoded = NULL;
int nEncodedSize = 0;
int nInPos = 0;
int nOutPos = 0;
int nThisLineSize = 0;
//編碼
Base64Coder Coder;
dwSize = strlen(strSoure);
EncodeBase(&Coder, (const unsigned char *)strSoure, dwSize);
//形成編碼后的發(fā)送內(nèi)容
pszEncoded = EncodedMessage(Coder);
nEncodedSize = EncodedMessageSize(Coder);
nBodySize = nEncodedSize + (((nEncodedSize/76)+1)*2) + 1;
pszBody = (char*)malloc(nBodySize);
//檢查分配內(nèi)存是否成功
if(pszBody == NULL)
{
return;
}
memset(pszBody, 0, nBodySize);
--nBodySize;
while (nInPos < nEncodedSize)
{
nThisLineSize = min(nEncodedSize - nInPos, SMTP_MAXLINE);
memcpy(&pszBody[nOutPos], &pszEncoded[nInPos], nThisLineSize);
nOutPos += nThisLineSize;
memcpy(&pszBody[nOutPos], "\r\n", 2);
nOutPos += 2;
nInPos += nThisLineSize;
}
//以空字符串結(jié)束
pszBody[nOutPos] = '\0';
strcpy(strEnCode, pszBody);
if(pszBody != NULL)
{
free(pszBody);
pszBody = NULL;
}
}
//根據(jù)Quoted printable編碼規(guī)則對數(shù)據(jù)進行編碼處理
void QuotedPrintableEncode(char* sText, char* strEncode)
{
int i = 0;
char* sTemp = NULL;
char* sOut = NULL;
int nStartLine = 0;
int nLen = 0;
int nSize = 0;
unsigned char c;
BOOL bInWord = TTRUE;
nSize = strlen(sText);
sTemp = (char*)malloc(1024+nSize);
for (i=0; i<nSize; i++)
{
c = (unsigned char) sText[i];
//對字符進行編碼處理
if (((c >= 33) && (c <= 60)) || ((c >= 62) && (c <= 126)) || (c == '\r') || (c == '\n') || (c == '\t') || (c == ' '))
{
//sTemp += char(c);
strcat(sTemp, (char *)c);
}
else
{
strcat(sTemp, "=");
strcat(sTemp, (const char *)(HexDigit((c & 0xF0) >> 4)));
strcat(sTemp, (const char *)(HexDigit(c & 0x0F)));
}
}
//插入分割信息
i=0;
nStartLine = 0;
nLen = strlen(sTemp);
sOut = (char*)malloc(1024+nLen);
for (i=0; i<nLen; i++)
{
c = (unsigned char) sTemp[i];
if (c == '\n' || c == '\r' || i == (nLen-1))
{
strcat(sOut, substr(sTemp, nStartLine, i-nStartLine+1));
nStartLine = i+1;
continue;
}
if ((i - nStartLine) > SMTP_MAXLINE)
{
bInWord = TTRUE;
while (bInWord)
{
bInWord = (BOOL)(!isspace(c) && sTemp[i-2] != '=');
if (bInWord)
{
--i;
c = (unsigned char) sTemp[i];
}
if (i == nStartLine)
{
i = nStartLine + SMTP_MAXLINE;
break;
}
}
strcat(sOut, substr(sTemp, nStartLine, i-nStartLine+1));
strcat(sOut, "=\r\n");
nStartLine = i+1;
}
}
strEncode = sOut;
if(sTemp != NULL)
{
free(sTemp);
sTemp = NULL;
}
}
char HexDigit(int nDigit)
{
if (nDigit < 10)
{
return (char) (nDigit + '0');
}
else
{
return (char) (nDigit - 10 + 'A');
}
}
//對SUBJECT信息進行編碼處理
char* EnSubJectCodeString(char* sText)
{
//char* strEncode = NULL;
const char* strTmp = "=?";
unsigned char c;
char* sOut = NULL;
int nSize = 0;
BOOL bTranslationNeeded = TFALSE;
int i = 0;
//檢查是否需要進行編碼
for (i=0; i<nSize && !bTranslationNeeded; i++)
{
c = (unsigned char) sText[i];
if(c > 127)
{
bTranslationNeeded = TTRUE;
}
}
nSize = strlen(sText);
sOut = (char*)malloc(nSize + 128);
if(sOut == NULL)
{
return NULL;
}
memset(sOut, 0, nSize + 128);
//需要進行編碼處理
if (bTranslationNeeded)
{
strcpy(sOut, strTmp);
strcat(sOut, g_stCharset);
strcat(sOut, "?q?");
QuotedPrintableEncode(sText, sText);
strcat(sOut, sText);
strcat(sOut, "?=");
}
//不需要進行編碼處理
else
{
strcpy(sOut, sText);
sOut = sText;
}
//strcpy(strEncode, sOut);
return sOut;
}
//對郵件體BODY信息進行編碼處理
void EnBodyCodeString(char* sText, char* strEncode)
{
int nSize = strlen(sText);
BOOL bTranslationNeeded = TFALSE;
unsigned char c;
char* sOut = NULL;
int i = 0;
//檢查是否需要進行編碼
for (i=0; i<nSize && !bTranslationNeeded; i++)
{
c = (unsigned char) sText[i];
if(c > 127)
{
bTranslationNeeded = TTRUE;
}
}
sOut = (char*)malloc(1024);
if(sOut == NULL)
{
return;
}
//需要進行編碼處理
if (bTranslationNeeded)
{
QuotedPrintableEncode(sText, sOut);
}
//不需要進行編碼處理
else
{
strcpy(sOut, sText);
}
strcpy(sOut, strEncode);
}
BOOL Create()
{
//win socket 初始化信息
g_hSocket = socket(AF_INET, SOCK_STREAM, 0);
if(g_hSocket != -1)
{
printf("Create socket successfully!\n");
return TTRUE;
}
else
{
printf("Create socket fail!\n");
return TFALSE;
}
}
BOOL ConnectServer( const char* pszHostAddress, int nPort)
{
//驗證主機地址
//驗證是否socket被創(chuàng)建
//遠程服務(wù)器地址
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons((u_short)nPort);
server_address.sin_addr.s_addr = inet_addr(pszHostAddress);
if (server_address.sin_addr.s_addr == INADDR_NONE)
{
struct hostent* lphost;
lphost = gethostbyname(pszHostAddress);
if (lphost != NULL)
{
server_address.sin_addr.s_addr = ((struct in_addr*)lphost->h_addr)->s_addr;
}
else
{
return TFALSE;
}
}
//調(diào)用另外一個多態(tài)函數(shù)connect連接到服務(wù)器
return ConnectSvr((struct sockaddr *)&server_address, sizeof(server_address));
}
BOOL ConnectSvr(const struct sockaddr* lpSockAddr, int nSockAddrLen)
{
int result = -1;
result = connect(g_hSocket, lpSockAddr, nSockAddrLen);
if(result == -1)
{
printf("Connect socket fail!\n");
return TFALSE;
}
else
{
return TTRUE;
}
}
BOOL SendDate(const char* pszBuf, int nBuf)
{
int result = -1;
result = send(g_hSocket, pszBuf, nBuf, 0);
if(result == -1)
{
printf("Send socket fail!\n");
return TFALSE;
}
else
{
printf("Send Date: %s\n", pszBuf);
return TTRUE;
}
}
int Receive(char* pszBuf, int nBuf)
{
int result = -1;
result = recv(g_hSocket, pszBuf, nBuf, 0);
if(result == -1)
{
printf("Receive socket fail!\n");
return TFALSE;
}
else
{
printf("Reveive Date: %s\n", pszBuf);
return TTRUE;
}
}
void CloseSocket()
{
if (g_hSocket != -1)
{
//close(g_hSocket);
g_hSocket = -1;
}
}
/*
BOOL IsReadable(BOOL bReadible)
{
mytimeval timeout = {0, 0};
fd_set fds;
FD_ZERO(&fds);
FD_SET(g_hSocket, &fds);
int nStatus = select(0, &fds, NULL, NULL, &timeout);
if (nStatus == -1)
{
return TFALSE;
}
else
{
if(nStatus == 1)
{
bReadible = TTRUE;
}
else
{
bReadible = TFALSE;
}
return TTRUE;
}
}
*/
//*****************字符串處理函數(shù)********************//
//獲取子字符串信息
char* substr(char* pstrChar, int iBegin, int nLength)
{
//數(shù)據(jù)合法性檢驗
int iLength = 0;
char* strTemp = NULL;
iLength = strlen(pstrChar);
strTemp = (char*)malloc(nLength+1);
if(strTemp == NULL)
{
printf("malloc function fail in substr\n!");
return NULL;
}
memset(strTemp, 0, nLength+1);
if(nLength > (iLength - iBegin) )
{
memcpy(strTemp, &pstrChar[iBegin], iLength - iBegin);
}
else
{
memcpy(strTemp, &pstrChar[iBegin], nLength);
}
return strTemp;
}
//查找指定字符串
int find(char* pstrChar, const char* strSoure)
{
int npos = -1;
int i = 0;
int ilength = 0;
int count = 0;
ilength = strlen(pstrChar);
count = strlen(strSoure);
//如果長度太長
if( count > ilength)
{
return npos;
}
//從左邊開始比較
for(i = 0 ; i<ilength; i++)
{
//如果數(shù)據(jù)相等
if( strncmp(&pstrChar[i], strSoure, count) == 0 )
{
return i;
}
}
return npos;
}
//查詢函數(shù)
int rfind(char* strData, const char* strSoure)
{
int npos = -1;
char* strTemp = NULL;
int ilength = 0;
int count = 0;
int end_pos = 0;
ilength = strlen(strData);
count = strlen(strSoure);
//如果長度太長
if( count > ilength)
{
return npos;
}
strTemp = (char*)malloc(ilength +1);
if(strTemp == NULL)
{
return npos;
}
memset(strTemp, 0, ilength +1);
//從右邊的第count位開始比較
end_pos = ilength - count - 1;
//從右邊數(shù)據(jù)開始比較
for( ++end_pos; end_pos-- > 0; )
{
//如果數(shù)據(jù)相等
memset(strTemp, 0, ilength +1);
memcpy(strTemp, &strData[end_pos], count);
if( strncmp(&strData[end_pos], strSoure, count) == 0 )
{
return end_pos;
}
}
return npos;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -