使用了qq企业邮箱与gmail企业邮箱进行测试
qq企业邮箱:
如果使用帐号
[email protected]用于配置SmtpClient的话,如果From为
[email protected],则无法通过验证,qq对此禁止
gmail企业邮箱:
如果使用帐号
[email protected]用于配置SmptClient的话,如果From为
[email protected],则可以通过验证,不过收到的邮件From为
[email protected]而不是
[email protected]
所以还是选择直接投递,并且避免了验证。
直接投递,就会有几个问题,现在邮件服务对垃圾邮件都比较敏感,所以限制都比较高。(可是我并不想发垃圾邮件,只是测试唉。)
动态IP直接投递测试
Gmail 测试,允许
QQ测试,允许
Hotmail测试,不允许
Message: DY-001 Mail rejected by Windows Live Hotmail for policy reasons. We generally do not accept email from dynamic IP's as they are not typically used to deliver unauthenticated SMTP e-mail to an Internet mail server. http://www.spamhaus.org maintains lists of dynamic and residential IP addresses. If you are not an email/network admin please contact your E-mail/Internet Service Provider for help. Email/network admins, please visit http://postmaster.live.com for email delivery information and support
其它的邮箱就不测试了,都属于这两类。
在开发直接投递时,发现Gmail支持的太好了,不过太好也未必是好事,因为Gmail正常显示,Hotmail有时确是筹码,QQ则干脆不显示。所以要多测试几个邮箱。
-----------------------------------------------------------------------
开发直接投递大致思路
从
[email protected]发送到
[email protected]
1. 获取本机DNS地址,如果不存在,则使用Open Dns:208.67.222.222
2. 查找to的Smtp服务器地址
2.1
[email protected]的域名为qq.com
2.2 使用上面的DNS地址去查找qq.com的MX记录(按优先级排列)(
可以使用DNS查找开源类库)
返回mx1.qq.com, mx2.qq.com...
2.3 查找mx1.qq.com, mx2.qq.com的IP地址,这就是我们需要的Smtp服务器地址。
可以使用System.Net.Dns.GetHostEntry("mx1.qq.com")获取IP地址
3. 使用Socket从上面的Smtp服务器地址中取出一个可以连接的地址,进行通信。
IPEndPoint endPoint = new IPEndPoint(address, 25);
Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endPoint);
if (socket.Connected) {} // Connected为true表示可以通信
4. 接收socket数据前3位为状态码,后面为提示信息,检查状态码==SmtpStatusCode.ServiceReady
说明准备完毕
5. 发送数据HELO myHostName (握手)
5.1. 检查状态码==SmtpStatusCode.OK
6. 发送数据MAIL FROM: <
[email protected]>
6.1. 检查状态码==SmtpStatusCode.OK
7. 发送数据RCPT TO: <
[email protected]>
(CC之类的也都是这个命令)
7.1. 检查状态码==SmtpStatusCode.OK
8. 发送数据DATA
8.1. 检查状态码==SmtpStatusCode.StartMailInput (开始输入数据)
9. 发送邮件主体
9.1. 检查状态码==SmtpStatusCode.OK
10. 发送数据QUIT (退出)
10.1. 检查状态码==SmtpStatusCode.ServiceClosingTransmissionChannel
发送邮件主体,我们需要使用邮件的原始格式,可以装个邮件客户端进行查看。
其中会涉及到MIME邮件格式,可以查看 http://wenku.baidu.com/view/d59ab3e9856a561252d36fb8.html。