rt

解决方案 »

  1.   

    应该只能问邮件提供商了一般都会在网站的FAQ或者其他地方写明具体的SMTP和POP3的服务器地址
      

  2.   

    几个回答的都不到点子上啊,学过DNS解析没有啊,解析MX记录就行了,windwos自带的nslookup就行,我自己也写过解析程序
      

  3.   

    // DNS.cpp : 定义控制台应用程序的入口点。
    //#include "stdafx.h"
    #include <stdio.h>
    #include"conio.h"
    #include <winsock.h>
    #include "iphlpapi.h"
    #include "windows.h"
    #include "MY.h"
    /***********************************************
    *    *
    * 计算字符串长度,以 0 , 0xC0结尾 并加1   *
    *    *
    * 参数 = 字符字针                        *
    * 返回值 = 长度                          *
    *                                              *
    *    *
    ************************************************/
    int getStrLenM(BYTE *chStr) 
    {
    int i = 0 ; while(*(chStr+i))
    {
    if(*(chStr+i) == 0xC0)
    {
    i++;
    break;

    }
    i++;
    } i++; return i ;
    };
    /**************************************************
     
     DNS函数
     char *DNSName = 域名
     IpAdd  = 返回的IP地址
    *************************************************/int DNSLook(char *DNSName,ULONG *IpAdd)
    {
    //主要配置参数 unsigned short  QueryTyep = 15;           //查询类型 int DNStimewait = 3 ;   //DNS的UDP超时设置,单位秒 /*********************************************

    得到DNS服务器IP地址 *********************************************/
    int i = 0 ; DWORD dwError = 0 ; //错误代码 FIXED_INFO IpBuff[10]; //IP配置缓冲 unsigned long size = sizeof(IpBuff);//得到缓冲大小 PULONG pSize = &size;  dwError = GetNetworkParams(IpBuff,pSize); //执行 if(dwError) 
    return 1;   //错误判断 IP_ADDR_STRING *IpList = &(IpBuff->DnsServerList) ; //得到DNS服务器地址
    //得到DNS服务器IP地址结束 /*********************************************

    初始化SOCKET连接 *********************************************/
    WSADATA             wsaData; WSAStartup(MAKEWORD(2,2), &wsaData); struct sockaddr_in server; server.sin_family=AF_INET; server.sin_port=htons(53);                          //DNS的server的监听端口

    SOCKET s; s = socket(AF_INET,SOCK_DGRAM,0); int len =sizeof(server); BYTE Buff[1024]="\0";    //缓冲 u_long ul = 1;

    int nRet = ioctlsocket(s,FIONBIO,(u_long *)&ul); //设置为非锁定模式
    if(nRet == -1) printf("非锁定模式设置错误");

    //初始化SOCKET连接结束 /*********************************************

    发送数据据包构造 *********************************************/
    DnsHeader *DNSH;
    DNSH = (DnsHeader *)Buff ; DNSH->id = 0x0110 ; DNSH->flags = 0x0001;
    DNSH->quests = 0x0100 ; 
    DNSH->answers = 0 ;
    DNSH->author = 0 ;
    DNSH->addition = 0; /*-------------------------------------
    DNS名称格式 www.17173.com = (3)www(5)17173(3)com DNS名称构造


    -------------------------------------*/
    i = 0 ; BYTE *p; // "." 的位置
    int  str = 0 ; //"."后有几位

    p = (BYTE *)(Buff+12); //初始位置 while(DNSName[i])       //循环到0
    {
    if( DNSName[i] == 0x2e)  //当前位置为"."时
    {
    *p = str ;               //回到上个"."位写数字
    p = (BYTE *)(Buff+13+i); //指针移动当前位
    str = -1 ;
    }
    else
    {

    *(Buff+13+i) = DNSName[i];

    };
    str++;
    i++;
    }

    *p = str ;            *(Buff+13+i) = 0 ;  //最后加0
    //DNS名称构造结束 DNSQUERY *Query; Query = (DNSQUERY *)(Buff+14+i); Query->type = htons(QueryTyep); Query->classes = 0x0100;
    //发送数据据包构造结束 /*********************************************

    发送DNS数据和接收数据 *********************************************/

    int DNSLong = 18 + i  ; //16位选项 + 2个0的长度 + 字符长度,发送数据包长度 int timesend = 0 ;      // BOOL DNSflag = false ;  //是否收到数据的标志 for(IpList ; IpList ; IpList = IpList->Next) //遍历所有DNS的IP地址
    {
    server.sin_addr.s_addr=inet_addr(IpList->IpAddress.String); //DNS的server的地址 网通DNS地址 218.108.248.200 218.108.248.225IpList->IpAddress.String for( i = 0 ; i < 3 ; i++)   //每个地址发送3个包
    {
    if (!sendto(s,(const char *)Buff,DNSLong,0,(struct sockaddr*)&server,len))  //发送数据包
    {
    closesocket(s);
    return 1;
    } timesend = time(NULL); //返回到当前秒数


    while(((DNStimewait+timesend) >= time(NULL)))  //超时返回
    {
    Sleep(1);
    if(recvfrom(s,(char *)Buff,1000,0,(struct sockaddr*)&server,&len) >0 )
    {
    DNSflag = true;         //当收到数据时设为真
    break; //退出循环
    }
    };

    if(DNSflag) 
    break;
    }
    if(DNSflag) 
    break;

    }
    if(!DNSflag) 
    {
    closesocket(s);
    printf("DNS服务器不可用");
    return 1;
    }
    //******判断接收的数据包是否正确 if(DNSH->id != 0x0110)
    {
    closesocket(s);
    printf("DNS序列号错误");
    return 1;
    }
    if(!DNSH->addition) 
    {
    closesocket(s);
    printf("没有可用域名");
    return 1;

    //=======DNS包发送和接收结束

    /*********************************************

    解析返回DNS数据包 *********************************************/ int Namele = 12 ; //解析数据位置相对于BUFF的偏移,开始12,跳过12个的DNS头 

    //解析quests
    short temp = ntohs(DNSH->quests);   for(temp ; temp ; temp--)
    {

    Namele += getStrLenM(Buff+12) + 4; } //解析answers
    temp = ntohs(DNSH->answers); for(temp ; temp ; temp--)
    {

    Namele += getStrLenM(Buff+Namele)+12;
    Namele += getStrLenM(Buff+Namele);
    }
    //解析author
    temp = ntohs(DNSH->author); for(temp ; temp ; temp--)
    {
    Namele += getStrLenM(Buff+Namele) + 10;
    Namele += getStrLenM(Buff+Namele); }
    //解析IP地址
    BYTE *TempIP; temp = ntohs(DNSH->addition); int ii = 0 ; for(temp ; temp ; temp--)
    {
    TempIP = reinterpret_cast<BYTE*>(&IpAdd[ii]); //把IpAdd的首地址传给TempIP, ii++; Namele += getStrLenM(Buff+Namele) + 10;

    for( i = 0 ; i < 4 ; i++)                       //得到IP地址
    TempIP[i] = Buff[Namele+i]; Namele += 4;

    };

    closesocket(s); //关闭socket return 0;
    }int main(int argc, CHAR* argv[])
    {
    char DNSName[] = {"tom.com"}; ULONG IpAdd[20];

    memset(IpAdd,0,sizeof(IpAdd)); DNSLook(DNSName,IpAdd);
    int i = 0 ; int aa = 0 ;

    BYTE *TempIP;
    for(IpAdd[i] ; IpAdd[i] ; i++)
    {
    TempIP = reinterpret_cast<BYTE*>(&IpAdd[i]); //把IpAdd的首地址传给TempIP,-1是为了让IpAdd[0]有数据
    printf("\nIP地址为=");
    for(aa = 0 ; aa < 4 ; aa++)
    printf("%d.",*(TempIP+aa) );

    } getch(); return 0 ; 
    };
      

  4.   

    typedef struct DnsHeader
    {
    unsigned short id;      //1
    unsigned short flags;   //2
    unsigned short quests;  //3
    unsigned short answers; //4
    unsigned short author;  //5
    unsigned short addition;//6
    }DNS,*PDNS;typedef struct DnsQuery
    {
    unsigned short type;   //1
    unsigned short classes;//2
    }DNSQUERY,*DNSPQUERY;
    typedef struct DnsResponse
    {
    unsigned short name;  //1
    unsigned short type;  //2
    unsigned short classes;//3
    unsigned int ttl;      //4
    unsigned short length;//5
    unsigned int addr;    //6
    }DNSRESPONSE,*DNSPRESPONSE;
      

  5.   

    我的程序 smtp 查的出来,smtp有两类,一类是给公众用的,要登陆的那种,用DNS查的出来的是给服务器用的,直接发就行了,可能有一些简单的认证.
      

  6.   

    一般在申请的页面或者用户帮助中有说明.也有的Email根本不提供pop3 和smtp