///////////////////////////////////////////////////////////////////////////// // Rev 11/12/2003 // // // RECVMAIL.C // ---------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // // VERY Simple POP3 client // This example doesn't delete messages in the POP3 server // // Unix port is be very simple but isn't done ... // // // ///////////////////////////////////////////////////////////////////////////// #ifdef _WIN32 #include #define SOCKETERRNO WSAGetLastError() #else #define SOCKETERRNO errno // etc ... #endif #include #include #include #include ///////////////////////////////////////////////////////////////////////////// // // SOCKADDR TCPUDPFORMATADRESS ///////////////////////////////////////////////////////////////////////////// // // DESCRIPTION // --sockaddr TcpUdpFormatAdress-- // ARGUMENTS // Argument1: char * host // Argument2: u_short port // RETOUR/RESULTAT // static struct // REMARQUE // Rev 11/12/2003 ////////////////////////////////////////////////////////////////////////////// static struct sockaddr TcpUdpFormatAdress( char * host, u_short port ) { struct sockaddr_in addr; struct sockaddr addrRet; struct hostent FAR *lphost ; u_long IP; memset((char*)&addr, 0, sizeof(addr)); /* Soit on fournit une adresse IP, soit on fournit un nom */ if ((IP = inet_addr(host)) == (u_long)INADDR_NONE) { if ((lphost = gethostbyname(host))==NULL) { memset( (char * )&addrRet, 0, sizeof(addrRet) ); return addrRet; } addr.sin_family = lphost->h_addrtype; #ifdef _WIN16 /* A définir dans le projet WIN16 */ _fmemcpy (&addr.sin_addr, lphost->h_addr, lphost->h_length); #else /* WIN32, UNIX*/ memcpy (&addr.sin_addr, lphost->h_addr, lphost->h_length); #endif } else { addr.sin_family = AF_INET; addr.sin_addr.s_addr = IP; } /* Port destination */ addr.sin_port = htons((u_short)port ); memcpy( (char *)&addrRet, (char *)&addr, sizeof(addrRet) ); return addrRet; } ///////////////////////////////////////////////////////////////////////////// // // SENDRECEIVE ///////////////////////////////////////////////////////////////////////////// // // DESCRIPTION // --SendReceive-- // // Send a command, and wait for the response // // ARGUMENTS // Argument1: SOCKET hSocket // Argument2: char * pszBuffer // Argument3: int cbBuffer // Argument4: int fWaitPoint // RETOUR/RESULTAT // void // REMARQUE // Rev 11/12/2003 ////////////////////////////////////////////////////////////////////////////// void SendReceive( SOCKET hSocket, char * pszBuffer, int cbBuffer, int fWaitPoint ) { char Buffer[10240]; int cb; if( cbBuffer == -1 ) cbBuffer = strlen(pszBuffer); cb = send( hSocket, pszBuffer, cbBuffer, 0 ); cbBuffer = 0; while( 1 ) { cb = recv( hSocket, Buffer + cbBuffer, sizeof(Buffer) - 1 - cbBuffer, 0 ); if( cb <= 0 ) { break; } cbBuffer += cb; if( fWaitPoint ) { if( memcmp( Buffer + cbBuffer - 5, "\r\n.\r\n", 5 ) == 0 ) { break; } } else { if( memcmp( Buffer + cbBuffer - 2, "\r\n", 2 ) == 0 ) { break; } } } if( cbBuffer > 0 ) { Buffer[cbBuffer] = 0; write( 1, Buffer, cbBuffer ); } else { printf( "Connection broken (%d)\n", SOCKETERRNO ); } } ///////////////////////////////////////////////////////////////////////////// // // MAIN ///////////////////////////////////////////////////////////////////////////// // // DESCRIPTION // --main-- // ARGUMENTS // Argument1: int argc // Argument2: char * argv[] // RETOUR/RESULTAT // void // REMARQUE // Rev 11/12/2003 ////////////////////////////////////////////////////////////////////////////// void main( int argc, char * argv[]) { int cbSockAddr = sizeof(struct sockaddr); struct sockaddr_in SockAddr; int cbPeerAddr = sizeof(struct sockaddr); struct sockaddr_in PeerAddr; struct sockaddr addrConnect; char Buffer[10240]; int cb; char szUser[256] = "your_user_name"; char szPwd[256] = "you_password"; char szHost[256] = "localhost"; int nPort = 110; SOCKET hSocket; #ifdef _WIN32 WSADATA wsaData; WSAStartup(0x202, &wsaData); #endif // Print how it works printf( "Usage: %s [port (default is 110)] \n", argv[0] ); // get user / pass / port if( argc > 1 ) strcpy( szUser, argv[1] ); if( argc > 2 ) strcpy( szPwd, argv[2] ); if( argc > 3 ) strcpy( szHost, argv[3] ); if( argc > 4 ) nPort = atoi( argv[4] ); if( nPort == 0 ) nPort = 110; // Connect to POP3 server hSocket = socket(AF_INET, SOCK_STREAM, 0); addrConnect = TcpUdpFormatAdress( szHost, (u_short )nPort ); if( connect(hSocket, &addrConnect, sizeof(addrConnect)) == SOCKET_ERROR ) { printf( "Can't connect (%d)\n", SOCKETERRNO ); exit(1); } // Print connection infos getsockname( hSocket, (struct sockaddr *)&SockAddr, &cbSockAddr ); getpeername( hSocket, (struct sockaddr *)&PeerAddr, &cbPeerAddr ); printf( "Connection OK : Sock port is %d, Peer port is %d\n", ntohs(SockAddr.sin_port), ntohs(PeerAddr.sin_port) ); // Receive server wellcome string cb = recv( hSocket, Buffer, sizeof(Buffer) - 1, 0 ); Buffer[cb] = 0; printf( Buffer ); // USER toto sprintf( Buffer, "USER %s\r\n", szUser ); SendReceive( hSocket, Buffer, -1, 0 ); // PASS mypass sprintf( Buffer, "PASS %s\r\n", szPwd ); SendReceive( hSocket, Buffer, -1, 0 ); // STAT SendReceive( hSocket, "STAT\r\n", -1, 0 ); // LIST SendReceive( hSocket, "LIST\r\n", -1, 1 ); // RETR 1 SendReceive( hSocket, "RETR 1\r\n", -1, 1 ); // QUIT SendReceive( hSocket, "QUIT\r\n", -1, 0 ); }