C3Lab研究室

Back to Title Page(OpenLab)タイトルページへ戻る

最終更新日: 1998年 11月 05日 木曜日

*Network Software構築シリーズ5 POP3用関数を拡張する その2

今回拡張した内容

POP3サーバー内のファイルを削除する DELEコマンドの拡張
CStrObj クラスを使用しQuoted-Printable/Base64等への対応準備

 今回拡張した関数

public メンバー関数
BOOL    Delete     (int n);
現在のアカウントのPOP3サーバーにあるメッセージを削除します
nパラメータには Statコマンドで調べた値を最大値とする削除するファイルナンバー
BOOL GetInfo (int n,CString*szFrom,CString *szDate,CString*szSubject);

 この関数内で使用しているReceiveLine関数が呼び出しているCSocket::Recieve
メンバーがシステムリソースを大量に消費し、解放しないため一定回数の呼び出しで
システムがハングアップするのを中間バッファを使用することで回避。

 このほか、RFC1522に従い、ISO-8859-1 QuotedPrintableフォーマットでSJISコード゙を埋め込むようにしました。今後ISO-2022-JP JIS漢字コードを BASE64で埋め込むように変更する予定です。


POP3メンバーを使用するサンプルコード

 このコードはCSockクラスを使用してGetInfoメンバーで修得した情報のうち ヘッダーのサブジェクト情報を日本語化する方法を示しています。ここではログイン 方法やサーバー内のファイル数を修得する部分は省略しています。

 

    CSock cs;


    for(i=1;i<=n;i++){
       CString s1,s2,s3,s;
       CStrObj cso;
       m_progress1.SetPos(i);
       cs.GetInfo(i,&s1,&s2,&s3);
       strcpy(buf,LPCTSTR(s1)); strcpy(buf,strchr(buf,':')+1);
       s1 = buf;
       strcpy(buf,LPCTSTR(s2)); strcpy(buf,strchr(buf,':')+1);
       s2 = buf;
       strcpy(buf,LPCTSTR(s3)); strcpy(buf,strchr(buf,':')+1);
                 
       s3 = cso.Jis2SJis(cso.DecodeRFC1522(buf));

       wsprintf(buf,"%-4d",i);
       s = "";
       s = s +buf + "\t" +s1 + "\t" + s2 + "\t" + s3 + "\t";
       m_list2.AddString(s);
   }

 

クラスの定義リスト : CSock




#ifndef __CLASS_CSOCK__
#define __CLASS_CSOCK__

#include "CStrObj.h"

class CSock : public CSocket {
    private:
    public:
        int Create(LPCTSTR szServer,int nPort,UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL);
        int Create(CString sServer ,int nPort,UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL);
    public:
        int Send(CString s,int nFlags=0);
        int Send(LPCTSTR s,int nFlags=0);
    public:    //
        int Receive(CString *s,int nFlags = 0);
        int ReceiveLine(CString *s,int nFlags = 0);

        void ReportError(int nError);
    //----------------------------------------------------
    // Receive POP3 Functions
    public:
        int         Logon    (CString szName,CString szPass);
        int         Stat    (int *nCount=NULL,long *lLength=NULL);    // if err = -1
        BOOL    GetInfo     (int n,CString*szFrom,CString *szDate,CString*szSubject);
        BOOL    Delete     (int n); // 1 - n

    private:
        int SendUser(CString szUser);
        int SendPass(CString szPass);
        CString szUserName,szPassWord;

