关于linux下面的SMTP邮件服务器转发程序开发

HengStar 2011-01-02 11:41:37
我要做一个SMTP邮件转发服务器,通讯协议部分已经基本完成,但是现在遇到的问题是如何通过客户端发过来的邮箱地址解析对应的SMTP服务器地址,我用system函数执行了nslookup -type=mx 126.com >/root/桌面/ret.dat,先把查询结果保存到到ret.dat中,然后解析,下面是查询结果
Server: 211.161.46.84
Address: 211.161.46.84#53

Non-authoritative answer:
126.com mail exchanger = 10 126mx01.mxmail.netease.com.
126.com mail exchanger = 10 126mx02.mxmail.netease.com.
126.com mail exchanger = 50 126mx00.mxmail.netease.com.

Authoritative answers can be found from:
126.com nameserver = ns4.nease.net.
126.com nameserver = ns2.nease.net.
126.com nameserver = ns3.nease.net.
ns2.nease.net internet address = 114.113.197.12
ns3.nease.net internet address = 220.181.28.4
ns4.nease.net internet address = 61.135.255.140
我从程序中取出ip地址211.161.46.84,端口号25创建socket进行连接,但是得到错误信息是Connection refused,我不知道是不是我取错了IP地址,下面是我的部分解析地址的源码

//直接发送到目的地,
// 参数pHostAddr为"126.com"
int SendSmtpMailDirect(char* pHostAddr) //relay
{
struct hostent* pHost = NULL;
int nSockServer;
char szBuffer[ECHOMAX];
struct sockaddr_in SockAddr;
short sPort = 25;
char pServerAddr[128];
memset(pServerAddr, 0, sizeof(pServerAddr));
/*将查询到的SMTP地址信息保存到文件*/
sprintf(pServerAddr, "nslookup -type=mx %s >./mxAddr.dat", pHostAddr);
if( system(pServerAddr) == -1 )
{
perror("nslookup");
exit(1);
}

FILE* pFile = fopen("./mxAddr.dat", "r");

if(pFile)
{
char strTemp[8];
int bOK = 0;
while( fgets(szBuffer, ECHOMAX, pFile) )
{
strncpy(strTemp, szBuffer, 8);
strTemp[7] = '\0';
if(strcasecmp(strTemp, "Address") == 0)
{
int i = 8;
int nStart = 0;
/* 找到地址的开始位置 */
for(; i < ECHOMAX; i++)
{
if(szBuffer[i] >= '0' && szBuffer[i] <= '9')
{
nStart = i;
break;
}
}
i = 0;
/* 拷贝地址*/
for(; nStart < ECHOMAX; nStart++)
{
if( (szBuffer[nStart] >= '0' && szBuffer[nStart] <= '9') || szBuffer[nStart] == '.' )
{
pServerAddr[i++] = szBuffer[nStart];
}
else
{
pServerAddr[i] = '\0';
bOK = 1;
break;
}
}
}
if(bOK)
{
break;
}
}
}

/*if((pHost=gethostbyname(pHostAddr))==NULL) {
herror("gethostbyname出错!");
exit(1);
}*/

nSockServer = socket(AF_INET, SOCK_STREAM, 0);
if (nSockServer < 0)
{
perror("server socket");
close(nSockServer);

return 1;
}

memset(&SockAddr, 0, sizeof(SockAddr));
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = htons(sPort);
SockAddr.sin_addr.s_addr = inet_addr(pServerAddr);


int err;
/* 这里连接被拒绝了 */
if (connect(nSockServer, (struct sockaddr *)&SockAddr, sizeof(SockAddr)))
{
perror("server connect");
close(nSockServer);

return 1;
}
}

望高人赐教

另外附带一个问题是我想知道为什么客户端给我发送完Data然后是subject等内容,我回复250 OK\r\n过去之后却发给我rset,然后是quit?
...全文
150 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
plusplus2010 2011-01-03
  • 打赏
  • 举报
回复
126.com mail exchanger = 10 126mx01.mxmail.netease.com.
126.com mail exchanger = 10 126mx02.mxmail.netease.com.
126.com mail exchanger = 50 126mx00.mxmail.netease.com.

才是你要找的邮件服务器。
plusplus2010 2011-01-03
  • 打赏
  • 举报
回复
211.161.46.84 是你的DNS服务器。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