- 论坛徽章:
- 0
|
救人一命胜造七极浮屠!!!请问关于smtp client的问题
不太好读,你看看吧。
- #include <stdio.h>;
- #include <winsock2.h>;
- #include <time.h>;
- #define PORT 25
- #define BUFFERLEN 1024
- #define TEMPLEN 1024
- int WaitForRead( SOCKET socket, int seconds );
- int WaitForWrite( SOCKET socket, int seconds );
- int MyRecv( SOCKET socket, char *buffer, int len );
- int MySend( SOCKET socket, char *buffer, int len );
- //char* decode( const char* in_str, char* out_str);
- char* encode( const char* in_str, char *out_str );
- int main( void )
- {
- SOCKET srvrSocket;
- struct sockaddr_in srvrAddr;
- WORD ver;
- WSAData data;
- int z, len;
- char buffer[BUFFERLEN];
- char temp[TEMPLEN];
- char hostname[] = "smtp.163.com";
- char username[] = "***";
- char password[] = "***";
- char sendname[] = "senderyjf";
- char recvname[] = "recvyjf";
- char subject[] = "Test mail";
- char sendaddr[] = "****@163.com";
- char recvaddr[] = "*****@163.com";
- char plaincontent[] = "Test content !!!";
- char filecontent[] = "d:\\test.txt";
- char htmcontent[] = "<a href='http://morningspace.51.net'>;click me</a>;";
-
- ver = MAKEWORD( 2, 0 );
- z = WSAStartup( ver, &data );
- if ( z < 0 )
- {
- fprintf( stderr, "WSAStartup() error!\n" );
- return 1;
- }
-
- struct hostent* host = gethostbyname( hostname );
- if (host == 0)
- {
- fprintf(stderr,"gethostbyname() error!\n");
- }
- //srvrSocket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
- srvrSocket = socket( PF_INET, SOCK_STREAM, 0 );
- if ( srvrSocket < 0 )
- {
- fprintf( stderr, "Alloc socket handle failed!\n" );
- return 1;
- }
- memset( &srvrAddr, 0, sizeof srvrAddr );
- srvrAddr.sin_family = AF_INET;
- srvrAddr.sin_port = htons(PORT);
- srvrAddr.sin_addr.s_addr = *(ULONG *)host->;h_addr ;
- if ( srvrAddr.sin_addr.s_addr == INADDR_NONE )
- {
- fprintf( stderr, "inet_addr() error!\n" );
- return 1;
- }
- len = sizeof srvrAddr;
- z = connect( srvrSocket, ( struct sockaddr * ) &srvrAddr, len );
- if ( z < 0 )
- {
- fprintf( stderr, "connet() error!\n" );
- return 1;
- }
-
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "220", 3 ) != 0 ) return 1;
- //hello
- if ( gethostname( temp, TEMPLEN ) != 0 )
- {
- fprintf( stderr, "gethostname() error");
- }
- sprintf( buffer, "HELO %s\r\n", temp );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
-
- //login
- strcpy( buffer, "AUTH LOGIN\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "334", 3 ) != 0 ) return 1;
- sprintf( buffer, "%s\r\n", encode( username, temp ) );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "334", 3 ) != 0 ) return 1;
- sprintf( buffer, "%s\r\n", encode( password, temp ) );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "235", 3 ) != 0 ) return 1;
- //send header
- sprintf( buffer, "MAIL FROM: <%s>;\r\n", sendaddr );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
- sprintf( buffer, "RCPT TO: <%s>;\r\n", recvaddr );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
- ///////////////////////////////////////////////////////////
- strcpy( buffer, "DATA\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "354", 3 ) != 0 ) return 1;
- sprintf( buffer, "From: \"%s\" <%s>;\r\n", sendname, sendaddr );
- sprintf( temp, "To: \"%s\" <%s>;\r\n", recvname, recvaddr );
- strcat( buffer, temp );
- time_t seconds;
- time( &seconds );
- strftime( temp, TEMPLEN,
- "%a, %d %b %y %H:%M:%S",
- localtime(&seconds));
- strcat( buffer, "Date: " );
- strcat( buffer, temp );
- strcat( buffer, "\r\n" );
- sprintf( temp, "Subject: %s\r\n", subject );
- strcat( buffer, temp );
- strcat( buffer, "X-Mailer: SMailer\r\n" );
- strcat( buffer, "X-Priority: 3\r\n" );
-
- strcat( buffer, "MIME-Version: 1.0\r\n" );
- strcat( buffer, "Content-type: multipart/mixed; boundary=\"" );
- strcat( buffer, "#BOUNDARY#\"\r\n\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- //plainttxt
- strcpy( buffer, "--#BOUNDARY#\r\n" );
- strcat( buffer, "Content-Type: text/plain; charset=gb2312\r\n" );
- strcat( buffer, "Content-Transfer-Encoding: 8bit\r\n\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- strcpy( buffer, plaincontent );
- strcat( buffer, "\r\n\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- //htm
- strcpy( buffer, "--#BOUNDARY#\r\n" );
- strcat( buffer, "Content-Type: text/html; charset=gb2312\r\n" );
- strcat( buffer, "Content-Transfer-Encoding: 8bit\r\n\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- strcpy( buffer, htmcontent );
- strcat( buffer, "\r\n\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- //file
- char drive[_MAX_DRIVE];
- char direc[_MAX_DIR];
- char fname[_MAX_FNAME];
- char ext[_MAX_EXT];
- char filename[_MAX_FNAME+_MAX_EXT];
- _splitpath(filecontent, drive, direc, fname, ext);
- strcpy( filename, fname );
- strcat( filename, ext );
- strcpy( buffer, "--#BOUNDARY#\r\n" );
- strcat( buffer, "application/octet-stream; name=" );
- strcat( buffer, filename );
- strcat( buffer, "\r\n" );
- strcat( buffer, "Content-Disposition: attachment; filename=" );
- strcat( buffer, filename );
- strcat( buffer, "\r\n" );
- strcat( buffer, "Content-Transfer-Encoding: base64\r\n\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- strcpy( buffer, encode( filecontent, temp ) );
- strcat( buffer, "\r\n\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- //end data
- strcpy( buffer, "\r\n--#BOUNDARY#--\r\n.\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
- //quit
- strcpy( buffer, "QUIT\r\n" );
- z = MySend( srvrSocket, buffer, strlen( buffer ) );
- if ( z < 0 ) return 1;
- z = MyRecv( srvrSocket, buffer, BUFFERLEN );
- if ( z < 0 ) return 1;
- if ( strncmp( buffer, "221", 3 ) != 0 ) return 1;
- fprintf( stdout, "Successful end!!!\n" );
- closesocket( srvrSocket );
- WSACleanup();
- return 0;
- }
- char* encode( const char* in_str, char *out_str )
- {
- const char base64_encode_chars[] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- unsigned char c1, c2, c3;
- int i = 0;
- int j = 0;
- int len = strlen( in_str );
-
-
- while ( i<len )
- {
- // read the first byte
- c1 = in_str[i++];
- if ( i==len ) // pad with "="
- {
- out_str[j++] = base64_encode_chars[ c1>;>;2 ];
- out_str[j++] = base64_encode_chars[ (c1&0x3)<<4 ];
- out_str[j++] = '=';
- out_str[j++] = '=';
- break;
- }
- // read the second byte
- c2 = in_str[i++];
- if ( i==len ) // pad with "="
- {
- out_str[j++] = base64_encode_chars[ c1>;>;2 ];
- out_str[j++] = base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>;>;4) ];
- out_str[j++] = base64_encode_chars[ (c2&0xF)<<2 ];
- out_str[j++] = '=';
- break;
- }
- // read the third byte
- c3 = in_str[i++];
- // convert into four bytes string
- out_str[j++] = base64_encode_chars[ c1>;>;2 ];
- out_str[j++] = base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>;>;4) ];
- out_str[j++] = base64_encode_chars[ ((c2&0xF)<<2) | ((c3&0xC0)>;>;6) ];
- out_str[j++] = base64_encode_chars[ c3&0x3F ];
- }
- out_str[j] = 0;
- return out_str;
- }
- /*
- char* decode( const char* in_str, char* out_str)
- {
- const base64_decode_chars[] =
- {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
- };
- char c1, c2, c3, c4;
- int i = 0;
- int j = 0;
- int len = strlen( in_str );
- while ( i<len)
- {
- // read the first byte
- do {
- c1 = base64_decode_chars[ in_str[i++] ];
- } while ( i<len && c1==-1);
- if ( c1==-1)
- break;
- // read the second byte
- do {
- c2 = base64_decode_chars[ in_str[i++] ];
- } while ( i<len && c2==-1);
- if ( c2==-1 )
- break;
- // assamble the first byte
- out_str[j++] = char( (c1<<2) | ((c2&0x30)>;>;4) );
- // read the third byte
- do {
- c3 = in_str[i++];
- if ( c3==61 ) // meet with "=", break
- return out_str;
- c3 = base64_decode_chars[ c3 ];
- } while ( i<len && c3==-1);
- if ( c3==-1 )
- break;
- // assamble the second byte
- out_str[j++] = char( ((c2&0XF)<<4) | ((c3&0x3C)>;>;2) );
- // read the fourth byte
- do {
- c4 = in_str[i++];
- if ( c4==61 ) // meet with "=", break
- return out_str;
- c4 = base64_decode_chars[ c4 ];
- } while ( i<len && c4==-1 );
- if ( c4==-1 )
- break;
- // assamble the third byte
- out_str[j++] = char( ((c3&0x03)<<6) | c4 );
- }
- return out_str;
- }
- */
- int MyRecv( SOCKET socket, char *buffer, int len)
- {
- int z;
-
- z = WaitForRead( socket, 100 );
- if ( z < 0 )
- {
- fprintf( stderr, "Select() faield!\n" );
- closesocket( socket );
- return -1;
- }
- else if ( z == 0 )
- {
- fprintf( stdout, "Receive Time Out!\n" );
- closesocket( socket );
- return -1;
- }
- z = recv( socket, buffer, len, 0 );
- if ( z < 0 )
- {
- fprintf( stderr, "Receive failed!\n" );
- closesocket( socket );
- return -1;
- }
- else if ( z == 0 )
- {
- fprintf( stdout, "Break by remote!\n" );
- closesocket( socket );
- return -1;
- }
-
- buffer[z]=0;
- fprintf( stdout, "[INFO]RECV( ):%s\n", buffer);
- return z;
- }
- int MySend( SOCKET socket, char *buffer, int len)
- {
- int z;
- z = WaitForWrite( socket, 100 );
- if ( z < 0 )
- {
- fprintf( stderr, "Select() faield!\n" );
- closesocket( socket );
- return -1;
- }
- else if ( z == 0 )
- {
- fprintf( stdout, "Receive Time Out!\n" );
- closesocket( socket );
- return -1;
- }
-
- z = send( socket, buffer, len, 0);
-
- if ( z < 0 )
- {
- fprintf( stderr, "Receive failed!\n" );
- closesocket( socket );
- return -1;
- }
- else if ( z == 0 )
- {
- fprintf( stdout, "Break by remote!\n" );
- closesocket( socket );
- return -1;
- }
- fprintf( stdout, "[INFO]SEND:%s\n", buffer );
- return z;
- }
- int WaitForRead( SOCKET socket, int seconds )
- {
- fd_set fds;
- struct timeval timeOut;
- int z;
- FD_ZERO( &fds );
- FD_SET( socket, &fds );
- timeOut.tv_sec = seconds;
- timeOut.tv_usec = 0;
- z = select( socket+1, &fds, NULL, NULL, &timeOut );
- return z;
- }
- int WaitForWrite( SOCKET socket, int seconds )
- {
- fd_set fds;
- struct timeval timeOut;
- int z;
- FD_ZERO( &fds );
- FD_SET( socket, &fds );
- timeOut.tv_sec = seconds;
- timeOut.tv_usec = 0;
- z = select( socket+1, NULL, &fds, NULL, &timeOut );
- return z;
- }
复制代码 |
|