救人一命胜造七极浮屠!!!请问关于smtp client的问题

发表于:2007-05-26来源:作者:点击数: 标签:
我想通过smtp发email,在C程序中走过DATA后,就该注明Header了,可是这个Header有哪些内容,该怎么写,哪位大哥能指点一下,或有一个列子?先谢谢了。 sdupoplar 回复于:2003-10-16 20:58:49 你上个问题中已给你了个C++的简单发邮件程序,你把程序中传输的数

我想通过smtp发email, 在C 程序中走过DATA后,就该注明Header了,可是这个Header有哪些内容,该怎么写,哪位大哥能指点一下,或有一个列子?先谢谢了。

 sdupoplar 回复于:2003-10-16 20:58:49
你上个问题中已给你了个C++的简单发邮件程序,你把程序中传输的数据输出一看就明白了。我有个C的程序,不过当时只是测试一下可不可以,不可以直接用的,数据存放时只是直接用了数组,数据长了会越界的,没有错误检查,不过可以发送邮件,你如果需要的话我可以给你贴出来。

 littlescorpian 回复于:2003-10-17 07:19:47
需要需要。请贴出C程序。谢谢!

 sdupoplar 回复于:2003-10-17 08:20:35
不太好读,你看看吧。

[code:1:0a42cdba85]#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, "Suclearcase/" target="_blank" >ccessful 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; 

[/code:1:0a42cdba85]

 蓝色键盘 回复于:2003-10-17 13:34:02
露山购热情,老夫置为精彩回帖。

 littlescorpian 回复于:2003-10-17 16:01:36


 aiqin21sgy 回复于:2003-10-23 00:16:03
"你上个问题中已给你了个C++的简单发邮件程序"?
能不能给贴出来看看,谢谢!!

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)