    //----------------------------------------------------
    // Send SMTP Command Messages
    public:
        int SendHelo(LPCTSTR szHelo,int nFlags = 0);
        int SendHelo(CString szHelo,int nFlags = 0);
        int SendFrom(LPCTSTR szFrom,int nFlags = 0);
        int SendFrom(CString szFrom,int nFlags = 0);
        int SendTo    (LPCTSTR szTo,int nFlags = 0);
        int SendTo    (CString szTo,int nFlags = 0);
        int SendTo    (LPCTSTR szToName,LPCTSTR szTo,int nFlags = 0);
        int SendTo    (CString szToName,CString szTo,int nFlags = 0);
        int SendData(int nFlags = 0);
        int SendSubject(LPCTSTR szSubject,int nFlags=0);
        int SendSubject(CString szSubject,int nFlags=0);
        int SendMIME(int nMajor,int nMinor,int nFlags=0);
        int SendContentType(int nFlags=0);                     //      text/plain;
        int SendContentType(LPCTSTR szType,int nFlags=0);
        int SendContentType(CString szType,int nFlags=0);
        int SendXMailer(LPCTSTR szXMailer,int nFlags=0);
        int SendXMailer(CString szXMailer,int nFlags=0);
        int SendEncodeType(int nFlags=0);                     //      quoted-printable
        int SendEncodeType(LPCTSTR szType,int nFlags=0);
        int SendEncodeType(CString szType,int nFlags=0);
        int SendBody(CString s,int nFlags=0);
        int SendBody(LPCTSTR s,int nFlags=0);

        int SendTermination(int nFlags = 0);
    //----------------------------------------------------
    // SMTP & POP3 shared function
    public:
        int SendQuit(int nFlags = 0);

    //----------------------------------------------------
    // private function
    private:
        char ReceiveChar2Buffer(int nFlags);

};
//---------------------------------------------------------------
// POP3
        BOOL    Delete     (int n); // 1 - n


BOOL CSock::Delete(int n){
    char buf[4096];
    CString str;
    wsprintf(buf,"DELE %d\r\n",n);
    Send((LPCTSTR)buf);
    if (ReceiveLine(&str) == SOCKET_ERROR) return FALSE;
    if (str.Left(3) != _T("+OK")) return FALSE;
    return TRUE;
}
BOOL CSock::GetInfo    (int n,CString*szFrom,CString *szDate,CString*szSubject){
    char buf[4096];
    CString str;
    wsprintf(buf,"TOP %d %d\r\n",n,n);
    Send((LPCTSTR)buf);
    if (ReceiveLine(&str) == SOCKET_ERROR) return FALSE;
    if (str.Left(3) != _T("+OK")) return -1;
    while(1){
        if (ReceiveLine(&str) == SOCKET_ERROR) return FALSE;
        if (str==".") break;
        if (str.Left(5) == _T("From:")) *szFrom=str;
        if (str.Left(5) == _T("Date:")) *szDate=str;
        if (str.Left(8) == _T("Subject:")) *szSubject=str;
    }
    return TRUE;
}

int CSock::Stat(int *nCount,long *lLength){
    CString str;
    char buf[1024],*p;
    int n = 0;
    Send("STAT\r\n");
    if (ReceiveLine(&str) == SOCKET_ERROR) return -1;
    if (str.Left(3) != _T("+OK")) return -1;
    strcpy(buf,LPCTSTR(str));
    strcpy(buf,strchr(buf,0x20)+1);
    p=strchr(buf,0x20); *p=0; p++;
    n = atoi(buf);
    if(nCount!=NULL)*nCount = n;
    if(lLength!=NULL)*lLength=atol(p);
    return n;
}

BOOL CSock::Logon(CString szName,CString szPass){
    CString strResponse;
    SendUser(szName);
    if (ReceiveLine(&strResponse) == SOCKET_ERROR) return FALSE;
    if (strResponse.Left(3) != _T("+OK")) return FALSE;
    SendPass(szPass);
    if (ReceiveLine(&strResponse) == SOCKET_ERROR) return FALSE;
    if (strResponse.Left(3) != _T("+OK")) return FALSE;
    szUserName = szName;
    szPassWord = szPass;
    return TRUE;
}

int CSock::SendUser(CString szName){
    CString strCommand = "USER ";
    strCommand += szName;
    strCommand += "\r\n";
    return( Send(strCommand) );
}
int CSock::SendPass(CString szPass){
    CString strCommand = "PASS ";
    strCommand += szPass;
    strCommand += "\r\n";
    return( Send(strCommand) );
}
//---------------------------------------------------------------
//---------------------------------------------------------------

