您的位置主页 > PHP

介绍php的mail函数在WinXP+IIS环境下的应用/设置

php在IIS环境中的配置就不多说了,用windows下的php安装文件的话不会遇到什么问题。
困难的事情是发送电子邮件的设置,php有个默认的发送邮件的函数mail,这个函数的说明可以在php的官方网站找到(我觉得是官网,也不一定。。。):
[url=http://cn.php.net/manual/zh/ref.mail.php#ini.smtp][color=#0000ff]http://cn.php.net/manual/zh/ref.mail.php#ini.smtp[/color][/url]
貌似这个函数只支持没有身份验证的smtp服务器,所以要把本机上的smtp服务器开成没有身份验证的。
配置的过程中有两个问题:一是smtp的配置,二是php方面的配置(php.ini文件)。
smtp的配置,最终目标是使得IIS自带的smtp server可以正常的发信,这中间我经过了好几个步骤,还是学了点东西:
1. 启动smtp服务。PHP开发资源网[[url]http://php.phpres.com[/url]] = 全球最大的PHP中文社群 = PHPer的网上家园
打开iis,发现我这儿的“默认smtp虚拟目录”居然画了“叉”,不能用啊,右键启动,又说启动不了,请去“事件查看器”看log。这个“事件查看器”在控制面板->管理工具下面,smtp的事件信息在“系统”一栏,“来源”是“SMTPSVC”。
的确是有出错的项目,双击打开看,提示错误号115,请去下面的网站找:
[url=http://www.microsoft.com/contentredirect.asp][color=#0000ff]http://www.microsoft.com/contentredirect.asp[/color][/url]
这个是microsoft的技术支持网站,还是挺不错的,不过建议搜索的时候在英文网页中搜索,因为很多中文网页都是英文网页直接用翻译机翻译过来的,不容易看懂。。。
搜索smtpsvc 115 最后在这个网页找到了办法:
[url=http://support.microsoft.com/kb/322023/en-us][color=#0000ff]http://support.microsoft.com/kb/322023/en-us[/color][/url]
大致是说25端口被占用了,在cmd下用下面的命令查看,
Netstat -an | find ":25"
其实应该用 netstat -ano | find ":25",因为这样可以看到占用的进程id,然后再去任务管理器中查看对应的id,发现是ccproxy(我机器上开的一个代理服务器软件),也提供了smtp代理,占用了25端口,于是禁用ccproxy中的smtp代理服务,终于可以打开“默认smtp虚拟目录”了!
2. 调整smtp服务的权限:
这个是网上很多人问的问题,就是用php服务,在smtp服务打开的情况下,调用mail()函数,返回
[function.mail] SMTP server response: 550 5.7.1 Unable to relay
这个在下面这个网页找到了解决方案:
[url=http://blog.csdn.net/aifox/archive/2006/01/26/589117.aspx][color=#0000ff]http://blog.csdn.net/aifox/archive/2006/01/26/589117.aspx[/color][/url]
关键是:
“据说是中继的问题
然后依照指示
虚拟服务器->属性->访问->中继
将那个复选框选好,然后再添加了127.0.0.1的本地地址
测试,ok”
PHP开发资源网[[url]http://php.phpres.com[/url]] = 全球最大的PHP中文社群 = PHPer的网上家园
我也是按照这个步骤做的就对了,这个地方实际上是smtp本身的权限设置,就是允许哪些地址来的请求,居然本机地址不在默认允许之列(实际上默认允许之列没有任何地址)。这样就可以发邮件了。
3. php的配置:php.ini
找到windows目录下的php.ini文件,这是php的动态配置文件,里面内容很详细了,关于mail配置的是这一段:
[mail function]
; For Win32 only.
SMTP = localhost ; for Win32 only
smtp_port = 25
sendmail_from= [email=me@localhost][color=#0000ff]me@localhost[/color][/email] ; for Win32 only
其中sendmail_from是提交给smtp服务器的发信人地址,如果这封信没发到,那么smtp会根据这个地址把信退回来,并附上错误信息。我就是第一次没发到,结果去smtp的路径C:\Inetpub\mailroot\Queue下面一看,发现一封名字无法识别的邮件,打开一看才知道是发向[email=me@localhost][color=#0000ff]me@localhost[/color][/email]的退信。

到这里mail函数相关的配置就都有了,不过我这里还有个问题:就是那封退信的内容,退信是发到邮箱了,但是原信为什么没发到呢?看了退信的内容才知道,原来是对方的邮件服务器拒掉了,理由是Diagnostic-Code: smtp;554 Connection refused(mx). MAIL FROM [me@localhost] mismatches client IP [xxx.xxx.xxx.xxx]. 这个是为什么我还不清楚,我猜是因为我的机器在内网?总之是这个邮箱有检测,要不然退信就发不到我另一个邮箱了。