2011-12-01 94 views
15

我正在使用centos服务器并必须发送邮件给用户,所以我从一台服务器上复制了我的运行代码并在此处使用它,但它不发送邮件。PHP邮件功能不能在Centos服务器上工作

代码是:

   $to = $email; //writing mail to the user 
       $subject = "Hii"; 
       $message = "<table> 
       <tr><td> Hello ".$email.",</td></tr> 
       <tr><td> Some Text </td></tr> 
       <tr><td> Some Text </td></tr> 
       <tr><td> Some Text </td></tr> 
       <tr><td> Some Text </td></tr> 
       </table>" ; 
       $from = "[email protected]"; 
       // To send HTML mail, the Content-type header must be set 
        $headers = 'MIME-Version: 1.0' . "\r\n"; 
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
       // Additional headers 
       $headers .= 'From: Team <[email protected]>' . "\r\n"; 

       if(mail($to,$subject,$message,$headers)) 
       { 
        echo "0";// mail sent Successfully. 
       } 
       else 
       { 
        echo "1"; 
       } 

它总是打印在其他项目1相同的代码运行良好。请指导我能做些什么来启用它? 任何帮助将不胜感激!

+2

是'sendmail'安装在你的盒子上吗? –

+0

我该如何检查? – Astha

+3

'yum install sendmail'应该确定帮助,如果你还没有安装它,可能是它没有在系统中。 –

回答

22

安装sendmail的*和运行以下命令后:

[[email protected] ~]# yum install sendmail* 
[[email protected] mail]# yum install dovecot 
[[email protected] mail]# cd /etc/mail/ 
[[email protected] mail]# vi local-host-names 
# local-host-names - include all aliases for your machine here. 
example.com 
[[email protected] mail]# vi /etc/dovecot.conf 
protocols = imap pop3 //uncomment 
[[email protected] mail]# m4 sendmail.mc > sendmail.cf 
[[email protected] mail]# make 
[[email protected] mail]# /etc/init.d/sendmail start 
[[email protected] mail]# /etc/init.d/saslauthd start 
[[email protected] mail]# /etc/init.d/dovecot start 
[[email protected] mail]# chkconfig sendmail on 
[[email protected] mail]# chkconfig dovecot on 
[[email protected] mail]# chkconfig saslauthd on 

我仍然有同样的问题。我检查了我的/var/log/maillog,看到一个错误:

127.0.0.1  localhost localhost.localdomain domain 
ip.ip.ip.ip domain localhost 

到:

My unqualified host name (domain) unknown; sleeping for retry 

更多的搜索后,我从改变/etc/hosts

127.0.0.1 localhost.localdomain localhost domain 
ip.ip.ip.ip localhost domain 

现在的邮件功能现在工作正常。

+4

可能是/etc/dovecot/dovecot.conf? – emc

+2

postfix开箱即用 – holms

+0

我使用这些说明为Docker容器中的CentOS设置了sendmail。然而,我确实只需要做yum install sendmail来使用mail()。如上所述配置hosts文件对于使邮件功能及时发送邮件非常重要。谢谢! –

2

我推荐使用SwiftMailer来做很多这样的事情。

require_once('../lib/swiftMailer/lib/swift_required.php'); 
function sendEmail(){ 
    //Sendmail 
    $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs'); 

    //Create the Mailer using your created Transport 
    $mailer = Swift_Mailer::newInstance($transport); 

    $body="Dear $fname,\n\nYour job application was successful. \n\nYours,\n\nEamorr\n\n\n\n\n\n\n"; 


    //Create a message 
    $message = Swift_Message::newInstance('Subject goes here') 
    ->setFrom(array($email => "[email protected]")) 
    ->setTo(array($email => "$fname $lname")) 
    ->setBody($body); 

    //Send the message 
    $result = $mailer->send($message); 
} 
+0

整天工作,但错误永远不会消失,这解决了我的问题在30分钟内! –

6

我有同样的问题。我在家里有一个开发服务器,在外部服务器机房有prod服务器,并且有传入邮件到其他服务器。 PHP:s mail()在服务器房子中很好地工作,但不在家中。

我测试了一下,并得到它在家中的工作方式与在服务器房中一样。服务器房屋和家庭之间的差异是sendmail的配置。服务器屋我只需要安装sendmail,这很好,但在家里我不得不安装sendmail-cf并使用它来添加外发邮件服务器地址。

假设您在家中有Centos,Apache和PHP服务器,并且您想使用PHP:s mail()函数发送电子邮件。

1)家庭服务器上设置主机名到两个地方:在/ etc/sysconfig/network中和的/ proc/sys目录/内核/主机名是这样的:

 
# 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:即将离任的邮件服务器:

 
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("[email protected]", "Subject", "Body", null, "[email protected]");' 

您可以跳过-f:

在这种情况下
 
# php -r'mail("[email protected]", "Subject", "Body");' 

发件人的名字会自动成为用户@主机名,如。 [email protected]


主机名

的一些注意事项主机的选择是至关重要的。 Centos6中的默认值为localhost.localdomain,但如果在调用mail()时跳过自己的发件人地址(例如'[email protected]'),则mail()不适用于此。如果你确定,你总是使用你的真实地址作为发件人地址来调用mail(),那么主机名可以是任何东西,但是如果你现在有邮件()没有发件人地址(我有数百个这样的调用测试目的),那么你必须有一个真实的域作为主机名,因为在这些情况下,你的服务器的主机名被用作发送者地址域。真正意义上,域必须至少有DNS A记录(出于某种原因,我的ISP不需要NS记录的发件人地址,只有A记录,但测试并检查您的ISP)。使用非电子邮件域作为发件人地址的缺点是回复和传递通知将会变得枯燥乏味,但是如果您在代码中放置发件人地址,通常意味着您测试和调试某些内容并且不需要回复功能。域可以是例如。你从动态DNS服务器获得的一个例如。 mydns157.dlinkddns.com,它可以指向你的家庭路由器(但不是必须的)。

 
[host] => mydns157.dlinkddns.com 
[type] => A 
[ip] => 92.152.214.137 
[class] => IN 
[ttl] => 7 

如果type以上DNS记录为NS,则域作为电子邮件域,这对于自己的主机名确定:您可以使用dns_get_record("mydns157.dlinkddns.com"),它返回一个这样的数组获得PHP DNS记录服务器,但效果有点不同。如果您将主机名设置为现有的电子邮件域,例如。 myexistingemaildomain.com,并发送消息到[email protected]例如出于调试的目的,sendmail认为该消息必须传送到该服务器上的用户me的邮件文件夹。如果me用户不存在,则发送失败,如果用户存在,则消息转到/var/mail/me。这可以是你想要的,但是(像我一样)你可能希望所有的消息都是在外面传递而不是服务器文件夹。

您的主机名(在DNS记录中)不需要指向您的服务器的实际外部IP,以使邮件()在缺少发件人地址的情况下工作,但不会造成任何损害。主要的是主机名有一个有效的A记录,并且该域属于你。如果域名不属于你,那么可能会出现安全漏洞。如果您将某个现有电子邮件域设置为主机名,例如。 microsoft.com(无论出于何种原因),并且在致电邮件时(例如,)发送信息给某人而不添加自己的发件人地址,发件人地址将自动为[email protected]。如果您以根用户身份登录,则发件人地址将为[email protected]。回复和通知失败,然后去[email protected],这可能不是你的意图。

+0

from'service sendmail restart'即时通讯错误'正在启动sendmail:554 5.0.0未定义本地邮件程序 554 5.0.0 QueueDirectory(Q)选项必须设置为' –

6

我知道这已被回答,但我有一个类似的问题。 在其他情况下......

/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/?ModPagespeed=noscript

编辑:我也有评论,但我没有足够的声誉呢。

+0

即时获取'setsebool:SELinux已禁用' –

2

我刚才有这个问题,有两件事。

我的电子邮件是垃圾邮件,绝对检查。可能是因为我的服务器没有正确的PTR和SPF记录。

而且,我发现了很多更容易测试的sendmail本:

sendmail -s '[email protected]' 
Subject:Testing! 
hey there, how ya doin? 
CTRL+D 
0

经常检查在/ var /日志/ maillog中你的maillog就知道了问题的原因。 在正确配置postfix后,我有一个类似的问题。我收到一个错误,说fatal: setrlimit: Permission denied。解决方法是通过getsebool httpd_can_sendmail命令检查httpd是否可以发送邮件。如果httpd可以发送邮件关闭,则通过以下命令启用它:setsebool -P httpd_can_sendmail 1。希望这可以帮助。

相关问题