myimap.cpp
来自「maybe is knn or maybe not i m not sure a」· C++ 代码 · 共 220 行
CPP
220 行
// MyImap.cpp: implementation of the CMyImap class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "NoSpam.h"
#include "MyImap.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyImap::CMyImap()
{
}
CMyImap::~CMyImap()
{
}
BOOL CMyImap::Login(LPCSTR host, LPCSTR user, LPCSTR passwd)
{
CString strTmp;
if (CMySock::Connect(host, 143) != 0) {
return FALSE;
}
m_bytesInBuf = 0;
m_cmdNum = 0;
if (!CheckResponse()) {
goto LoginAbort;
}
strTmp.Format("LOGIN %s %s", user, passwd);
if (!SendCommand(strTmp)) {
goto LoginAbort;
}
if (!CheckResponse()) {
goto LoginAbort;
}
return TRUE;
LoginAbort:
Logout();
return FALSE;
}
BOOL CMyImap::ReadLine()
{
m_strLine.Empty();
for (;;)
{
if (m_bytesInBuf > 0)
{
for (int i = 0; i < m_bytesInBuf; ++i)
{
if (m_lineBuf[i] == '\r' && (i+1 < m_bytesInBuf && m_lineBuf[i+1] == '\n'))
{
m_lineBuf[i] = '\0';
m_strLine += m_lineBuf;
m_strLine.TrimRight();
m_strLine.TrimLeft();
m_bytesInBuf -= i + 2;
if (m_bytesInBuf > 0) {
CopyMemory(m_lineBuf, &m_lineBuf[i+2], m_bytesInBuf);
}
return TRUE;
}
}
m_lineBuf[m_bytesInBuf] = '\0';
m_strLine += m_lineBuf;
}
int len = sizeof(m_lineBuf)-1;
if (Receive(m_lineBuf, len) != 0) {
return FALSE;
}
m_bytesInBuf = len;
}
}
BOOL CMyImap::FetchToken(CString &strToken)
{
strToken.Empty();
m_strLine.TrimLeft();
int idx = m_strLine.Find(' ');
if (idx >= 0)
{
strToken = m_strLine.Left(idx);
m_strLine = m_strLine.Right(m_strLine.GetLength() - idx - 1);
m_strLine.TrimLeft();
}
else
{
strToken = m_strLine;
m_strLine.Empty();
}
return !strToken.IsEmpty();
}
void CMyImap::Logout()
{
if (SendCommand("LOGOUT")) {
ReadLine();
}
Disconnect();
}
BOOL CMyImap::SendCommand(LPCSTR cszCmd)
{
CString strCmd;
strCmd.Format("%d %s\r\n", ++m_cmdNum, cszCmd);
m_bytesInBuf = 0; // drain the buffer
return (Send(strCmd) == 0);
}
BOOL CMyImap::CheckResponse()
{
if (!ReadLine()) {
return FALSE;
}
CString strToken0, strToken1;
FetchToken(strToken0);
FetchToken(strToken1);
return (strToken0.Compare("*") == 0 ||
atoi(strToken0) == m_cmdNum) &&
strToken1.CompareNoCase("OK") == 0;
}
BOOL CMyImap::SelectMailBox(LPCSTR cszMailBoxName)
{
m_numOfMsgs = 0;
if (!SendCommand(CString("SELECT ") + cszMailBoxName)) {
return FALSE;
}
while (ReadLine())
{
CString strToken0, strToken1;
FetchToken(strToken0);
FetchToken(strToken1);
if (m_cmdNum == atoi(strToken0)) {
return strToken1.CollateNoCase("OK") == 0;
}
if (strToken0.Compare("*") == 0)
{
CString strToken2;
FetchToken(strToken2);
if (strToken2.CompareNoCase("EXISTS") == 0) {
m_numOfMsgs = atoi(strToken1);
}
}
}
return FALSE;
}
BOOL CMyImap::ReadMsgHeader(const int msgNum, CString &from, CString &subject, BOOL &bDeleted)
{
CString strTmp;
strTmp.Format("FETCH %d (flags body.peek[header])", msgNum);
if (!SendCommand(strTmp)) {
return FALSE;
}
bDeleted = FALSE;
while (ReadLine())
{
CString strToken;
FetchToken(strToken);
if (m_cmdNum == atoi(strToken))
{
FetchToken(strToken);
return strToken.CollateNoCase("OK") == 0;
}
if (strToken.Compare("*") == 0)
{
FetchToken(strToken);
if (msgNum == atoi(strToken))
{
while (FetchToken(strToken))
{
if (FindNoCase(strToken, "\\Deleted") >= 0)
{
bDeleted = TRUE;
break;
}
}
}
}
else if (strToken.CompareNoCase("From:") == 0) {
from = m_strLine;
}
else if (strToken.CompareNoCase("Subject:") == 0) {
subject = m_strLine;
}
}
return FALSE;
}
BOOL CMyImap::DeleteMsg(const int msgNum)
{
CString strTmp;
strTmp.Format("STORE %d +flags \\Deleted", msgNum);
if (!SendCommand(strTmp)) {
return FALSE;
}
while (ReadLine())
{
CString strToken;
FetchToken(strToken);
if (m_cmdNum == atoi(strToken))
{
FetchToken(strToken);
return strToken.CollateNoCase("OK") == 0;
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?