我正在使用centos Server并且必须将邮件发送给用户,所以我从一台服务器复制了我的运行代码,并在这里使用它,但它不发送邮件.
代码是:
$to = $email; //writing mail to the user $subject = "Hii"; $message = "
Hello ".$email.", |
Some Text |
Some Text |
Some Text |
Some Text |
它始终打印1.相同的代码在其他项目上正常运行.请指导我在这里启用它能做些什么?任何帮助将非常感谢!
安装sendmail*并运行以下命令后:
[root@sendmail ~]# yum install sendmail* [root@sendmail mail]# yum install dovecot [root@sendmail mail]# cd /etc/mail/ [root@sendmail mail]# vi local-host-names # local-host-names - include all aliases for your machine here. example.com [root@sendmail mail]# vi /etc/dovecot.conf protocols = imap pop3 //uncomment [root@sendmail mail]# m4 sendmail.mc > sendmail.cf [root@sendmail mail]# make [root@sendmail mail]# /etc/init.d/sendmail start [root@sendmail mail]# /etc/init.d/saslauthd start [root@sendmail mail]# /etc/init.d/dovecot start [root@sendmail mail]# chkconfig sendmail on [root@sendmail mail]# chkconfig dovecot on [root@sendmail mail]# chkconfig saslauthd on
我仍然有同样的问题.我检查了我/var/log/maillog
,发现了一个错误:
My unqualified host name (domain) unknown; sleeping for retry
经过更多搜索,我改变/etc/hosts
了:
127.0.0.1 localhost localhost.localdomain domain ip.ip.ip.ip domain localhost
至:
127.0.0.1 localhost.localdomain localhost domain ip.ip.ip.ip localhost domain
现在邮件功能现在正常工作.
我有同样的问题.我在家里有一个开发服务器,在外部服务器机房有prod服务器,收到的邮件转到其他服务器.PHP:s mail()
在服务器机房很好用,但不在家里.
我测试了一下,让它以与服务器机房相同的方式在家工作.服务器机房和家庭中的方法之间的区别在于sendmail的配置.服务器机构我只需安装sendmail就可以了,但在家里我还要安装sendmail-cf并用它来添加外发邮件服务器地址.
假设您在家庭服务器上有Centos,Apache和PHP,并且您希望使用PHP:s mail()函数发送电子邮件.
1)将主服务器上的主机名设置为两个位置:/ etc/sysconfig/network和/ proc/sys/kernel/hostname这样:
# nano /etc/sysconfig/network NETWORKING=yes HOSTNAME=mydns157.dlinkddns.com # nano /proc/sys/kernel/hostname HOSTNAME=mydns157.dlinkddns.com
2)安装sendmail和sendmail-cf:
# yum install sendmail sendmail-cf
3)将以下行添加到/etc/mail/sendmail.mc中,其中有ISP:s外发邮件服务器:
define(`SMART_HOST',`mail.myisp.com')dnl
4)更新sendmail.cf:
# /etc/mail/make
5)重启sendmail和apache:
# service sendmail restart # service httpd restart
6)引导更新主机名:
# reboot
而已.现在以下工作:
# php -r'mail("user@somedomain.com", "Subject", "Body", null, "-fme@mydomain.com");'
你可以跳过-f:
# php -r'mail("user@somedomain.com", "Subject", "Body");'
在这种情况下,发件人的名称将自动变为user @ hostname,例如.root@mydns157.dlinkddns.com.
主机名的一些注释
主机名的选择至关重要.Centos6中的默认值是localhost.localdomain
,但mail()
如果您'-fme@mydomain.com'
在调用mail()时跳过自己的发件人地址(例如),则无法使用它.如果您确定,您总是使用您的真实地址作为发件人地址来呼叫mail(),主机名可以是任何内容,但如果您现有的mail()调用缺少发件人地址(我有数百个这样的调用测试目的),那么你必须有一个真实的域作为主机名,因为在这些情况下你的服务器的主机名被用作sender-address-domain.真正的域名必须至少具有DNS A记录(出于某种原因,我的ISP不需要NS记录作为发件人地址,只需要A记录,但需要测试并检查您的ISP).使用非电子邮件域作为发件人地址的缺点是回复和发送通知将转到位天堂,但如果您在代码中删除发件人地址,通常意味着您测试和调试某些内容而不需要回复功能.域可以是例如.你从动态DNS服务器获得的那个,例如.mydns157.dlinkddns.com
,它可以指向您的家庭路由器(但不必).您可以使用PHP获取DNS记录dns_get_record("mydns157.dlinkddns.com")
,返回如下数组:
[host] => mydns157.dlinkddns.com [type] => A [ip] => 92.152.214.137 [class] => IN [ttl] => 7
如果type
在上面的DNS记录中NS
,则该域充当电子邮件域,对于自己的服务器的主机名是可以的,但效果稍有不同.如果您将主机名设置为现有电子邮件域,例如.myexistingemaildomain.com
并且,me@myexistingemaildomain.com
例如出于调试目的发送消息,sendmail认为该消息必须被传递到me
该服务器上的用户的邮件文件夹.如果me
用户不存在,则发送失败,如果用户存在,则消息进入/var/mail/me
.这可能是你想要的,但是(像我一样)你可能希望所有消息都是在外部而不是服务器文件夹中传递的.
您的主机名(在DNS记录中)不需要指向服务器的实际外部IP,以使mail()在缺少发件人地址的情况下工作,但它没有任何危害.主要的是hostname有一个有效的A记录,并且该域属于您.如果域名不属于您,则可能会出现安全漏洞.如果您将某个现有电子邮件域设置为主机名,例如.microsoft.com
(无论出于何种原因)并在呼叫mail()(例如'-fme@mydomain.com'
)时向某人发送消息而不添加您自己的发件人地址,发件人地址将自动发送you@microsoft.com
.如果以root用户身份登录,则发件人地址将为root@microsoft.com
.发送失败的回复和通知随后发送root@microsoft.com
,这可能不是您的意图.
我知道这已经得到了回答,但我有一个类似的问题.万一其他人......
/ var/log/maillog向我展示了Postfix权限问题.
sendmail: fatal: chdir /var/spool/postfix: Permission denied
追踪错误我发现解决方案是CentOS上的SELinux策略(我正在使用版本6).
快速回答: setsebool httpd_can_sendmail 1
您可以使用-P使更改永久化; 我只需要密码重置电子邮件,所以我的情况不需要.
图片来源:http://www.spidersoft.com.au/2011/posftix-permission-denied-problem/? MoviePagespeed = noscript
编辑:我会评论,但我还没有足够的声誉.