以前发邮件都是连接smtp服务器然后再发送的。比如先用自己的gmail账号连接到smtp.gmail.com,认证之后再发送邮件。但是这种方式常常会有限制,发送速度慢不说,每日发送数量还有限制。
后来一直在想邮件服务器之间是怎么发送的呢,如果可以直接连接对方mail服务器就好了。 经过很多尝试都不行,现在知道是因为各个邮件服务器都有反垃圾邮件机制,所以要做很多预备工作才可以。
下面我以 longbill@php.js.cn 为发送者发送邮件为例,讲讲这种直接连对方服务器发送邮件的方式。
首先需要设置 php.js.cn 域名的 txt 记录为:v=spf1 ip4:173.230.145.228 ~all 。意思是增加一个spf记录,允许173.230.145.228ip发送邮件。邮件服务器收到邮件的时候会检查这个。
然后设置 php.js.cn 的 MX记录为 173.230.145.228 。这点按理说是不需要的,但是我觉得还是加上比较好。 意思是别人发送邮件到 xxx@php.js.cn 的时候,会被连接到这个IP。
然后就可以用php直接发送邮件了。 php要做的事情如下:
- 拿到对方email后,首先检查域名的mx记录。例如 longbill.cn@gmail.com ,要用getmxrr函数得到gmail.com的mx记录,一般取第一条就可以了。
- 用fsockopen连接刚刚得到的服务器域名
- 按照SMTP协议写命令,取得返回结果。
看起来像这样: 绿色的是服务器返回的信息,红色的是php发送的信息。每个换行都是\r\n
220 126.com Anti-spam GT for Coremail System (126com[20101010])
HELO php.js.cn
250 OK
MAIL FROM:<longbill@php.js.cn>
250 Mail OK
RCPT TO:<lclgg@126.com>
250 Mail OK
DATA
354 End data with <CR><LF>.<CR><LF>
MIME-Version: 1.0
Delivered-To: lclgg@126.com
Subject: =?UTF-8?B?6L+Z6YeM5piv5rWL6K+V6YKu5Lu25qCH6aKY?=
From: Longbill <longbill@php.js.cn>
To: lclgg@126.com
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
6L+Z6YeM5piv5rWL6K+V6YKu5Lu25YaF5a6544CC
.
250 Mail OK queued as mx9,J8mowLDb7+xoCDdNCIe9AA--.240S2 1295452266
QUIT
221 Bye
就是这样。 源代码在这里。 http://php.js.cn/down/sample/mail.php.txt
21130 read 17 comment(s)
邮件:*
网站:
内容:
发个邮件1.5s……
SPF记录也做了,DNSPOD查询显示全国都生效了,可还是这么悲剧,求解 = =