邮件发送使用直接投递吧

使用了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。

你可能感兴趣的:(邮件发送)