一个简单的问题,100分哦

duaneye 2003-10-15 06:00:19
如何通过邮件地址获得smtp服务器名称?
比如如何通过aaa@sohu.com获得smtp服务器是“smtp.sohu.com”或得到ip地址是61.135.132.125
...全文
35 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
顾君彦 2003-10-15
  • 打赏
  • 举报
回复
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
using System.Collections;

namespace GUNetwork.NetLib.DNS
{
/// <summary>
/// MxRecord 通过指定的DNS获取指定邮件域名的MX记录。
/// </summary>
public class MxRecordData
{
public int preference = -1;
public string exchange = null;
public override string ToString()
{
return exchange;
}
public MxRecordData()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}
public class DNSMxRecord
{
private int position, id, length;
private string name;
private ArrayList dnsServers;
private static int DNS_PORT = 53;
Encoding ASCII = Encoding.ASCII;

/// <summary>
/// 构造方法,设置查询的DNS服务器
/// </summary>
/// <param name="DnsServers"></param>
public DNSMxRecord(string[] DnsServers)
{

id = DateTime.Now.Millisecond * 60;
dnsServers = new ArrayList();
foreach(string s in DnsServers)
{
dnsServers.Add(s);
}
}

/// <summary>
/// 获取MX记录
/// </summary>
/// <param name="host"></param>
/// <returns></returns>
public ArrayList getMXRecords(string host)
{
ArrayList mxRecords = null;

for(int i=0; i < dnsServers.Count; i++)
{
try
{
mxRecords = getMXRecords(host,(string)dnsServers[i]);
break;

}
catch(IOException)
{
continue;
}
}
return mxRecords;
}

/// <summary>
/// 根据指定的DNS服务器查找指定的主机的MX记录
/// </summary>
/// <param name="host"></param>
/// <param name="serverAddress"></param>
/// <returns></returns>
public ArrayList getMXRecords(string host,string serverAddress)
{
UdpClient dnsClient = new UdpClient(serverAddress, DNS_PORT);
byte[] data=makeQuery(getNewId(),host);
dnsClient.Send(data,data.Length);
IPEndPoint endpoint = null;
data = dnsClient.Receive(ref endpoint);
length = data.Length;
return makeResponse(data);
}

private int getNewId()
{
return ++id;
}
/// <summary>
/// 组织查询数据包
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
///
private byte[] makeQuery(int id,string name)
{

byte[] data = new byte[512];

for(int i = 0; i < 512; ++i)
{
data[i] = 0;
}

data[0] = (byte) (id >> 8);
data[1] = (byte) (id & 0xFF );
data[2] = (byte) 1; data[3] = (byte) 0;
data[4] = (byte) 0; data[5] = (byte) 1;
data[6] = (byte) 0; data[7] = (byte) 0;
data[8] = (byte) 0; data[9] = (byte) 0;
data[10] = (byte) 0; data[11] = (byte) 0;

string[] tokens = name.Split(new char[] {'.'});
string label;

position = 12;

for(int j=0; j<tokens.Length; j++)
{

label = tokens[j];
data[position++] = (byte) (label.Length & 0xFF);
byte[] b = ASCII.GetBytes(label);

for(int k=0; k < b.Length; k++)
{
data[position++] = b[k];
}

}
data[position++] = (byte) 0 ; data[position++] = (byte) 0;
data[position++] = (byte) 15; data[position++] = (byte) 0 ;
data[position++] = (byte) 1 ;

return data;

}

/// <summary>
/// 解回应的数据包
/// </summary>
/// <returns></returns>
private ArrayList makeResponse(byte[] data)
{

ArrayList mxRecords = new ArrayList();
MxRecordData mxRecord;

int qCount = ((data[4] & 0xFF) << 8) | (data[5] & 0xFF);
if (qCount < 0)
{
throw new IOException("invalid question count");
}

int aCount = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF);
if (aCount < 0)
{
throw new IOException("invalid answer count");
}

position=12;

for( int i=0;i<qCount; ++i)
{
name = "";
position = proc(position,data);
position += 4;
}

for (int i = 0; i < aCount; ++i)
{

name = "";
position = proc(position,data);

position+=10;

int pref = (data[position++] << 8) | (data[position++] & 0xFF);

name="";
position = proc(position,data);

mxRecord = new MxRecordData();

mxRecord.preference = pref;
mxRecord.exchange = name;

mxRecords.Add(mxRecord);

}

return mxRecords;
}

private int proc(int position,byte[] data)
{

int len = (data[position++] & 0xFF);

if(len == 0)
{
return position;
}

int offset;

do
{
if ((len & 0xC0) == 0xC0)
{
if (position >= length)
{
return -1;
}
offset = ((len & 0x3F) << 8) | (data[position++] & 0xFF);
proc(offset,data);
return position;
}
else
{
if ((position + len) > length)
{
return -1;
}
name += ASCII.GetString(data, position, len);
position += len;
}

if (position > length)
{
return -1;
}

len = data[position++] & 0xFF;

if (len != 0)
{
name += ".";
}
}while (len != 0);
return position;
}
}

}
freexin 2003-10-15
  • 打赏
  • 举报
回复
使用DNS就可以拿到了,关键是认识53端口和DNS协议标准
kwklover 2003-10-15
  • 打赏
  • 举报
回复
不会,帮你顶一下了
rgbcn 2003-10-15
  • 打赏
  • 举报
回复
难倒了
libjprayerlibj 2003-10-15
  • 打赏
  • 举报
回复
这还是简单的问题,我晕
ahui_net 2003-10-15
  • 打赏
  • 举报
回复
原则上是不能的淡foxmail的特快专递做到了,不知道是怎么做的
因为你的61.135.132.125 是通过smtp.sohu.com得到的
而aaa@sohu.com 是不能得到smtp.sohu.com
smtp.sohu.com的邮件头只包含了最后一层smtp信息

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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