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 + -
显示快捷键?