int CSock::Create(CString sServer,int nPort,UINT nSocketPort, int nSocketType, LPCTSTR lpszSocketAddress){
    return( Create( LPCTSTR(sServer),nPort,nSocketPort,nSocketType,lpszSocketAddress) );
}

int CSock::Create(LPCTSTR szServer,int nPort,UINT nSocketPort, int nSocketType, LPCTSTR lpszSocketAddress){
    int n=CSocket::Create(nSocketPort,nSocketType,lpszSocketAddress);
    szUserName="";    // POP3 Account
    szPassWord="";    // POP3 Account
    if(n==0)return n;
    return( CSocket::Connect(szServer,nPort) );
}

//---------------------------------------------------------------
void CSock::ReportError(int nError){
    CString strError;
    strError.LoadString(nError);
    AfxMessageBox(strError);
}

/*
int CSock::Receive(char *s,int nsize,int nFlags){
    int n = CSocket::Receive(s,nsize,nFlags);
    return n;
}
*/

int CSock::Receive(CString *s,int nFlags){
    static char buf[256];
    ZeroMemory(buf,256);
    int n = CSocket::Receive(buf,254,nFlags);
    *s = buf;
    return n;
}



static int nBuffer=0;
static char sBuffer[4096];

char CSock::ReceiveChar2Buffer(int nFlags){
    int n;
    if(nBuffer==0){
        ZeroMemory(sBuffer,4096);
        n = CSocket::Receive((void*)sBuffer,4094,nFlags);
        nBuffer = strlen(sBuffer);
    }
    char c = sBuffer[0];
    memcpy(sBuffer,sBuffer+1,4095); nBuffer--;
    return c;
};

int CSock::ReceiveLine(CString *s,int nFlags){
    static char buf[2],line[1024];
    static int n;

    *s="";
    buf[1]=0; ZeroMemory(line,1024);
    while(1){//CSocket::Receive
        buf[0] = ReceiveChar2Buffer(nFlags);
        if( buf[0]==0x0d) continue;
        if( buf[0]==0x0a) break;
        strcat(line,buf);
    }
    *s=line;
    return n;
}

//------------------------------------------

int CSock::SendTermination(int nFlags){
    return ( Send("\r\n.\r\n") );
}
//------------------------------------------
int CSock::SendEncodeType(int nFlags){
    return(SendEncodeType("quoted-printable") );
}

int CSock::SendEncodeType(LPCTSTR szType,int nFlags)
{
    CString strCommand = "Content-Transfer-Encoding: ";
    strCommand += szType;
    strCommand += "\r\n";
    return( Send(strCommand,nFlags) );
}
int CSock::SendEncodeType(CString szType,int nFlags)
{
    CString strCommand = "Content-Transfer-Encoding: ";
    strCommand += szType;
    strCommand += "\r\n";
    return( Send(strCommand,nFlags) );
}
//------------------------------------------

int CSock::SendMIME(int nMajor,int nMinor,int nFlags){
    CString strCommand = "MIME-Version: ";
    char buf[80];
    wsprintf(buf,"%d.%d",nMajor,nMinor);
    strCommand += buf;
    strCommand += "\r\n";
    return( Send(strCommand,nFlags) );
}
//------------------------------------------
int CSock::SendContentType(int nFlags){
    return( SendContentType("text/plain;") );
}
int CSock::SendContentType(LPCTSTR szType,int nFlags)
{
    CString strCommand = "Content-Type: ";
    strCommand += szType;
    strCommand += "\r\n";
    return( Send(strCommand,nFlags) );
}
int CSock::SendContentType(CString szType,int nFlags)
{
    CString strCommand = "Content-Type: ";
    strCommand += szType;
    strCommand += "\r\n";
    return( Send(strCommand,nFlags) );
}
//------------------------------------------
int CSock::SendXMailer(LPCTSTR szXMailer,int nFlags)
{
    CString strCommand = "X-Mailer: <";
    strCommand += szXMailer;
    strCommand += ">\r\n";
    return( Send(strCommand,nFlags) );
}
int CSock::SendXMailer(CString szXMailer,int nFlags)
{
    CString strCommand = "X-Mailer: <";
    strCommand += szXMailer;
    strCommand += ">\r\n";
    return( Send(strCommand,nFlags) );
}

//------------------------------------------
int CSock::SendSubject(LPCTSTR szSubject,int nFlags)
{
    CString strCommand = "Subject: =?ISO-8859-1?Q?";
    CStrObj cs;
    strCommand += cs.EncodeQuoted(szSubject);
    strCommand += "?=\r\n";
    return( Send(strCommand,nFlags) );
}
int CSock::SendSubject(CString szSubject,int nFlags)
{
    return( SendSubject(LPCTSTR(szSubject),nFlags) );
}
//------------------------------------------

int CSock::SendTo(LPCTSTR szTo,int nFlags)
{
    CString strCommand = "RCPT TO:<";
    strCommand += szTo;
    strCommand += ">\r\n";
    return( Send(strCommand,nFlags) );
}
int CSock::SendTo(LPCTSTR szToName,LPCTSTR szTo,int nFlags)
{
    CString strCommand = "RCPT TO: ";
    CStrObj cs;
    strCommand += "=?ISO-8859-1?Q?";
    strCommand += cs.EncodeQuoted(szToName);
    strCommand += "?=";

    strCommand += "<";
    strCommand += szTo;
    strCommand += ">\r\n";
    return( Send(strCommand,nFlags) );
}

int CSock::SendTo(CString szTo,int nFlags)
{
    return( SendTo(LPCTSTR(szTo),nFlags) );
}
int CSock::SendTo(CString szToName,CString szTo,int nFlags)
{
    return( SendTo(LPCTSTR(szToName),LPCTSTR(szTo),nFlags) );
}
//---------------------------------------------
int CSock::SendFrom(LPCTSTR szFrom,int nFlags)
{
    CString strCommand = "MAIL FROM:<";
    strCommand += szFrom;
    strCommand += ">\r\n";
    return( Send(strCommand,nFlags) );
}
int CSock::SendFrom(CString szFrom,int nFlags)
{
    return( SendFrom( LPCTSTR(szFrom),nFlags) );
}
//---------------------------------------------
int CSock::SendHelo(LPCTSTR szHelo,int nFlags)
{
    CString strCommand = "HELO ";

    if( strchr(szHelo,'@')==0)    strCommand += szHelo;
    else strCommand += (strchr(szHelo,'@')+1);
    strCommand += "\r\n";
    return( Send(strCommand,nFlags) );
}
int CSock::SendHelo(CString szHelo,int nFlags)
{
    return( SendHelo( LPCTSTR(szHelo),nFlags) );
}
//---------------------------------------------
int CSock::SendData(int nFlags){
    return( Send("DATA\r\n",nFlags) );
};

int CSock::SendQuit(int nFlags){
    return( Send("QUIT\r\n",nFlags) );
};

//---------------------------------------------
int CSock::SendBody(CString s,int nFlags){
    return( SendBody(LPCTSTR(s),nFlags) );
};
int CSock::SendBody(LPCTSTR src,int nFlags){
    CString s;
    char buf[514];
    LPCTSTR s2;
    CStrObj cs;

    s = cs.EncodeQuoted(src);
    s2 = LPCTSTR(s);
    long i,j,n,k,ret;
    j=n = s.GetLength();
    for(i=0;i<n;i+=k){
        k = j; if(j>10) k=10;
        ZeroMemory(buf,514);
        memcpy(buf,s2+i,k);
        ret = CSocket::Send(buf,strlen(buf),nFlags);
    }
    return ret;
};
//---------------------------------------------
int CSock::Send(CString s,int nFlags){
    return( Send(LPCTSTR(s),nFlags) );
};
int CSock::Send(LPCTSTR s,int nFlags){
    return( CSocket::Send(s,strlen(s),nFlags) );
};

#endif // __CLASS_CSOCK__

Copyright (C) Kitaro 1998