免费注册 查看新帖 |

Chinaunix

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

[Mail] unix下编写SMTP程序的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-17 10:44 |只看该作者 |倒序浏览
/****************************头文件********************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#define MAXLINE 1024

int sockfd,n;

void readn(int fd,char *recvline,int size)//字节流套接口读函数
{
        again:
        while((n = read(fd,recvline,MAXLINE)) > 0)
        {
                if(errno == EINTR)
                        goto again;
                recvline[n] = 0;/* null terminate */
                if(fputs(recvline,stdout) == EOF)
                {
                        printf("fputs error";
                        exit(0);
                }
        }
        if(n < 0)
        {
                printf("read error";
                exit(0);
        }
}

void writen(int fd,char *recvline,int size)//字节流套接口写函数
{
        size_t nleft;
        ssize_t nwritten;
        const char *ptr;
       
        ptr = recvline;
        nleft = size;
        while(nleft > 0)
        {
                if((nwritten = write(fd,ptr,nleft)) <= 0)
                {
                        if(errno == EINTR)
                                nwritten = 0; /* and call write() again */
                        else
                        {
                                printf("error"; /* error */
                                exit(0);
                        }                               
                }
                nleft -= nwritten;
                ptr   += nwritten;
        }       
}



/******************主程序******************************/

#include "mymail.h"

int
main(int argc,char **argv)
{               
        struct sockaddr_in servaddr;
        char sendline[MAXLINE];
        char recvline[MAXLINE];
        memset(&sendline,0x00,sizeof(sendline));
        memset(&recvline,0x00,sizeof(recvline));
       
        if(argc != 2)
        {
                printf("usage: mymail <IP address>\n";
                exit(0);
        }
       
        if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
        {
                printf("socket error\n";
                exit(0);
        }
       
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port   = htons(25);/* SMTP SERVER */
        if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0)
        {
                printf("inet_pton error for %s\n",argv[1]);
                exit(0);
        }
       
        if(connect(sockfd,(struct sockaddr*) &servaddr,sizeof(servaddr)) < 0)
        {
                printf("connect error";
                exit(0);
        }
        else
                printf("connection established at smtp port 25\n";
                       
        strcpy(sendline,"HELO xxx.xxx.xxx.xxx\r\n";               
        writen(sockfd,sendline,sizeof(sendline));
       
        strcpy(sendline,"MAIL FROM:<xxxx@xxxx.com>\r\n";
        writen(sockfd,sendline,sizeof(sendline));
               
        strcpy(sendline,"RCPT TO:<root@xxxx.com>\r\n";
        writen(sockfd,sendline,sizeof(sendline));
       
        readn(sockfd,recvline,MAXLINE);       
        shutdown(sockfd,SHUT_RDWR);       
       
        return(0);
}

运行环境:
FREEBSD4.9 Release
编译环境cc
运行结果
connection established at smtp port 25
220 online.sdb.com ESMTP Sendmail 8.12.9p2/8.12.9; Mon, 17 Jul 2006 10:37:25 +0)
250 online.sdb.com Hello online.sdb.com [10.24.3.61], pleased to meet you
500 5.5.1 Command unrecognized: ""
500 5.5.1 Command unrecognized: ""
500 5.5.1 Command unrecognized: ""

为什么啊?
有没高手帮着看一下啦,谢谢!

论坛徽章:
0
2 [报告]
发表于 2006-07-17 11:31 |只看该作者

我找到问题了,是WRITEN要一次写完

strcpy(sendline,"HELO 10.24.3.61\r\nMAIL FROM:<xxx@xxx.com>\r\nRCPT TO:<xxx@.com>\r\n";

论坛徽章:
0
3 [报告]
发表于 2006-07-17 15:12 |只看该作者

又有新问题了,用户认证怎么解决呀?

SMTP服务认证扩展
(RFC 2554 SMTP Service Extension for Authentication)
里有讲,但是看不明白,有谁能指点一下啦?
最好有个例子说明一下。谢谢

论坛徽章:
0
4 [报告]
发表于 2006-07-18 11:37 |只看该作者
strcpy(sendline,"EHLO hello\r\n";
        strcat(sendline,"AUTH LOGIN\r\n";
        strcat(sendline,encode_base64(6,username));
        strcat(sendline,"\r\n";       
        strcat(sendline,encode_base64(8,password));
        strcat(sendline,"\r\n";
        strcat(sendline,"MAIL FROM:<xxx@xxx.com> \r\n";
        strcat(sendline,"RCPT TO:<xxx@xxx.com>\r\n";
        strcat(sendline,"DATA\r\n";
        strcat(sendline,encode_base64(21,"从UNIX主机发来的邮件";
        strcat(sendline,"\r\n";
        strcat(sendline,"\r\n.\r\n";
        strcat(sendline,"QUIT\r\n");
        writen(sockfd,sendline,sizeof(sendline));
       
        readn(sockfd,recvline,MAXLINE);       
        shutdown(sockfd,SHUT_RDWR);       
有进展了,但又卡在了邮件认证通过后的地方不动了……


connection established at smtp port 25
220 xxx.xxx.com. ESMTP Service (Lotus Domino Release 6.0.3HF687) ready a0
250 xxx.com Hello xx.xx.xx.xx ([xx.xx.xx.xx]), pleased to meet you
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 Authentication successful
然后不动了……郁闷
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP