首页 新闻 搜索 专区 学院

关于uIP0.9的smtp客户端

0
悬赏园豆:20 [已解决问题] 解决于 2013-02-19 17:31

各位好:

我已经成功移植uIP0.9到我的51单片机上,并且测试了它的几个示例应用程序web server和smtp客户端。
并且我使用smtp客户端已经可以成功发出电子邮件,但是我的smtp server使用的是我自己的电脑(IIS自带的那个smtp server)。

我们公司有一台邮箱服务器上安装了两个smtp server,有两个域名,但由于安全原因,不能直接对它的IP地址进行访问,我使用ping命令也是不通的,只能通过远程登录方式来连接它的25端口。

现在的要求是:我的单片机程序必须要连接到这台服务器上的smtp server来发邮件,但是客户端在连接这台服务器时需要提供用户名和密码,而且只能是域名的方式访问(可能还需要DNS),例如:mail.mycompany.com这样的域名,而uIP0.9中的uip_connect只有两个参数,一个是服务器的IP地址,一个是端口号,并没有提供输入域名,用户名及密码的接口。

可否改写uip的实现方法呢?麻烦各位兄弟给个思路,谢谢了!

我看到在uIP的smtp.c和smtp.h有如下的函数,应该是客户端与smtp服务器交互的过程,但有些地方看不明白,代码如下:

uIP0.9的smtp客户端示例程序有如下的一个函数:
相关的变量及宏定义:
#define STATE_SEND_NONE         0
#define STATE_SEND_HELO         1
#define STATE_SEND_MAIL_FROM    2
#define STATE_SEND_RCPT_TO      3
#define STATE_SEND_DATA         4
#define STATE_SEND_DATA_HEADERS 5
#define STATE_SEND_DATA_MESSAGE 6
#define STATE_SEND_DATA_END     7
#define STATE_SEND_QUIT         8
#define STATE_SEND_DONE         9

#define ISO_nl 0x0a
#define ISO_cr 0x0d

#define ISO_period 0x2e

#define ISO_2  0x32
#define ISO_3  0x33
#define ISO_4  0x34
#define ISO_5  0x35

char smtp_220[4] = 
/* 220 */
{0x32, 0x32, 0x30, };
char smtp_helo[6] = 
/* HELO  */
{0x48, 0x45, 0x4c, 0x4f, 0x20, };
char smtp_mail_from[12] = 
/* MAIL FROM:  */
{0x4d, 0x41, 0x49, 0x4c, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x3a, 0x20, };
char smtp_rcpt_to[10] = 
/* RCPT TO:  */
{0x52, 0x43, 0x50, 0x54, 0x20, 0x54, 0x4f, 0x3a, 0x20, };
char smtp_data[5] = 
/* DATA */
{0x44, 0x41, 0x54, 0x41, };
char smtp_to[5] = 
/* To:  */
{0x54, 0x6f, 0x3a, 0x20, };
char smtp_from[7] = 
/* From:  */
{0x46, 0x72, 0x6f, 0x6d, 0x3a, 0x20, };
char smtp_subject[10] = 
/* Subject:  */
{0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x20, };
char smtp_quit[5] = 
/* QUIT */
{0x51, 0x55, 0x49, 0x54, };

static void senddata(struct smtp_state *s)    
{
  char *textptr;

  if(s->textlen != 0 &&
     s->textlen == s->sendptr) {
    return;
  }

  textptr = (char *)uip_appdata;
  switch(s->state) {
  case STATE_SEND_HELO:
    /* Create HELO message. */
    strcpy(textptr, smtp_helo);
    textptr += sizeof(smtp_helo) - 1;
    strcpy(textptr, localhostname);
    textptr += strlen(localhostname);
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    /*    printf("s->sendptr %d\n", s->sendptr);*/
    if(s->sendptr == 0) {
      s->textlen = textptr - (char *)uip_appdata;
      /*      printf("s->textlen %d\n", s->textlen);*/
    }
    textptr = (char *)uip_appdata;
    break;      
     case STATE_SEND_MAIL_FROM:
    /* Create MAIL FROM message. */
    strcpy(textptr, smtp_mail_from);
    textptr += sizeof(smtp_mail_from) - 1;
    strcpy(textptr, s->from);
    textptr += strlen(s->from);
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    if(s->sendptr == 0) {
      s->textlen = textptr - (char *)uip_appdata;
    }
    textptr = (char *)uip_appdata;
    break;
  case STATE_SEND_RCPT_TO:
    /* Create RCPT_TO message. */
    strcpy(textptr, smtp_rcpt_to);
    textptr += sizeof(smtp_rcpt_to) - 1;
    strcpy(textptr, s->to);
    textptr += strlen(s->to);
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    if(s->sendptr == 0) {
      s->textlen = textptr - (char *)uip_appdata;
    }
    textptr = (char *)uip_appdata;
    break;
  case STATE_SEND_DATA:
    strcpy(textptr, smtp_data);
    textptr += sizeof(smtp_data) - 1;
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    if(s->sendptr == 0) {
      s->textlen = textptr - (char *)uip_appdata;
    }
    textptr = (char *)uip_appdata;
    break;
  case STATE_SEND_DATA_HEADERS:
    /* Create mail headers-> */
    strcpy(textptr, smtp_to);
    textptr += sizeof(smtp_to) - 1;
    strcpy(textptr, s->to);
    textptr += strlen(s->to);
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    
    strcpy(textptr, smtp_from);
    textptr += sizeof(smtp_from) - 1;
    strcpy(textptr, s->from);
    textptr += strlen(s->from);
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    
    strcpy(textptr, smtp_subject);
    textptr += sizeof(smtp_subject) - 1;
    strcpy(textptr, s->subject);
    textptr += strlen(s->subject);
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    
    if(s->sendptr == 0) {
      s->textlen = textptr - (char *)uip_appdata;
    }
    textptr = (char *)uip_appdata;
    break;
  case STATE_SEND_DATA_MESSAGE:
    textptr = s->msg;
    if(s->sendptr == 0) {
      s->textlen = s->msglen;
    } 
    break;
  case STATE_SEND_DATA_END:
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    *textptr = ISO_period;
    ++textptr;
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    if(s->sendptr == 0) {
      s->textlen = 5;
    }
    textptr = (char *)uip_appdata;
    break;
  case STATE_SEND_QUIT:
    strcpy(textptr, smtp_quit);
    textptr += sizeof(smtp_quit) - 1;
    *textptr = ISO_cr;
    ++textptr;
    *textptr = ISO_nl;
    ++textptr;
    if(s->sendptr == 0) {
      s->textlen = textptr - (char *)uip_appdata;
    }
    textptr = (char *)uip_appdata;
    break;
  default:
    return;
  }

  textptr += s->sendptr;
  
  if(s->textlen - s->sendptr > uip_mss()) {
    s->sentlen = uip_mss();
  } else {
    s->sentlen = s->textlen - s->sendptr;
  }

  /*  textptr[s->sentlen] = 0;
      printf("Senidng '%s'\n", textptr);*/
  
  uip_send(textptr, s->sentlen);
}
我大概知道这是与smtp服务器进行连接并发送邮件的过程,因为与服务器进行连接大概的命令如下:
1、HELO
2、AUTH LOGIN
3、MAIL FROM
4、RCPT TO
5、DATA
但是它里面没有AUTH_LOGIN这一步,但这只适用于匿名访问的smtp服务器,我们公司的smtp服务器是需要邮箱帐号和密码的,直接使用IP地址是使用不了的,但是我想知道第二步这个AUTH_LOGIN该怎么实现?
如位大侠能把上面的变量意义及程序的实现帮忙解释下么,这个函数肯定需要修改才能实现我需要的功能的。急啊,谢谢各位了!

健美明星的主页 健美明星 | 初学一级 | 园豆:101
提问于:2013-01-21 09:33
< >
分享
最佳答案
0

已经在你另一个提问里面回答。如果还有不清楚的问题,可以QQ。我的QQ,我主页里面应该写了。

收获园豆:20
BLoodMaster | 初学一级 |园豆:135 | 2013-01-23 02:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册