大部分人都知道发送邮件可以用 SmtpClient 连到中转服务器上来发送邮件。
哪我们能知道邮件到底有没有发送成功呢。 也许有人会建议说搞一个 POP3 来收邮件, ok这是思路之一。
但是有一个问题是你在用这个邮件发送的时候你常常直接提示别人说邮件已经发送成功,这似乎不是很好。
大部分人都知道发送邮件可以用 SmtpClient 连到中转服务器上来发送邮件。
哪我们能知道邮件到底有没有发送成功呢。 也许有人会建议说搞一个 POP3 来收邮件, ok这是思路之一。
但是有一个问题是你在用这个邮件发送的时候你常常直接提示别人说邮件已经发送成功,这似乎不是很好。
我们来看一下传统寄邮件的流程, 我们信放到邮箱, 然后邮局的人会把信送到某个人哪边,
简单的抽象后邮局就是相当于中转服务器, ok。 哪我直接把哪封信投到对方家里的邮箱是不是也是ok的了?
电子邮件同样可以这样做。哪我什么知道对方家在哪里,这个实际上就记录在 MX记录里 MX Mail Exchanger 邮件交换记录 主要有两个值 MX preference(优先级越小的优先级越大) , mail exchanger 地址了(可以是A记录 Cname,ip)
![](https://images.cnblogs.com/cnblogs_com/lovebanyi/2565093.png)
通过Windows自带的的一个小程序 NsLooup 我们就可以查询到这些了
ok得到哪个地址后你就可以直接发送了.. 如果还想玩命令行你就可以 Telnet 163mx00.mxmail.netease.com
(一些系统如Vista Telnet好象默认没开,要自己去开)
然后按照邮件发送的协议一行一行敲下去了。
ok现在我们来看一下如何使用c#来完成这些工作
里面核心部分同样还是协议 Socket通信,
我们去://www.codeproject.com/ 搜一下就可以找到好多现成的DNS查询组件可以使用了
(曾经也有人喜欢用C#调用Nslookup)
我这边用的是 DNSQuery
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
Request request = new Request();
request.AddQuestion(new Question(domain, DnsType.MX, DnsClass.IN));
// send it to the DNS server and get the response
Response response = Resolver.Lookup(request, dnsServer);
// check we have a response
if (response == null)
{
return null;
}
else
{
List<MXRecord> mxRecordList = new List<MXRecord>();
foreach (var item in response.Answers)
{
MXRecord mxrecord = (MXRecord)item.Record;
mxRecordList.Add(mxrecord);
}
mxRecordList.Sort(CompareByPerformance);
List<IPAddress> iplist = new List<IPAddress>();
foreach(var item in mxRecordList)
{
IPHostEntry entry = System.Net.Dns.GetHostEntry(item.DomainName);
foreach (var item2 in entry.AddressList)
{
iplist.Add(item2);
}
}
MxRecordCache[domain] = iplist;
return iplist;
}
///发送方法1 mail用我们的老朋友就可以了
SmtpClient client = new SmtpClient(mx 得到的smtp地址, 25);
client.Send(message);
///来发送
///这边的错误报告需要Try Catch 并且会丢失掉一些错误信息, 信息被隐藏了
///发送方法2 使用Direct smtpClinet的 demo
using DirectSMTPClient;
MailMessage mailMsg =
/*创建你自己的mail message, 这边一次只能发一个人, (多个人的还没有处理在livemail的服务器cc的地址同样也是livemail自动发送成功, ) */
mailMsg.Subject = "ssssss";
mailMsg.Body = "<html>test</html>";
mailMsg.IsBodyHtml = true;
SendReport report= new SendReport();
bool result =DirectSMTPClient.DirectSmtpClient.Send(mailMsg, ref report);//发送 report 哪边我们可以得到错误报告
同样通过这个,或者自己架的smtp服务器,我们可以干很多的坏事。
DirectSMTPClient.rar(发邮件的过程类似于传统的邮件过程,你将信放到信箱(中转服务器) 邮递员将信 放到收件人的信箱 ,收信人去拿信。)
(反垃圾邮件是由接收者设制的。有很多规则,每个产商都可能不一样。 )
(用这个发送假冒邮件,后果自已承担。)