最終更新日: 1998年 11月 05日 木曜日
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で埋め込むように変更する予定です。
このコードは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);
}
#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