[How To] [c言語]ネットワークプログラミング: メール受信POP3クライアント  

POP3クライアントの構成

POP3サーバからメールを取り出すプログラムを構成します。
POP3サーバとTCPコネクションを確立し、POP3サーバからの肯定的な返答「+OK」を確認します。
続いて、USERコマンド、PASSコマンドを使って、POP3サーバに認証情報を送ります。
RETRコマンドを使って、メールを取り出します。

POP3クライアントプログラム(C言語/簡易)

    POPClient.c
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdlib.h>
    #define BUFLEN 256
    #define PORT 110
    #define BY_HOSTNAME
    /*#define BY_ADDRESS */
    main( int argc, char **argv ) {
      struct hostent *host;
      struct sockaddr_in server;
      int s;
      int n,n2;
      char buf[BUFLEN];
      FILE *fp;
      printf( " HOST: argv[ 1 ] = %s \r\n", argv[ 1 ] );
      printf( " USER: argv[ 2 ] = %s \r\n", argv[ 2 ] );
      printf( " PASS: argv[ 3 ] = %s \r\n", argv[ 3 ] );
      bzero((char *)&server,sizeof(server));
      server.sin_family = AF_INET;
      server.sin_port = htons(PORT);
    #if defined(BY_HOSTNAME)
      host = gethostbyname( argv[ 1 ] );
      bcopy(host->h_addr,(char *)&server.sin_addr,host->h_length);
    #elif defined(BY_ADDRESS)
      server.sin_addr.s_addr = inet_addr(IP_ADDRESS);
    #endif
      s = socket(AF_INET,SOCK_STREAM,0);
      connect(s,( struct sockaddr *) &server,sizeof(server));
      fp = fdopen( s, "r+" );
      if ( fp == NULL ){
       fprintf(stderr, "fdopen error \r\n");
       return 0;
      }
      fgets( buf, sizeof( buf ), fp );
      printf( "%s", buf );
      fprintf( fp, "USER %s\r\n", argv[ 2 ] );
      fgets( buf, sizeof( buf ), fp );
      printf( "%s", buf );
      fprintf( fp, "PASS %s\r\n", argv[ 3 ] );
      fgets( buf, sizeof( buf ), fp );
      printf( "%s", buf );
      fprintf( fp, "LIST\r\n" );
      while( 1 ){
     if ( fgets( buf, sizeof( buf ), fp ) == NULL ) break;
       if ( buf[ 0 ] == '.' ) break;
     sscanf( buf, "%d %d\r\n", &n, &n2 );
      }
      printf("LIST: %d %d\r\n", n, n2 );
     
      fprintf( fp, "RETR %d\r\n", n );
      while( 1 ){
     if ( fgets( buf, sizeof( buf ), fp ) == NULL ) break;
     if ( buf[ 0 ] == '.' ) break;
     printf("%s", buf );
      }
      fprintf( fp, "QUIT\r\n" );
      fgets( buf, sizeof( buf ),fp );
      printf( "%s", buf );
      close(s);
    }