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

php在IIS环境中的配置就不多说了,用windows下的php安装文件的话不会遇到什么问题。
 
困难的事情是发送电子邮件的设置,php有个默认的发送邮件的函数mail,这个函数的说明可以在php的官方网站找到(我觉得是官网,也不一定。。。):
貌似这个函数只支持没有身份验证的smtp服务器,所以要把本机上的smtp服务器开成没有身份验证的。
 
配置的过程中有两个问题:一是smtp的配置,二是php方面的配置(php.ini文件)。
 
smtp的配置,最终目标是使得IIS自带的smtp server可以正常的发信,这中间我经过了好几个步骤,还是学了点东西:
 
1. 启动smtp服务。
打开iis,发现我这儿的“默认smtp虚拟目录”居然画了“叉”,不能用啊,右键启动,又说启动不了,请去“事件查看器”看log。这个“事件查看器”在控制面板->管理工具下面,smtp的事件信息在“系统”一栏,“来源”是“SMTPSVC”。
的确是有出错的项目,双击打开看,提示错误号115,请去下面的网站找:
这个是microsoft的技术支持网站,还是挺不错的,不过建议搜索的时候在英文网页中搜索,因为很多中文网页都是英文网页直接用翻译机翻译过来的,不容易看懂。。。
 
搜索smtpsvc 115 最后在这个网页找到了办法:
大致是说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
 
这个在下面这个网页找到了解决方案:
关键是:
“据说是中继的问题
然后依照指示
虚拟服务器->属性->访问->中继
将那个复选框选好,然后再添加了127.0.0.1的本地地址
测试,ok”
 
我也是按照这个步骤做的就对了,这个地方实际上是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= me@localhost ; for Win32 only
 
其中sendmail_from是提交给smtp服务器的发信人地址,如果这封信没发到,那么smtp会根据这个地址把信退回来,并附上错误信息。我就是第一次没发到,结果去smtp的路径C:\Inetpub\mailroot\Queue下面一看,发现一封名字无法识别的邮件,打开一看才知道是发向me@localhost的退信。
 
到这里mail函数相关的配置就都有了,不过我这里还有个问题:就是那封退信的内容,退信是发到邮箱了,但是原信为什么没发到呢?看了退信的内容才知道,原来是对方的邮件服务器拒掉了,理由是Diagnostic-Code: smtp;554 Connection refused(mx). MAIL FROM [me@localhost] mismatches client IP [xxx.xxx.xxx.xxx]. 这个是为什么我还不清楚,我猜是因为我的机器在内网?总之是这个邮箱有检测,要不然退信就发不到我另一个邮箱了。

PHPMailer使用介绍

发送邮件是一个经常使用的功能,但是php的默认支持并不是很好,这里介绍一个很好的开源模块:phpmailer,此模块功能比较全面,支持SMTP验证。下面就简单介绍一下它的使用方法:

1 下载phpmailer模块: 官方网站 http://www.phpdoc.org/

2 解压到一个文件夹

3 在php文件中包含 require_once("class.phpmailer.php");

4 使用SMTP发送邮件:

以上是针对SMTP服务器的,在LINUX下(比如我当前使用的LINUX虚拟主机)可以直接使用mail函数发送,也就是说可以不使用SMTP: