各位好:
我已经成功移植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该怎么实现?
如位大侠能把上面的变量意义及程序的实现帮忙解释下么,这个函数肯定需要修改才能实现我需要的功能的。急啊,谢谢各位了!
已经在你另一个提问里面回答。如果还有不清楚的问题,可以QQ。我的QQ,我主页里面应该写了。