免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2208 | 回复: 6
打印 上一主题 下一主题

救人一命胜造七极浮屠!!!请问关于smtp client的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-16 20:34 |只看该作者 |倒序浏览
我想通过smtp发email, 在C 程序中走过DATA后,就该注明Header了,可是这个Header有哪些内容,该怎么写,哪位大哥能指点一下,或有一个列子?先谢谢了。

论坛徽章:
0
2 [报告]
发表于 2003-10-16 20:58 |只看该作者

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

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

论坛徽章:
0
3 [报告]
发表于 2003-10-17 07:19 |只看该作者

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

需要需要。请贴出C程序。谢谢!

论坛徽章:
0
4 [报告]
发表于 2003-10-17 08:20 |只看该作者

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

不太好读,你看看吧。

  1. #include <stdio.h>;
  2. #include <winsock2.h>;
  3. #include <time.h>;

  4. #define PORT 25                        
  5. #define BUFFERLEN 1024                 
  6. #define TEMPLEN          1024

  7. int WaitForRead( SOCKET socket, int seconds );
  8. int WaitForWrite( SOCKET socket, int seconds );
  9. int MyRecv( SOCKET socket, char *buffer, int len );
  10. int MySend( SOCKET socket, char *buffer, int len );
  11. //char* decode( const char* in_str, char* out_str);
  12. char* encode( const char* in_str, char *out_str );



  13. int main( void )
  14. {
  15.    SOCKET srvrSocket;
  16.    struct sockaddr_in srvrAddr;
  17.    WORD ver;
  18.    WSAData data;
  19.    int z, len;
  20.    char buffer[BUFFERLEN];
  21.    char temp[TEMPLEN];
  22.    char hostname[] = "smtp.163.com";
  23.    char username[] = "***";
  24.    char password[] = "***";
  25.    char sendname[] = "senderyjf";
  26.    char recvname[] = "recvyjf";
  27.    char subject[] = "Test mail";
  28.    char sendaddr[] = "****@163.com";
  29.    char recvaddr[] = "*****@163.com";
  30.    char plaincontent[] = "Test content !!!";
  31.    char filecontent[] = "d:\\test.txt";
  32.    char htmcontent[] = "<a href='http://morningspace.51.net'>;click me</a>;";
  33.                
  34.    ver = MAKEWORD( 2, 0 );
  35.    z = WSAStartup( ver, &data );
  36.    if ( z < 0 )
  37.    {
  38.       fprintf( stderr, "WSAStartup() error!\n" );
  39.       return 1;
  40.    }
  41.    

  42.    struct hostent* host = gethostbyname( hostname );
  43.    if (host == 0)
  44.     {
  45.         fprintf(stderr,"gethostbyname() error!\n");
  46.     }

  47.    //srvrSocket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
  48.    srvrSocket = socket( PF_INET, SOCK_STREAM, 0 );
  49.    if ( srvrSocket < 0 )
  50.    {
  51.       fprintf( stderr, "Alloc socket handle failed!\n" );
  52.       return 1;
  53.    }

  54.    memset( &srvrAddr, 0, sizeof srvrAddr );
  55.    srvrAddr.sin_family = AF_INET;
  56.    srvrAddr.sin_port = htons(PORT);
  57.    srvrAddr.sin_addr.s_addr = *(ULONG *)host->;h_addr ;
  58.    if ( srvrAddr.sin_addr.s_addr == INADDR_NONE )
  59.    {
  60.            fprintf( stderr, "inet_addr() error!\n" );
  61.            return 1;
  62.    }

  63.    len = sizeof srvrAddr;

  64.    z = connect( srvrSocket, ( struct sockaddr * ) &srvrAddr, len );
  65.    if ( z < 0 )
  66.    {
  67.             fprintf( stderr, "connet() error!\n" );
  68.                 return 1;
  69.    }

  70.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  71.    if ( z < 0 ) return 1;

  72.    if ( strncmp( buffer, "220", 3 ) != 0 ) return 1;

  73.    //hello
  74.    if ( gethostname( temp, TEMPLEN ) != 0 )
  75.     {
  76.         fprintf( stderr, "gethostname() error");
  77.     }

  78.    sprintf( buffer, "HELO %s\r\n", temp );
  79.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  80.    if ( z < 0 ) return 1;

  81.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  82.    if ( z < 0 ) return 1;

  83.    if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
  84.             
  85.    //login
  86.    strcpy( buffer, "AUTH LOGIN\r\n" );
  87.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  88.    if ( z < 0 ) return 1;

  89.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  90.    if ( z < 0 ) return 1;

  91.    if ( strncmp( buffer, "334", 3 ) != 0 ) return 1;

  92.    sprintf( buffer, "%s\r\n", encode( username, temp ) );
  93.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  94.    if ( z < 0 ) return 1;

  95.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  96.    if ( z < 0 ) return 1;

  97.    if ( strncmp( buffer, "334", 3 ) != 0 ) return 1;

  98.    sprintf( buffer, "%s\r\n", encode( password, temp ) );
  99.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  100.    if ( z < 0 ) return 1;

  101.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  102.    if ( z < 0 ) return 1;

  103.    if ( strncmp( buffer, "235", 3 ) != 0 ) return 1;

  104.    //send header
  105.    sprintf( buffer, "MAIL FROM: <%s>;\r\n", sendaddr );
  106.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  107.    if ( z < 0 ) return 1;

  108.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  109.    if ( z < 0 ) return 1;

  110.    if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;

  111.    sprintf( buffer, "RCPT TO: <%s>;\r\n", recvaddr );
  112.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  113.    if ( z < 0 ) return 1;

  114.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  115.    if ( z < 0 ) return 1;

  116.    if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;

  117.    ///////////////////////////////////////////////////////////
  118.    strcpy( buffer, "DATA\r\n" );
  119.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  120.    if ( z < 0 ) return 1;

  121.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  122.    if ( z < 0 ) return 1;

  123.    if ( strncmp( buffer, "354", 3 ) != 0 ) return 1;


  124.     sprintf( buffer, "From: \"%s\" <%s>;\r\n", sendname, sendaddr );

  125.     sprintf( temp, "To: \"%s\" <%s>;\r\n", recvname, recvaddr );
  126.     strcat( buffer, temp );

  127.     time_t seconds;
  128.     time( &seconds );
  129.     strftime( temp, TEMPLEN,
  130.              "%a, %d %b %y %H:%M:%S",
  131.              localtime(&seconds));         
  132.     strcat( buffer, "Date: " );
  133.         strcat( buffer, temp );
  134.     strcat( buffer, "\r\n" );

  135.     sprintf( temp, "Subject: %s\r\n", subject );
  136.         strcat( buffer, temp );

  137.     strcat( buffer, "X-Mailer: SMailer\r\n" );

  138.     strcat( buffer, "X-Priority: 3\r\n" );
  139.   

  140.     strcat( buffer, "MIME-Version: 1.0\r\n" );
  141.     strcat( buffer, "Content-type: multipart/mixed; boundary=\"" );
  142.     strcat( buffer, "#BOUNDARY#\"\r\n\r\n" );

  143.     z = MySend( srvrSocket, buffer, strlen( buffer ) );
  144.     if ( z < 0 ) return 1;

  145.     //plainttxt
  146.     strcpy( buffer, "--#BOUNDARY#\r\n" );
  147.     strcat( buffer, "Content-Type: text/plain; charset=gb2312\r\n" );

  148.     strcat( buffer, "Content-Transfer-Encoding: 8bit\r\n\r\n" );

  149.         z = MySend( srvrSocket, buffer, strlen( buffer ) );
  150.     if ( z < 0 ) return 1;

  151.         strcpy( buffer, plaincontent );

  152.     strcat( buffer, "\r\n\r\n" );

  153.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  154.    if ( z < 0 ) return 1;

  155.     //htm
  156.     strcpy( buffer, "--#BOUNDARY#\r\n" );
  157.     strcat( buffer, "Content-Type: text/html; charset=gb2312\r\n" );

  158.     strcat( buffer, "Content-Transfer-Encoding: 8bit\r\n\r\n" );

  159.         z = MySend( srvrSocket, buffer, strlen( buffer ) );
  160.     if ( z < 0 ) return 1;

  161.         strcpy( buffer, htmcontent );

  162.     strcat( buffer, "\r\n\r\n" );

  163.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  164.    if ( z < 0 ) return 1;

  165.     //file
  166.     char drive[_MAX_DRIVE];
  167.     char direc[_MAX_DIR];
  168.     char fname[_MAX_FNAME];
  169.     char ext[_MAX_EXT];
  170.         char filename[_MAX_FNAME+_MAX_EXT];
  171.     _splitpath(filecontent, drive, direc, fname, ext);
  172.     strcpy( filename, fname );
  173.     strcat( filename, ext );

  174.     strcpy( buffer, "--#BOUNDARY#\r\n" );
  175.     strcat( buffer, "application/octet-stream; name=" );
  176.         strcat( buffer, filename );
  177.         strcat( buffer, "\r\n" );

  178.         strcat( buffer, "Content-Disposition: attachment; filename=" );
  179.         strcat( buffer, filename );
  180.         strcat( buffer, "\r\n" );

  181.     strcat( buffer, "Content-Transfer-Encoding: base64\r\n\r\n" );

  182.         z = MySend( srvrSocket, buffer, strlen( buffer ) );
  183.     if ( z < 0 ) return 1;

  184.         strcpy( buffer, encode( filecontent, temp ) );

  185.     strcat( buffer, "\r\n\r\n" );

  186.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  187.    if ( z < 0 ) return 1;

  188.    //end data
  189.    strcpy( buffer, "\r\n--#BOUNDARY#--\r\n.\r\n" );

  190.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  191.    if ( z < 0 ) return 1;

  192.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  193.    if ( z < 0 ) return 1;

  194.    if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;


  195.    //quit
  196.    strcpy( buffer, "QUIT\r\n" );

  197.    z = MySend( srvrSocket, buffer, strlen( buffer ) );
  198.    if ( z < 0 ) return 1;

  199.    z = MyRecv( srvrSocket, buffer, BUFFERLEN );
  200.    if ( z < 0 ) return 1;

  201.    if ( strncmp( buffer, "221", 3 ) != 0 ) return 1;






  202.    fprintf( stdout, "Successful end!!!\n" );
  203.    closesocket( srvrSocket );
  204.    WSACleanup();

  205.    return 0;
  206. }

  207. char* encode( const char* in_str, char *out_str )
  208. {
  209.         const char base64_encode_chars[] =
  210.   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  211.     unsigned char c1, c2, c3;
  212.     int i = 0;
  213.         int j = 0;
  214.     int len = strlen( in_str );
  215.    
  216.        
  217.     while ( i<len )
  218.     {
  219.         // read the first byte
  220.         c1 = in_str[i++];
  221.         if ( i==len )       // pad with "="
  222.         {
  223.             out_str[j++] = base64_encode_chars[ c1>;>;2 ];
  224.             out_str[j++] = base64_encode_chars[ (c1&0x3)<<4 ];
  225.             out_str[j++] = '=';
  226.                         out_str[j++] = '=';
  227.             break;
  228.         }

  229.         // read the second byte
  230.         c2 = in_str[i++];
  231.         if ( i==len )       // pad with "="
  232.         {
  233.             out_str[j++] = base64_encode_chars[ c1>;>;2 ];
  234.             out_str[j++] = base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>;>;4) ];
  235.             out_str[j++] = base64_encode_chars[ (c2&0xF)<<2 ];
  236.             out_str[j++] = '=';
  237.             break;
  238.         }

  239.         // read the third byte
  240.         c3 = in_str[i++];
  241.         // convert into four bytes string
  242.         out_str[j++] = base64_encode_chars[ c1>;>;2 ];
  243.         out_str[j++] = base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>;>;4) ];
  244.         out_str[j++] = base64_encode_chars[ ((c2&0xF)<<2) | ((c3&0xC0)>;>;6) ];
  245.         out_str[j++] = base64_encode_chars[ c3&0x3F ];
  246.     }
  247.         out_str[j] = 0;

  248.     return out_str;
  249. }

  250. /*
  251. char* decode( const char* in_str, char* out_str)
  252. {
  253.   const base64_decode_chars[] =
  254.   {
  255.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  256.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  257.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
  258.     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
  259.     -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
  260.     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
  261.     -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  262.     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
  263.   };

  264.     char c1, c2, c3, c4;
  265.     int i = 0;
  266.         int j = 0;
  267.     int len = strlen( in_str );

  268.     while ( i<len)
  269.     {
  270.         // read the first byte
  271.         do {
  272.             c1 = base64_decode_chars[ in_str[i++] ];
  273.         } while ( i<len && c1==-1);

  274.         if ( c1==-1)
  275.             break;

  276.         // read the second byte
  277.         do {
  278.             c2 = base64_decode_chars[ in_str[i++] ];
  279.         } while ( i<len && c2==-1);

  280.         if ( c2==-1 )
  281.             break;

  282.         // assamble the first byte
  283.         out_str[j++] = char( (c1<<2) | ((c2&0x30)>;>;4) );

  284.         // read the third byte
  285.         do {
  286.             c3 = in_str[i++];
  287.             if ( c3==61 )       // meet with "=", break
  288.                 return out_str;
  289.             c3 = base64_decode_chars[ c3 ];
  290.         } while ( i<len && c3==-1);

  291.         if ( c3==-1 )
  292.             break;

  293.         // assamble the second byte
  294.         out_str[j++] = char( ((c2&0XF)<<4) | ((c3&0x3C)>;>;2) );

  295.         // read the fourth byte
  296.         do {
  297.             c4 = in_str[i++];
  298.             if ( c4==61 )       // meet with "=", break
  299.                 return out_str;
  300.             c4 = base64_decode_chars[ c4 ];
  301.         } while ( i<len && c4==-1 );

  302.         if ( c4==-1 )
  303.             break;

  304.         // assamble the third byte
  305.         out_str[j++] = char( ((c3&0x03)<<6) | c4 );
  306.     }

  307.     return out_str;
  308. }
  309. */
  310. int MyRecv( SOCKET socket, char *buffer, int len)
  311. {
  312.         int z;
  313.    
  314.         z = WaitForRead( socket, 100 );

  315.         if ( z < 0 )
  316.     {
  317.        fprintf( stderr, "Select() faield!\n" );
  318.        closesocket( socket );
  319.        return -1;
  320.     }
  321.     else if ( z == 0 )
  322.     {
  323.        fprintf( stdout, "Receive Time Out!\n" );
  324.        closesocket( socket );
  325.        return -1;
  326.     }

  327.     z = recv( socket, buffer, len, 0 );

  328.     if ( z < 0 )
  329.     {
  330.        fprintf( stderr, "Receive failed!\n" );
  331.        closesocket( socket );
  332.        return -1;
  333.     }
  334.     else if ( z == 0 )
  335.     {
  336.        fprintf( stdout, "Break by remote!\n" );
  337.        closesocket( socket );
  338.        return -1;
  339.     }
  340.           
  341.         buffer[z]=0;

  342.         fprintf( stdout, "[INFO]RECV(   ):%s\n", buffer);
  343.     return z;
  344. }

  345. int MySend( SOCKET socket, char *buffer, int len)
  346. {   
  347.         int z;

  348.     z = WaitForWrite( socket, 100 );

  349.         if ( z < 0 )
  350.         {
  351.         fprintf( stderr, "Select() faield!\n" );
  352.         closesocket( socket );
  353.         return -1;
  354.         }
  355.     else if ( z == 0 )
  356.         {
  357.        fprintf( stdout, "Receive Time Out!\n" );
  358.        closesocket( socket );
  359.        return -1;
  360.         }
  361.   
  362.         z = send( socket, buffer, len, 0);
  363.           
  364.         if ( z < 0 )
  365.         {
  366.         fprintf( stderr, "Receive failed!\n" );
  367.         closesocket( socket );
  368.         return -1;
  369.         }
  370.     else if ( z == 0 )
  371.         {
  372.         fprintf( stdout, "Break by remote!\n" );
  373.         closesocket( socket );
  374.         return -1;
  375.         }

  376.         fprintf( stdout, "[INFO]SEND:%s\n", buffer );
  377.     return z;
  378. }

  379. int WaitForRead( SOCKET socket, int seconds )
  380. {
  381.    fd_set fds;
  382.    struct timeval timeOut;
  383.    int z;

  384.    FD_ZERO( &fds );
  385.    FD_SET( socket, &fds );

  386.    timeOut.tv_sec = seconds;
  387.    timeOut.tv_usec = 0;

  388.    z = select( socket+1, &fds, NULL, NULL, &timeOut );
  389.    return z;
  390. }

  391. int WaitForWrite( SOCKET socket, int seconds )
  392. {
  393.    fd_set fds;
  394.    struct timeval timeOut;
  395.    int z;

  396.    FD_ZERO( &fds );
  397.    FD_SET( socket, &fds );

  398.    timeOut.tv_sec = seconds;
  399.    timeOut.tv_usec = 0;

  400.    z = select( socket+1, NULL, &fds, NULL, &timeOut );
  401.    return z;
  402. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-10-17 13:34 |只看该作者

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

露山购热情,老夫置为精彩回帖。

论坛徽章:
0
6 [报告]
发表于 2003-10-17 16:01 |只看该作者

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

aiqin21sgy 该用户已被删除
7 [报告]
发表于 2003-10-23 00:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP