无需smtp服务器直接发送邮件
January/20th 2011

 

    以前发邮件都是连接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



20902 read 17 comment(s)
#1
王道中强流   2011年01月21号 11:01       回复
哇靠 太棒了 专业
#2
宁波网站建设   2011年01月22号 11:14       回复
可以用其它的协议发邮件的啊?
#3
mohock   2011年01月23号 22:12       回复
哈哈,哥你太神了~~这东西很有用哦!
#4
kookxiang   2011年02月10号 19:00       回复
很爽,抄袭去……
#5
kookxiang   2011年02月10号 21:00       回复
fsockopen太没效率了……
#6
longbill   2011年02月10号 21:03       回复
@kookxiang fsockopen凭什么没效率?
#7
kookxiang   2011年02月10号 21:06       回复
@longbill 建立连接花了1s多……
发个邮件1.5s……
#8
longbill   2011年02月10号 21:37       回复
@kookxiang 这是你网络慢啊………
#9
kookxiang   2011年02月10号 21:42       回复
@longbill 郁闷了,discuz自带的函数不会啊……
#10
longbill   2011年02月10号 21:53       回复
@kookxiang 不可能。 要不他用异步方式,就是先将邮件内容存到数据库,再用一个进程一直跑,发送那个表里面的邮件。
#11
情趣用品   2011年03月26号 14:13       回复
进来看看学习一下下
#12
武汉网站建设   2011年03月31号 19:03       回复
我太喜欢了
#13
kookxiang   2011年05月14号 22:47       回复
蛋疼了,QQ提示:被拦截(系统拦截)
SPF记录也做了,DNSPOD查询显示全国都生效了,可还是这么悲剧,求解  = =
#14
longbill   2011年05月14号 22:48       回复
@kookxiang 可能跟内容有关吧。   影响的因素很多。。。我也说不清楚
#15
kookxiang   2011年05月14号 22:49       回复
@longbill 不会吧,之前一直都行的,可能是这次服务器改了ip,QQ没反应过来……内容跟之前的一样,只是邀请码而已……
#16
Jason   2013年11月15号 15:54       回复
@kookxiang 您好,我也遇到了这个问题。发送给QQ邮箱,前几天都可以的,现在就不行了,请问现在有解决方案吗?谢谢。感谢刘春龙大神的代码
#17
Jason   2013年11月15号 15:56       回复
@kookxiang 您好,我也遇到了这个问题。发送给QQ邮箱,前几天都可以的,现在就不行了,请问现在有解决方案吗?谢谢。感谢刘春龙大神的代码
添加新的评论
称呼:*
邮件:*
网站:
内容:

Copyright © Longbill 2008-2024 , Designed by EndTo , Powered by EndCMS