发新话题
打印

有要事相求-》邮件收发系统的代码问题!

有要事相求-》邮件收发系统的代码问题!

用socket进行邮件客户端的简单实现,本人已经可以实现连接服务器并且可以用代码通过验证,但在mail from 处却不能实现正确的命令,返回码显示是500或533
1 }$ h2 T2 M) n# x  Z. F, @
6 \& V9 x! a6 o1 Y开始定义部分:7 i0 h2 N9 j) B8 }3 h

& |: Q( E; d0 h0 l2 q( B; {4 [7 z#include <netinet/in.h>//include socket
( r$ v1 u- O* `- b#include <sys/socket.h>* p& B* a8 B6 y) X: @2 X* O
#include <stdio.h>//include fopen(),fread().fwrite(),fclose()
+ D$ [& q" l0 i/ x#include <stdlib.h>//include system(). B7 b1 R# r/ l/ E  w
#include <netdb.h>//include gethostbyname()
8 l+ ]2 A+ Y8 T" w. w. g#include <unistd.h>. z( r) l2 j) s" x1 D7 Z
#include <fcntl.h>  X; F' O: p, U( O3 {4 y# V
#include <errno.h>
  @' j5 j( e6 C  q+ S7 \" `% C% g! i#include <sys/stat.h>/ W% @% k. H) M8 l  `& `
#define   PORT     25 //smtp port
9 i3 L1 Q0 S' @6 J* R! G#define   SIZE      1024% B. C7 I& q! y1 z6 G
//define mail commands
4 Y; g0 r' t/ U#define   EHLO      0$ X3 ]* s& z; p$ G7 V5 q! B+ N
#define   AUTH      1% p4 D; O% T+ O- t" Z
#define   USER      2% Q/ a' [8 i: l# n# H" o4 A
#define   PASS      3) D9 F- M# y: k
#define   MAIL      45 I4 x; E6 l( d0 O$ m
#define   RCPT      5
% X4 f. [) ~( A9 ?. J% E  ^#define   DATA      6; \6 v  d, Z5 i
#define   CONT      7
. x& Y: Y6 [: d1 p6 M, F2 ]) _#define   QUIT      8
2 O  w9 m4 {' ?
) A8 M% H0 s8 ~( E7 yvoid base64enc( char *buf,const char *text,int size);
% c) s2 x* o5 T 2 I7 H0 ?4 `7 b
int main(int argc,char *argv[])
! W8 [; p) \% l. l, J{
  b8 q) f" O6 |9 ?* ~                                                     
4 `- ^' U. x8 n: u! Z  ~int                        c;& M1 L, ^7 @4 Z$ J! _
int                        sockfd;  B4 |- ]% |, N" Y
struct sockaddr_in         server_addr;6 N" ?5 H- D/ F, E- W6 x# K" x
struct hostent             *server_ip;
, R! e: x; n, z; W9 Iint                        numbytes=0,i=0;
/ r$ D) x. `* j" Tchar                       username[30]="";//mail username8 z7 x5 ]* u7 s& i
char                       passwd[30]="";//mail passwd
7 p: [. o9 @# `# Z& W" X3 ^char                       str1[512]="";
- `) I* m& t, B. {1 Lchar                       str2[512]="";
4 J/ {% s9 [+ {. p" U/ G0 Y//buff store data by recv(),' J  F, V# Z1 N: G  D3 F

/ s9 o$ Z, @# ]$ i1 b5 i/ ^, O( ^1 k//ip[SIZE] store data by fread() from ip_files(use "ifconfig >tmp.ip",het ip_files)
1 r" L" \* B6 h# [: w( f" Kchar                       buff[512]="",tmp[4]="",ip[SIZE]="";9 E% i) J6 t3 |
int                        ret=0;//function return
1 N% @* Z1 p3 b; {6 Y6 aFILE                       *f_open,*f_write;
1 X* i0 d3 z; ~: Q/ t* Nchar                       *msg[9]={""};
% W* g  J7 S! L3 W3 n0 tchar                       *n_return[9]={""}; //return number
, A, ?0 g% w% u# Q7 Gchar                       *p;
$ N4 f! X/ Y5 F6 I7 @+ b
+ n# m( F. G: k% I( v            
8 S0 e/ _# K2 K  以下是实现的密码通过认证代码:
+ q9 d( Q# H3 x% v       - J! F) @! X" E( W
      else if(i==PASS)   
% ]. F! [9 n+ o! \) D+ X. T6 M0 W          {: a; m% {. b4 k, x2 g6 b* R4 D6 R
            scanf("%s",str1);* K9 X/ ^" L7 N4 d
             base64enc(passwd,str1,strlen(str1));
, C  K5 M3 V7 |7 d* {4 C' @             strcat(passwd,"\n");
+ |0 d& B+ i& E% A! v             if((numbytes=send(sockfd,passwd,strlen(passwd),0))==-1)
' N) f% |* s9 b! a4 Q             {$ e9 C# b. I1 v; g4 ]2 t9 ]0 {
              perror("send error");
$ p; K& A. k1 B  }              break;6 ]$ [! w/ A( j
             }" g, H( l" P% o. p2 a$ l8 [1 r( z* y. Q3 ~; @
             if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
! N& z3 \5 [# z             {
1 U! g% p5 @6 n1 b: w6 O% h              perror("send error");
8 p/ G7 y* B1 j, z' b8 o& H# W7 d              break;
( N' ]3 o- s. V             }
6 N7 v7 i' t8 @( }$ @9 N  
- Q" E) d6 l# x/ @% Z, l   以下是编写的mail from 代码部分:- S" \% ~7 r$ a$ ]! O) I# b, ?) C
    6 E# V, g+ @2 n
   else if(i==MAIL)
8 U7 U/ V) I% Q           {
! L! A8 P  X+ a1 Y: B             scanf("%s",str2);' r1 n" B/ i" p/ p* L0 b
             strcat(str2,"from:longwei46\n");
; f/ S/ E+ ~6 e# b, s3 i             if((numbytes=send(sockfd,str2,strlen(str2),0))==-1)
8 F( |! p" Q* z' M) v             {7 L2 I& \. W/ N( B+ o4 R
              perror("send error");3 d+ ^4 Q. s1 Y! Y' k) Y
              break;; G. v$ z& F% Z0 N
             }- U" e( G" C. V9 s( }+ s
             if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
9 v" ]4 T7 v9 h- o! {             {% w) N( J8 j4 Q& O( e( O* g3 n
              perror("send error");
4 D) J0 t9 U: z* G              break;
' L1 n! [0 s7 {# |$ }             }
5 B; T3 ^3 q: p* z' E          }* V# p1 W. ^, R: `* ~# j
  返回结果显示如下:
# E3 T( T$ G0 a) I
/ y" k8 n# W: y' ?, F5 E. n command:mail from:xxxxx@163.com
! [7 ?* Z+ Q& V1 u; R; G8 L+ O% ?- n* [8 Y
return buff:500 Syntax error, command unrecognized) @4 N9 N+ a5 L
250-HELP
6 A3 b# R5 O' C  X7 R. n6 o, D250-8BITMIME1 _* H( H" S& i: L: @$ N- I. z3 D
250-AUTH=LOGIN PLAIN, z4 E  q! s$ D3 D2 f' p2 M/ m
250-AUTH LOGIN PLAIN% S* j0 o6 j. B  z/ ?, Z
250 XTMD! n' e% n, s- y2 _

  q7 h1 d/ z6 I/ p( Q$ H. k# |   
  J5 A' H' q6 G mail 在服务器上的输入应该是mail from:******@21cn.com
: ?" `3 P' G' e# K7 e5 P  R  - b2 W& T6 c7 O0 a* g  n
, e/ _6 j1 h; y4 d8 Y
现在十分着急想问为什么这个mail from 不能实现命令!望有人能指点一下!在此先谢过了!      

TOP

代码不全,看不出你的输出和代码有什么关系。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

有的系统好像不支持base64编码的命令: [2 U5 v0 _7 d2 j

' M1 }5 D* h0 Y- G6 a建议用plain txt4 J; s, j1 y" C. ^" O. {) U
4 x; r2 D6 t. M
最典型的就是outlook express自己默认会编码base64,结果有的邮件系统就不认识某些命令      
象一阵风 拂过我身边 忽然间 想要去很远 和你去看繁华世界

TOP

只是密码用了base64编码吧,不过话说,21cn的密码认证是用base64的吗?只是用文本的吧?不过楼主说密码通过了,那就不知道是怎么回事了。
% A6 i" @3 P* m: s$ M( d
: [2 C5 `) i: F) l$ z9 U: R刚抓了下包,似乎是编码过的……      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

问题解决了。
4 E! K) Y/ a; n! L! P. h) I5 |以下是代码,写得很烂,本人是初学者大家就讲究着看吧,有问题多多指教下!
复制内容到剪贴板
代码:
#include <netinet/in.h>//include socket
#include <sys/socket.h>
#include <stdio.h>//include fopen(),fread().fwrite(),fclose()
#include <stdlib.h>//include system()
#include <netdb.h>//include gethostbyname()
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#define   PORT     25 //smtp port
#define   SIZE      1024
//define mail commands
#define   EHLO      0
#define   AUTH      1
#define   USER      2
#define   PASS      3
#define   MAIL      4
#define   RCPT      5
#define   DATA      6
#define   CONT      7
#define   QUIT      8

void base64enc( char *buf,const char *text,int size);

int main(int argc,char *argv[])
{
int                        c;
int                        sockfd;
struct sockaddr_in         server_addr;
struct hostent             *server_ip;
int                        numbytes=0,i=0;
char                       username[30]="";//mail username
char                       passwd[30]="";//mail passwd
char                       str1[512]="";
char                       str2[512]="";
//buff store data by recv(),

//ip[SIZE] store data by fread() from ip_files(use "ifconfig >tmp.ip",het ip_files)
char                       buff[512]="",tmp[4]="",ip[SIZE]="";
int                        ret=0;//function return
FILE                       *f_open,*f_write;
char                       *msg[9]={""};
char                       *n_return[9]={""}; //return number
char                       *p;
msg[EHLO]="ehlo smtp.21cn.com\n";
msg[AUTH]="auth login\n";
base64enc(username,str1,strlen(str1));
strcat(username,"\n");
msg[USER]=username;
base64enc(passwd,str1,strlen(str1));
strcat(passwd,"\n");
msg[PASS]=passwd;
msg[MAIL]="mail from:xxxxx@163.com\n";
msg[RCPT]="rcpt to:xxxxx@sohu.com\n";
msg[DATA]="data\n";
msg[QUIT]="quit\n";

n_return[EHLO]="250";
n_return[AUTH]="334";
n_return[USER]="334";
n_return[PASS]="235";
n_return[MAIL]="250";
n_return[RCPT]="250";
/*---------------------------
copy self to /bin/getip
---------------------------*/
while((server_ip=gethostbyname(argv[1]))==NULL)
     {
         herror("gethostbyname error");
     }
//create a socket
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
    perror("socket error");
    return(-1);
    }
    //address information
server_addr.sin_family=AF_INET;//host byte order
server_addr.sin_port=htons(PORT);//short,network byte order
server_addr.sin_addr=*((struct in_addr *)server_ip->h_addr);//server ip
bzero(&(server_addr.sin_zero),8);//zero the rest of struct
    //connect server
if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1)
   {
    perror("connect error");
    return(-1);
   }
    //if connect success,server return "220"
    if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
   {
     perror("recv error");
     return(-1);
   }
   printf("%s",buff);
//send msgs. if any step has a mistake,the "while" will be breaked,then send "quit" to end connection
while(i!=QUIT)
   {
     scanf("%d",&i);
     getchar();

      while(i<0||i>6)
      {

        scanf("%d",&i);
      }
    switch(i)
     {
      case 0: i=EHLO;break;
      case 1: i=AUTH;break;
      case 2: i=USER;break;
      case 3: i=PASS;break;
      case 4: i=MAIL;break;
      case 5: i=RCPT;break;
      case 6: i=DATA;break;
      case 7: i=QUIT;break;
     }
      if(i==EHLO)
      {
           if((numbytes=send(sockfd,"ehlo smtp.21cn.com\n",19,0))==-1)
           {
             perror("send error");
            break;
           }
           if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
           {
             perror("send error");
             break;
           }
      }
      else if(i==AUTH)
           {
             if((numbytes=send(sockfd,"auth login\n",11,0))==-1)
             {
              perror("send error");
              break;
             }
             if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
             {
              perror("send error");
              break;
             }
           }
      else if(i==USER)
           {
             scanf("%s",str1);
             base64enc(username,str1,strlen(str1));
             strcat(username,"\n");
            if((numbytes=send(sockfd,username,strlen(username),0))==-1)
             {
              perror("send error");
              break;
             }
             if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
             {
              perror("send error");
              break;
             }
           }
      else if(i==PASS)
           {
             scanf("%s",str1);
             base64enc(passwd,str1,strlen(str1));
             strcat(passwd,"\n");
             if((numbytes=send(sockfd,passwd,strlen(passwd),0))==-1)
             {
              perror("send error");
              break;
             }
             if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
             {
              perror("send error");
              break;
             }

           }
     else if(i==MAIL)
           {
             scanf("%s",str2);
             sprintf(str1,"mail from:<%s>\n",str2);
           // strcat(str2," from:<longwei46@21cn.com>\n");
             if((numbytes=send(sockfd,str1,strlen(str1),0))==-1)
             {
              perror("send error");
              break;
             }
             if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
             {
              perror("send error");
              break;
             }
          }
       else if(i==RCPT)
             {
               scanf("%s",str2);
               sprintf(str1,"rcpt to:<%s>\n",str2);
               if((numbytes=send(sockfd,str1,strlen(str1),0))==-1)
               {
                perror("send error");
                break;
               }
               if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
               {
                perror("send error");
                break;
               }
            }
     else if(i==DATA)
           {
             if((numbytes=send(sockfd,"data\n",5,0))==-1)
             {
              perror("send error");
              break;
             }
             if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
             {
              perror("send error");
              break;
             }
              printf("command:%s\n",msg[i]);
             //  printf("command:%s\n",msg[i]);
              printf("return buff:%s\n",buff);

             scanf("%s",str2);
             strcat(str2,"\n.\n");
             if((numbytes=send(sockfd,str2,strlen(str2),0))==-1)
             {
              perror("send error");
              break;
             }

/*  if((numbytes=send(sockfd,"mail from:longwei46@21cn.com\n",29,0))==-1)
             {
              perror("send error");
              break;
             }
             *   if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
             {
              perror("send error");
              break;
             }
               printf("command:%s\n",msg[i]);
               printf("return buff:%s\n",buff);*/
                if((numbytes=recv(sockfd,buff,SIZE,0))==-1)
             {
              perror("send error");
              break;
             }
              printf("command:%s\n",msg[i]);
              printf("return buff:%s\n",buff);
//eleep(1);we dont have to use it,because recv() can choke itself until it received data
           }
               printf("command:%s\n",msg[i]);
     //  printf("command:%s\n",msg[i]);
              printf("return buff:%s\n",buff);

       //printf("should return:%s\n",n_return);
  }

  //send quit to end mail connection
  if((numbytes=send(sockfd,msg[QUIT],strlen(msg[QUIT]),0))==-1)
    {
     perror("send error");
     return(-1);
    }


  close(sockfd);
  return (0);
}
void base64enc( char *out,const char *in,int inlen)
{
static char *base64_encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for(;inlen >= 3;inlen -= 3)
{
*out++ = base64_encoding[in[0] >> 2];
*out++ = base64_encoding[((in[0] << 4) & 0x30) | (in[1] >> 4)];
*out++ = base64_encoding[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
*out++ = base64_encoding[in[2] & 0x3f];
in +=3;
}
if(inlen > 0)
{
unsigned char fragment;

*out++ = base64_encoding[in[0] >> 2];
fragment = (in[0] << 4) & 0x30;
if(inlen > 1)
fragment |= in[1] >> 4;
*out++ = base64_encoding[fragment];
*out++ = (inlen < 2) ? '=' : base64_encoding[(in[1] << 2) & 0x3c];
*out++ = '=';
}
*out = '\0';
}
      

TOP

晕,楼主一开始贴的代码好像是我写的哦
$ c. M6 w5 K$ y/ Z7 @code by sink (gymiles@sohu.com)      

TOP

你写的那这个问题就交给你啦。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

不错是借鉴了某位网友的模板!因为毕业急用。$ q: s' G) R; B) R4 z  N! b+ \8 n

. Z3 y& O+ c+ R$ [6 T( O在这要感谢下sink!不过原版实在看得我头大啊!2 w+ f8 U! O2 K$ T  p$ T9 a8 C
主要是网络上没多少这方面的介绍,
( A, M# a+ i0 m& R不过对于像我们这样的初学者来说还是挺有帮助的!      

TOP

呵呵,各位不要误会,没别的意思,就是看着代码有点眼熟而已,就当灌水了      

TOP

误会啥了?你要是到这里灌水的话那可是不许的。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

发新话题