您的位置:首页 > 编程语言 > PHP开发

smtp客户端程序问题记录

2007-02-07 20:03 405 查看
近日调试smtp客户端,遇到一个特殊问题

使用cmail server,

发送DATA命令后,cmail server没有响应,但是有的smtp服务器好用,分析很长时间没有分析明白,后来发现是因为发送的时候,使用的如下语句

write(sock , "DATA/r/n", 100);

这个时候,服务器可能会判断字符串的长度为100,和DATA命令不匹配,导致一些特殊问题,如果指定的长度是字符串的长度,就没有问题了。

这个问题是由于没有良好的编成习惯和牢固的基础知道导致的。需要注意。

过程分析:

开始调试下面的程序,没有问题,然后移植代码,发现对有的服务器好用,有的不好用。这个时候没有仔细的分析自己的代码,确到处找原因,找服务器的原因,环境的原因。最后通过一点点比较程序的差异,修改程序,才发现问题。应该对程序进行仔细检查。过程中过分相信自己的代码。调式方法不正确。基础知识欠缺。希望自己以后不要犯这种错误了。

把一个简单的代码贴出来,分享,也是从网络上找的代码,然后进行修改,没有对错误进行处理,没有认证的过程,适用于类UNIX系统。

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

void _exit(int status);

#define HELO "HELO/r/n"

#define DATA "DATA/r/n"

#define QUIT "QUIT/r/n"

FILE *fin;

int sock;

struct sockaddr_in server;

struct hostent *hp, *gethostbyname();

char buf[99+1];

int len;

char *host_id;

char *from_id;

char *to_id;

char *file_id;

char wkstr[100];

char hostname[100];

/*=====Send a string to the socket=====*/

send_socket(char *s)

{

int ret;

ret = write(sock,s,strlen(s));

if (ret < 0)

printf("send error :%s/n", strerror(errno));

write(1,s,strlen(s));

}

/*=====Read a string from the socket=====*/

read_socket()

{

len = read(sock,buf,99);

write(1,buf,len);

}

/*=====MAIN=====*/

int main(int argc, char* argv[])

{

if(argc != 5)

{

printf("USAGE: %s <host> <from> <to> <filename>/n/n", argv[0]);

return 1;

}

host_id=argv[1];

from_id=argv[2];

to_id=argv[3];

file_id=argv[4];

/*=====Create Socket=====*/

sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock==-1)

{

perror("opening stream socket");

return 1;

}

/*=====Verify host=====*/

server.sin_family = AF_INET;

hp = gethostbyname(host_id);

if (hp==(struct hostent *) 0)

{

fprintf(stderr, "%s: unknown host/n", host_id);

return 2;

}

/*=====Connect to port 25 on remote host=====*/

printf ("hostent %s/n", hp->h_addr_list[0]);

memcpy((char *) &server.sin_addr, (char *) hp->h_addr, hp->h_length);

server.sin_port=htons(25); /* SMTP PORT */

if (connect(sock, (struct sockaddr *) &server, sizeof server)==-1)

{

perror("connecting stream socket");

return 1;

}

/*=====Write some data then read some =====*/

read_socket(); /* SMTP Server logon string */

send_socket(HELO); /* introduce ourselves */

read_socket(); /*Read reply */

send_socket("MAIL from"); /* Mail from us */

send_socket(from_id);

send_socket("/r/n");

read_socket(); /* Sender OK */

send_socket("RCPT To: "); /*Mail to*/

send_socket(to_id);

send_socket("/r/n");

read_socket(); /*Recipient OK*/

send_socket(DATA);/*body to follow*/

read_socket(); /*ok to send */

fin=fopen(file_id, "r"); /* open file */

while(1)

{

if(fgets(wkstr, 100, fin)==NULL) break; /* exit on EOF */

send_socket(wkstr);

}

fclose(fin); /* close file */

send_socket("/r/n./r/n");

read_socket(); /* OK*/

send_socket(QUIT); /* quit */

read_socket(); /* log off */

/*=====Close socket and finish=====*/

close(sock);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