📄 smtpsocket.cpp
字号:
for(j=0;j<message.m_pArrTo->GetCount();j++)
{
LPTAG_ADDRINFO pAddrInfo=(LPTAG_ADDRINFO)message.m_pArrTo->GetAt(message.m_pArrTo->FindIndex(j));
if(pAddrInfo==NULL)
continue;
if(!strTo.IsEmpty())
strTo += ",";
CString strTempTo="";
if(pAddrInfo->strStringName.IsEmpty())
strTempTo.Format("%s",pAddrInfo->strStringAddr);
else
strTempTo.Format("\"%s\" <%s>",EncodeByGB2312(pAddrInfo->strStringName), pAddrInfo->strStringAddr);
strTo+=strTempTo;
}
s[n] = "TO: ";
s[n] += strTo;
s[n++] += "\r\n";
}
// Build CC List
if( message.m_pArrCC->GetCount() > 0 )
{
CString strTo;
for(j=0;j<message.m_pArrCC->GetCount();j++)
{
LPTAG_ADDRINFO pAddrInfo=(LPTAG_ADDRINFO)message.m_pArrCC->GetAt(message.m_pArrCC->FindIndex(j));
if(pAddrInfo==NULL)
continue;
if(!strTo.IsEmpty())
strTo += ",";
CString strTempTo="";
if(pAddrInfo->strStringName.IsEmpty())
strTempTo.Format("%s",pAddrInfo->strStringAddr);
else
strTempTo.Format("\"%s\" <%s>",EncodeByGB2312(pAddrInfo->strStringName), pAddrInfo->strStringAddr);
strTo+=strTempTo;
}
s[n] = "CC: ";
s[n] += strTo;
s[n++] += "\r\n";
}
if( message.m_pArrReplyTo->GetCount() > 0 )
{
CString strTo;
for(j=0;j<message.m_pArrReplyTo->GetCount();j++)
{
LPTAG_ADDRINFO pAddrInfo=(LPTAG_ADDRINFO)message.m_pArrReplyTo->GetAt(message.m_pArrReplyTo->FindIndex(j));
if(pAddrInfo==NULL)
continue;
if(!strTo.IsEmpty())
strTo += ",";
CString strTempTo="";
if(pAddrInfo->strStringName.IsEmpty())
strTempTo.Format("%s",pAddrInfo->strStringAddr);
else
strTempTo.Format("\"%s\" <%s>",EncodeByGB2312(pAddrInfo->strStringName), pAddrInfo->strStringAddr);
strTo+=strTempTo;
}
s[n] = "REPLY-TO: ";
s[n] += strTo;
s[n++] += "\r\n";
}
sprintf( szBuffer, "SUBJECT: %s\r\n",EncodeByGB2312(message.m_strSubject));
s[n++] = szBuffer;
// DATE/TIME
zone = _timezone;
if( zone < 0 )
{
bNegative = TRUE;
zone = -zone;
}
sprintf( szTimeZone, " %c%02d00\r\n", bNegative ? '+' : '-', zone / 3600 );
time( <ime );
today = localtime( <ime );
strftime( szBuffer, 128, "DATE: %a, %d %b %Y %H:%M:%S", today );
s[n] = szBuffer;
s[n++] += szTimeZone;
if( message.m_pArrAttachment->GetCount() > 0 || message.m_bHTML )
{
// Generate separator
GUID g;
CoCreateGuid( &g );
char szBoundary[200];
sprintf( szBoundary,
"%04X_%04X_%04X_%04X_%02X%02X_%02X%02X_%02X%02X_%02X%02X",
HIWORD(g.Data1), LOWORD(g.Data1), g.Data2,
g.Data3, g.Data4[0], g.Data4[1],
g.Data4[2], g.Data4[3], g.Data4[4],
g.Data4[5], g.Data4[6], g.Data4[7] );
s[n++] = "MIME-Version: 1.0\r\n";
sprintf( szBuffer, "Content-Type: multipart/mixed;boundary=\"%s\"\r\n\r\n",
szBoundary );
s[n++] = szBuffer;
s[n++] = "This is a multi-part message in MIME format.\r\n\r\n";
// Body in the MIME format
sprintf( szBuffer, "--%s\r\n", szBoundary );
s[n++] = szBuffer;
s[n++] = message.m_bHTML ?
"Content-Type: text/html; charset=\"gb2312\"\r\n"
: "Content-Type: text/plain; charset=\"gb2312\"\r\n";
s[n++] = "Content-Transfer-Encoding: base64\r\n\r\n";
//message.m_strBody+=m_strAbout;
CString strBody=UUEncodeString(message.m_strBody);
s[n] = strBody;
s[n++] += "\r\n\r\n";
for(i=0;i<n;i++)
{
if(nResult=DPSendData_Event(m_hSocket,s[i].GetBuffer(0),s[i].GetLength(),m_dwTimeout)<=0)
goto CLEAR;
s[i].ReleaseBuffer();
}
n=0;
for(i=0;i<message.m_pArrAttachment->GetCount();i++)
{
LPTAG_ADDRINFO pAddrInfo=(LPTAG_ADDRINFO)message.m_pArrAttachment->GetAt(
message.m_pArrAttachment->FindIndex(i));
if(pAddrInfo==NULL)
continue;
sprintf( szBuffer, "--%s\r\n", szBoundary );
s[n++] = szBuffer;
CString strFilePath=pAddrInfo->strStringAddr;
char szContentType[200], szFileName[200];
ExtractContentType(strFilePath,szContentType );
ExtractFileName(strFilePath,szFileName );
CString strFileName=EncodeByGB2312(szFileName);
sprintf( szBuffer, "Content-Type: %s;name=\"%s\"\r\n", szContentType, strFileName );
s[n++] = szBuffer;
s[n++] = "Content-Transfer-Encoding: base64\r\n";
sprintf( szBuffer, "Content-Disposition: attachment;filename=\"%s\"\r\n\r\n", strFileName );
s[n++] = szBuffer;
for(int j=0;j<n;j++)
{
if(nResult=DPSendData_Event(m_hSocket,s[j].GetBuffer(0),s[j].GetLength(),m_dwTimeout)<=0)
goto CLEAR;
s[j].ReleaseBuffer();
}
n=0;
char* pData=NULL;
long nDataSize=0;
BOOL bResult= ReadAndEncodeFile(strFilePath, &pData,nDataSize);
if(bResult&&pData&&nDataSize>0)
{
if(nResult=DPSendData_Event(m_hSocket,pData,nDataSize,m_dwTimeout)<=0)
goto CLEAR;
if(pData)
delete []pData;
}
sprintf( szBuffer, "\r\n\r\n");
if(nResult=DPSendData_Event(m_hSocket,szBuffer,strlen(szBuffer),m_dwTimeout)<=0)
goto CLEAR;
}
sprintf( szBuffer, "--%s--\r\n.\r\n", szBoundary );
if(nResult=DPSendData_Event(m_hSocket,szBuffer,strlen(szBuffer),m_dwTimeout)<=0)
goto CLEAR;
if (!ReadCommandResponse())
goto CLEAR;
}
else
{
s[n++] = "\r\n";
s[n] = message.m_strBody;
s[n++] += "\r\n.\r\n";
for(i=0;i<n;i++)
{
if(nResult=DPSendData_Event(m_hSocket,s[i].GetBuffer(0),s[i].GetLength(),m_dwTimeout)<=0)
goto CLEAR;
s[i].ReleaseBuffer();
}
n=0;
if (!ReadCommandResponse())
goto CLEAR;
}
return TRUE;
CLEAR:
Disconnect();
return FALSE;
}
void CSmtpSocket::ExtractContentType(CString Path, char * pContentType )
{
char ext[_MAX_EXT];
USES_CONVERSION;
_splitpath(Path.GetBuffer(0), NULL, NULL, NULL, ext );
if( *ext )
{
UCHAR szVal[250];
ULONG nSize = 240;
ULONG nType = REG_SZ;
HKEY hKey;
::RegOpenKey( HKEY_CLASSES_ROOT, ext, &hKey );
LONG res = ::RegQueryValueEx( hKey, "Content Type", NULL, &nType, szVal, &nSize );
::RegCloseKey( hKey );
if( res != ERROR_SUCCESS )
strcpy( pContentType, "application/octet-stream" );
else
strcpy( pContentType, (char *)szVal );
}
else
strcpy( pContentType, "application/octet-stream" );
}
void CSmtpSocket::ExtractFileName(CString Path, char * pFileName )
{
USES_CONVERSION;
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath(Path.GetBuffer(0), NULL, NULL, fname, ext );
strcpy( pFileName, fname );
strcat( pFileName, ext );
}
/* Static */
BOOL CSmtpSocket::BufferResize( BUFFER *pB, DWORD cNewL )
{
PBYTE pN;
if ( cNewL > pB->cLen )
{
pN = (unsigned char *)malloc( cNewL );
if ( pB->pBuf )
{
memcpy( pN, pB->pBuf, pB->cLen );
free( pB->pBuf );
}
pB->pBuf = pN;
pB->cLen = cNewL;
}
return TRUE;
}
const int CSmtpSocket::pr2six[256]={
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62,64,64,64,63,
52,53,54,55,56,57,58,59,60,61,64,64,64,64,64,64,64,0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,64,64,64,64,64,64,26,27,
28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64 };
char CSmtpSocket::six2pr[64] = {
'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','+','/' };
/* Static */
BOOL CSmtpSocket::UUEncode( BYTE * bufin, DWORD nbytes, BUFFER * pbuffEncoded )
{
unsigned char *outptr;
unsigned int i;
// Resize the buffer to 133% of the incoming data
if ( !BufferResize( pbuffEncoded, nbytes + ((nbytes + 3) / 3) + 4))
return FALSE;
outptr = (unsigned char *) BufferQueryPtr(pbuffEncoded);
for (i=0; i<nbytes; i += 3)
{
*(outptr++) = six2pr[*bufin >> 2]; /* c1 */
*(outptr++) = six2pr[((*bufin << 4) & 060) | ((bufin[1] >> 4) & 017)]; /*c2*/
*(outptr++) = six2pr[((bufin[1] << 2) & 074) | ((bufin[2] >> 6) & 03)];/*c3*/
*(outptr++) = six2pr[bufin[2] & 077]; /* c4 */
bufin += 3;
}
/* If nbytes was not a multiple of 3, then we have encoded too
* many characters. Adjust appropriately.
*/
if(i == nbytes+1)
{
/* There were only 2 bytes in that last group */
outptr[-1] = '=';
}
else
if(i == nbytes+2)
{
/* There was only 1 byte in that last group */
outptr[-1] = '=';
outptr[-2] = '=';
}
*outptr = '\0';
return TRUE;
}
//对文件进行编码,文件路径,返回的编码内容指针
BOOL CSmtpSocket::ReadAndEncodeFile(CString Path, char** pRetVal,long& nRetSize)
{
*pRetVal=NULL;
nRetSize=0;
USES_CONVERSION;
HANDLE hFile = ::CreateFile(Path, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile == INVALID_HANDLE_VALUE )
return FALSE;
long nSize = ::GetFileSize( hFile, NULL );
ULONG nBytesRead;
char * buf = new char[nSize + 10];
if( !buf )
return FALSE;
if( !::ReadFile( hFile, buf, nSize, &nBytesRead, NULL ) )
{
delete []buf;
CloseHandle(hFile);
return FALSE;
}
::CloseHandle( hFile );
BUFFER resbuf;
resbuf.pBuf = NULL;
resbuf.cLen = 0;
UUEncode((BYTE*) buf, nSize, &resbuf );
char * szBuf76 = new char[resbuf.cLen + resbuf.cLen / 38 + 200];
if( !szBuf76 )
{
delete []buf;
return FALSE;
}
szBuf76[0] = 0;
// Cut the string into pieces of 76 characters
int nCount = 0, nBufCount = 0;
int nLen = resbuf.cLen;
while( nCount + 76 <= nLen )
{
lstrcpyn( szBuf76 + nBufCount, (const char *)resbuf.pBuf + nCount, 77 ); // incl. term. 0
nBufCount += 76;
lstrcpyn( szBuf76 + nBufCount, "\r\n", 3 );
nBufCount += 2;
nCount += 76;
}
if( nLen > nCount )
{
lstrcat( szBuf76, (const char *)resbuf.pBuf + nCount ); // incl. term. 0
lstrcat( szBuf76, "\r\n" );
}
*pRetVal = szBuf76;
nRetSize=strlen(szBuf76);
delete [] buf;
return TRUE;
}
//对文件进行编码,文件路径,返回的编码内容指针
CString CSmtpSocket::UUEncodeString(CString strString)
{
CString strReturn="";
BUFFER resbuf;
resbuf.pBuf = NULL;
resbuf.cLen = 0;
UUEncode((BYTE*) strString.GetBuffer(0),strString.GetLength(),&resbuf );
char * szBuf76 = new char[resbuf.cLen + resbuf.cLen / 38 + 200];
if( !szBuf76 )
return strReturn;
szBuf76[0] = 0;
// Cut the string into pieces of 76 characters
int nCount = 0, nBufCount = 0;
int nLen = resbuf.cLen;
while( nCount + 76 <= nLen )
{
lstrcpyn( szBuf76 + nBufCount, (const char *)resbuf.pBuf + nCount, 77 ); // incl. term. 0
nBufCount += 76;
lstrcpyn( szBuf76 + nBufCount, "\r\n", 3 );
nBufCount += 2;
nCount += 76;
}
if( nLen > nCount )
{
lstrcat( szBuf76, (const char *)resbuf.pBuf + nCount ); // incl. term. 0
lstrcat( szBuf76, "\r\n" );
}
strReturn=szBuf76;
delete []szBuf76;
return strReturn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -