思维无界

php mail函数邮件发送成功但收不到邮件

邮件服务当掉了一个星期,今儿才发现。程序一直提示send successfully,但却收不到邮件。今儿问了运营的同学和老大才知道原来所有人都收不到邮件。折腾了一下午才知道是sendmail服务器出问题了。
由于本人对sendmail没有研究过,说不了人家都是工作原理和配置,只简单记录下这个问题的处理流程:
1. 首先说明PHP的mail函数
    大家都知道PHP使用mail函数来发送邮件,但是mail函数依赖的是服务器上的SMTP邮件服务或sendmail服务,邮件服务的配置通过php.ini的sendmail_path和SMTP_PORT等参数设置来完成。因此如果PHP服务器上没有配置SMTP(windows)或sendmail等邮件服务(Linux),mail函数不起作用。
 mail函数的使用查手册
2.排错过程
    邮件发送成功,但接收不到有可能是接受服务器有问题,但若所有的邮箱都接收不到,那就肯定是发送邮件服务器出问题了。
 1)判断是否发送邮件服务器有问题
     首先查看php.ini的 sendmail_path路径里配置的服务器是什么。然后寻找其日志文件查看邮件发送日志。
   (发现无论是PHP的异常还是邮件的异常,都要有查看日志的习惯。PHP异常查看apache的错误日志,邮件服务器异常,查看邮件服务的日志。日志太有爱了。)
   我们使用的是sendmail邮件服务器,其错误日志在是/var/log/maillog。没有研究过sendmail,不知道如何制定错误文件的位置,但按经验错误日志的位置应该根据sendmail的配置。

 一般出现Connection refused by [127.0.0.1]

   若邮件发送日志中有service unvariable出现,明显说明sendmail服务又问题。有可能是sendmail的守护进程没有启动。
2)判断守护进程是否启动
  sendmaild工作原理是启动一个sendmail守护进程,此进程监听服务器的25端口(TCP 25端口 是SMTP协议的)。当使用senmail发送邮件时,sendmail连接此端口,发送邮件。
  判断服务是启动可用netstat -an |grep 25 命令来判定
  若没有以下条目说明sendmail没有启动守护进程
  tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN 
 netstat命令查看主机当前的网络连接状态。
3)若发现守护进程未启动启动守护进程
   /usr/sbin/sendmail -bd -q30m 

   -bd:sendmail以守护进程方式运行 
  -q30m :每隔30分钟重新邮寄由于一些原因没有被发送存储在邮件队列中的待发送邮件。

4)发送测试邮件
  sendmail to@address <test
或echo  echo "Subject:jldsj\n\nMessage:text" |sendmail -f from@address to@address

关键词:

php mail函数邮件发送成功但收不到邮件 :目前有0 条留言

发表留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。