Small library for reading mail messages via POP3. Currently doesn\'t return all header fields, and does only plain text authorization.
Diff: pop3.cpp
- Revision:
- 2:3893c1aaee8d
- Parent:
- 1:f2b05d1c91be
- Child:
- 3:37570217ae90
--- a/pop3.cpp Tue Jan 11 21:35:35 2011 +0000 +++ b/pop3.cpp Sat Jan 29 23:27:26 2011 +0000 @@ -20,45 +20,17 @@ _username=username; _password=password; _servername=servername; - - _readpos=0; - _readlen=0; - + _closed=false; - _socket.setOnEvent(this,&Pop3::onTCPSocketEvent); + _stream=new TCPLineStream(servername,110,"\r\n"); + } Pop3::~Pop3() { close(); } -void Pop3::onTCPSocketEvent(TCPSocketEvent e) { -// printf("New TCPSocketEvent: %d\n",e); - switch (e) { - case TCPSOCKET_CONNECTED: - _connected = true; - _connecting=false; - break; - - case TCPSOCKET_READABLE: - break; - case TCPSOCKET_WRITEABLE: - break; - - case TCPSOCKET_CONTIMEOUT: - case TCPSOCKET_CONRST: - case TCPSOCKET_CONABRT: - case TCPSOCKET_ERROR: - case TCPSOCKET_DISCONNECTED: { - _socket.close(); - _connected = false; - _connecting=false; - } - break; - } -} - list<string> *Pop3::getMessages() { Pop3CommandResponse* pcr=sendCommandMultiResponse("LIST"); if (!pcr->success) { @@ -123,27 +95,17 @@ Pop3CommandResponse* Pop3::sendCommand(string cmd) { // printf("send [%s]\n",cmd.c_str()); - if (!_connected) { - printf("not connected\n"); - return NULL; - } - int err=_socket.send(cmd.append("\r\n").c_str(),cmd.length()+2); - Net::poll(); - string r=readResponseLine(); + _stream->sendLine(cmd); + string r=_stream->readLine(); return new Pop3CommandResponse(r); } Pop3CommandResponse* Pop3::sendCommandMultiResponse(string cmd) { // first, send command // printf("send [%s]\n",cmd.c_str()); - if (!_connected) { - printf("not connected\n"); - return NULL; - } - int err=_socket.send(cmd.append("\r\n").c_str(),cmd.length()+2); - Net::poll(); + _stream->sendLine(cmd); // read first response line -> contains status - string r=readResponseLine(); + string r=_stream->readLine(); // printf("response=[%s]\n",r.c_str()); // create response object to collect remaining lines Pop3CommandResponse *pcr=new Pop3CommandResponse(r); @@ -151,7 +113,7 @@ return pcr; // read other lines, stop when marker reached while (true) { - r=readResponseLine(); + r=_stream->readLine(); if (pcr->addLine(r)) break; } @@ -159,48 +121,11 @@ } bool Pop3::init() { - // retrieve IP address for hostname - DNSResolver *dnsr=new DNSResolver(); - IpAddr addr=dnsr->resolveName(_servername); - delete dnsr; - - if (addr.isNull()) { - printf("cannot resolve server name %s\n",_servername); - return false; - } - -// printf("server ip=%i.%i.%i.%i\n",addr[0],addr[1],addr[2],addr[3]); - - _connecting=true; - - // create tcp socket to server - Host host(addr, 110); - - TCPSocketErr bindErr = _socket.connect(host); - - if (bindErr != 0) { - printf("connection error %i\n", bindErr); - return false; - } - - // wait for connection established - Timer tmr; - tmr.start(); - - while (_connecting) { - Net::poll(); - wait(0.1); - if (tmr.read()>10) - break; - } - - if (!_connected) { - printf("error - could not connect (timeout)\n"); - return false; - } + if (!_stream->open()) + return NULL; // read server banner - string banner=readResponseLine(); + string banner=_stream->readLine(); // printf("banner=[%s]\n",banner.c_str()); Pop3CommandResponse pcr(banner); @@ -239,65 +164,15 @@ Pop3CommandResponse *pcr=sendCommand("CLOSE"); delete pcr; - while (_connected) { - Net::poll(); - // read remaining data - int err=_socket.recv(_readbuf,BUFSIZE-1); - if (err<=0) - break; + if (NULL!=_stream) { + _stream->close(); + delete _stream; + _stream=NULL; } - _socket.resetOnEvent(); - _socket.close(); - _closed=true; } -string Pop3::readResponseLine() { - string r; - bool got_r=false; - - if (!_connected) - return r; - - while (true) { - Net::poll(); - if (_readlen>_readpos) { - while (_readbuf[_readpos]!=0 && _readpos<_readlen) { - char c=_readbuf[_readpos++]; - if (!got_r) { - if (c=='\r') { - got_r=true; - } else { - r.push_back(c); - } - } else { - if (c=='\n') { - return r; - } else { - r.push_back('\r'); // push missed \r also, so push it to string - r.push_back(c); - got_r=false; - } - } - } - } else { - int err=_socket.recv(_readbuf,BUFSIZE-1); - if (err < 0) { - printf("error while receiving data: %i!\n",err); - } else if (err>0) { - _readbuf[err]=0; - _readlen=err; - _readpos=0; - } - } - wait(0.1); - if (_connected==false) { - return r; - } - } -} - Pop3CommandResponse::Pop3CommandResponse(string line) { if (0==line.find("+OK")) { success=true;