42class CAbstractMailClient
54 virtual ~IListener(
void) {}
59 virtual void OnMailResponse(LPCSTR lpszRes) = 0;
64 virtual void OnMailCommand(LPCSTR lpszCmd) = 0;
72 CAbstractMailClient(
void) : m_socket(false), m_piRep(&m_socket), m_pListener(NULL), m_responseTimeout(5000)
74 m_queue.SetEnvironment(m_piRep, &m_inner);
78 virtual ~CAbstractMailClient(
void)
87 LPCSTR GetErrorText(
void)
const
89 return m_ascErrorText;
96 void SetListener(IListener* pListener = NULL)
98 m_pListener = pListener;
108 void SetServerName(LPCTSTR lpszName, WORD wPort)
112 SetReportInterface(&m_socket);
122 void SetReportInterface(
IReport* pReport)
125 m_piRep = (pReport != NULL) ? pReport : m_piRep;
127 m_queue.SetEnvironment(m_piRep, &m_inner);
135 void SetResponseTimeout(DWORD tm)
137 m_responseTimeout = tm;
147 bool Disconnect(
void)
150 if ( m_piRep->IsConnect() )
156 if ( ! m_piRep->IsConnect() )
177 m_ascErrorText.Empty();
178 if ( ! m_piRep->Start() )
180 SetErrorText(
"Server Not Found.");
199 virtual bool IsValidResponse(
const CAscii& a)
const = 0;
208 virtual bool QuitCommand(
CAscii& _res) = 0;
216 virtual bool OnConnect(
void) = 0;
226 bool r = m_inner.Read(_res, m_responseTimeout);
229 TRACE1(
"Mail-Command Response = [%s]\n", _res );
230 if ( m_pListener != NULL )
232 m_pListener->OnMailResponse(_res);
237 SetErrorText(
"Timeout.");
248 bool Write(LPCSTR lpszCmd)
250 if ( m_piRep != NULL )
255 return m_piRep->Send(a.
GetLength(), lpsz);
267 bool Command(
CAscii& _res, LPCSTR lpszCmd)
270 if ( m_pListener != NULL )
272 m_pListener->OnMailCommand(lpszCmd);
278 if ( ! IsValidResponse(_res) )
294 bool Command(LPCSTR lpszCmd)
297 return Command(s, lpszCmd);
312 bool r = m_inner.Read(res, m_responseTimeout);
315 SetErrorText(
"Timeout.");
334 if ( ! m_piRep->IsConnect() )
336 m_ascErrorText =
"Server Not Connected.";
346 void SetErrorText(LPCSTR lpsz)
348 m_ascErrorText = lpsz;
359 m_recvLines.RemoveAll();
367 bool Read(
CAscii& _res, DWORD time)
372 if ( ! m_recvLines.IsEmpty() )
374 _res = m_recvLines.Take();
397 if ( b == 0 || b == 0x0A )
404 if ( b == 0 || b == 0x0D )
429 IListener* m_pListener;
430 DWORD m_responseTimeout;
472class CPop3Client :
public CAbstractMailClient
474 DEFSUPER(CAbstractMailClient);
501 CPop3Client(EKind kind = POP3) : _super(), m_kind(kind)
506 virtual ~CPop3Client(
void)
517 CAscii GetOpeningMessage(
void)
const
519 return m_ascOpeningMessage;
529 void SetServerName(LPCTSTR lpszName, WORD port = 110)
531 _super::SetServerName(lpszName, port);
539 void SetUser(LPCTSTR lpszUser, LPCTSTR lpszPassword)
541 m_ascUser = lpszUser;
542 m_ascPassword = lpszPassword;
549 void SetKind(EKind kind)
560 bool RequestNoop(
void)
564 return Command(
"NOOP");
577 bool RequestDelete(
int number)
592 bool CancelDelete(
void)
596 return Command(
"RSET");
608 bool GetMailCount(TParam& _param)
615 if ( Command(res,
"STAT") )
617 m_GetTwoInt(_param, res, 4);
631 bool GetMailList(CParamVector& _list)
637 if ( Command(res,
"LIST") )
639 size_t c = res.
ToInt(4);
648 m_GetTwoInt(t, va[i], 0);
653 SetErrorText(
"invalid list");
668 bool GetMailContent(
CAsciiVector& _mail,
int number,
int line = 0)
676 cmd.
Format(
"RETR %d", number);
680 cmd.
Format(
"TOP %d %d", number, line);
684 return ReadLines(_mail);
698 bool GetUidl(
CAscii& _uidl,
int number)
704 cmd.
Format(
"UIDL %d", number);
706 if ( Command(res, cmd) )
708 if ( res.
ToInt(4) == number )
711 _uidl = res.
Mid(p + 1);
714 SetErrorText(
"invalid uidl");
728 virtual bool IsValidResponse(
const CAscii& a)
const
730 return a.
Find(
"+OK") == 0;
740 virtual bool QuitCommand(
CAscii& _res)
742 return Command(_res,
"QUIT");
751 virtual bool OnConnect(
void)
755 if ( r && s.
GetAt(0) ==
'+' )
757 m_ascOpeningMessage = s.
Mid(4);
758 if ( m_kind == POP3 )
761 if ( Command(
"USER " + m_ascUser) )
763 if ( Command(
"PASS " + m_ascPassword) )
772 INT_PTR is = s.
Find(
'<');
773 INT_PTR ie = s.
Find(
'>', is);
774 if ( is >= 0 && ie > is )
778 if ( Command(
CAscii::Fmt(
"APOP %s %s", m_ascUser, h)) )
790 CAscii m_ascOpeningMessage;
802 void m_GetTwoInt(TParam& _param,
const CAscii& asc,
int iOffset)
805 _param.number = asc.
ToInt(iOffset);
806 _param.size = asc.
ToInt(p + 1);
818USER・PASS コマンドによってユーザ認証を行う。
821RETR コマンドでメールの内容を受け取り、
822DELE コマンドでメールをサーバから削除する。
826サーバ <wait for connection on TCP port 110>
827クライアント <open connection>
828サーバ +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
830クライアント USER メールアカウント名<CRLF>
832クライアント PASS パスワード<CRLF>
835クライアント APOP mrose c4c9334bac560ecc979e58001b3e22fb
836サーバ +OK mrose
's maildrop has 2 messages (320 octets)
842サーバ +OK 2 messages (320 octets)
849サーバ <the POP3 server sends message 1>
853サーバ +OK message 1 deleted
856サーバ <the POP3 server sends message 2>
859サーバ +OK message 2 deleted
862サーバ +OK dewey POP3 server signing off (maildrop empty)
863クライアント <close connection>
864サーバ <wait for next connection>
#define loop(VAR, CNT)
loop構文.
MD5(message-digest algorithm)関係のヘッダ
static TResult ComputeHash(size_t size, LPCVOID P)
[計算] ハッシュ計算
bool HasData(void) const
[確認] Dataを持っているか
INT_PTR ReverseFind(TYP t) const
[確認] 検索(後ろから)
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
size_t GetLength(void) const
[取得] 文字列長
static CStrT Fmt(const char *lpszFormat,...)
[作成] 書式付き文字列作成
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
TYP GetAt(INDEX index) const
[取得] 一文字取得
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
int ToInt(INDEX iOffset=0, int iBase=10) const
[取得] 数値(int)へ変換
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
bool IsPassed(DWORD dwTime) const
[確認] 経過確認.
virtual size_t GetSize(void) const
[取得] サイズ取得
virtual bool RemoveAll(void)
[削除] 空化
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
CStr GetString(void)
ハッシュ情報(文字列)取得
bool IsEmpty(void) const
[確認] 要素の有無確認.
virtual const TYP & At(INDEX index) const =0
[取得] 要素の参照取得.
virtual size_t GetSize(void) const =0
[取得] 要素数取得.