PHP邮件功能在Centos服务器上不起作用


PHP mail function not working on Centos server

我使用的是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 = "example@domain.com";
                // 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 <example@domain.com>' . "'r'n";
                if(mail($to,$subject,$message,$headers))
                {
                    echo "0";// mail sent Successfully.
                }
                else
                {
                    echo "1";
                }

它总是打印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  

现在邮件功能运行良好。

我知道这个问题已经得到了回答,但我也遇到了类似的问题。万一其他人。。。。

/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

编辑:我本想发表评论,但我还没有足够的声誉。

我也遇到了同样的问题。我在家里有一个开发服务器,在外部服务器室有一个prod服务器,收到的邮件会转到其他服务器。PHP的mail()在服务器端工作得很好,但在家里却不行。

我测试了一点,让它在家里以与服务器相同的方式工作。服务器端和家庭端方法的区别在于sendmail的配置。服务器之家我只需要安装sendmail,这很好,但在家里我还必须安装sendmail cf,并使用它来添加传出邮件服务器地址。

假设您的家庭服务器上有Centos、Apache和PHP,并且您希望使用PHP:smail((函数发送电子邮件。

1( 将家庭服务器上的主机名设置为两个位置:/etc/sysconfig/network和/proc/sys/kernel/hostname,方法如下:

#nano/etc/sysconfig/network网络=是HOSTNAME=mydns157.dlinkddns.com#nano/proc/sys/kernel/hostnameHOSTNAME=mydns157.dlinkddns.com

2( 安装sendmail和sendmail cf:

#百胜安装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:

#服务发送邮件重新启动#服务httpd重新启动

6( 启动以更新主机名:

#重新启动

就是这样。现在以下操作有效:

#php-r'mail("user@somedomain.com","Subject","Body",null,"-fme@mydomain.com"(;'

你可以跳过-f:

#php-r'mail("user@somedomain.com","主题","正文"(

在这种情况下,发件人的姓名会自动变为user@hostname,例如。root@mydns157.dlinkddns.com.


主机名的一些注意事项

主机名的选择至关重要。Centos6中的默认值是localhost.localdomain,但如果您在调用mail((时跳过自己的发件人地址(例如'-fme@mydomain.com'(,则mail()无法使用它。如果你确信,你总是用你的真实地址作为发件人地址来调用mail((,主机名可以是任何东西,但如果你现有的对mail((的调用没有发件人地址(我有数百个类似的调用用于测试目的(,那么你必须有一个真实的域作为主机名,因为在这些情况下,你的服务器的主机名被用作发件人地址域。真正的意义是,域必须至少有DNS A记录(出于某种原因,我的ISP不需要NS记录作为发件人地址,只需要A记录,但要与您的ISP进行测试和检查(。使用非电子邮件域作为发件人地址的缺点是,回复和发送通知将进入天堂,但如果你在代码中删除了发件人地址,通常意味着你测试和调试了一些东西,不需要回复功能。域可以是例如你从动态dns服务器(例如mydns157.dlinkddns.com(获得的域,它可以指向你的家庭路由器(但不是必须(。您可以使用dns_get_record("mydns157.dlinkddns.com")在PHP中获取DNS记录,它返回如下数组:

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

如果上述DNS记录中的typeNS,则该域充当电子邮件域,这对于自己服务器的主机名来说是可以的,但效果略有不同。如果您将现有电子邮件域(例如myexistingemaildomain.com(设置为主机名,并向me@myexistingemaildomain.com发送消息(例如出于调试目的(,sendmail会认为该消息必须发送到该服务器上用户me的邮件文件夹。如果me用户不存在,则发送失败,如果用户存在,则消息转到/var/mail/me。这可能是您想要的,但(像我一样(您可能希望所有邮件都在外部传递,而不是在服务器文件夹中传递。

您的主机名(在DNS记录中(不需要指向服务器的实际外部IP,就可以使mail((在缺少发件人地址的情况下工作,但这并没有什么害处。主要是主机名有一个有效的a记录,并且域属于您。如果域名不属于你,那么可能会出现一个安全漏洞。如果您将某个现有电子邮件域(例如microsoft.com(设置为主机名(无论出于何种原因(,并在调用mail((时向某人发送消息而不添加您自己的发件人地址(例如,'-fme@mydomain.com'(,则发件人地址将自动为you@microsoft.com。如果您以root用户身份登录,则发件人地址将为root@microsoft.com。回复和失败交付的通知会转到root@microsoft.com,这可能不是您的意图。

我建议使用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 => "no-reply@yourdomain.com"))
    ->setTo(array($email => "$fname $lname"))
    ->setBody($body);
  //Send the message
  $result = $mailer->send($message);
}

这可能有助于

ini_set('sendmail_from', 'example@domain.com'); 

我刚刚遇到了这个问题,有两件事。

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

但同时,我发现用这个测试发送邮件要容易得多:

sendmail -s 'me@gmail.com'
Subject:Testing!
hey there, how ya doin?
CTRL+D

请始终检查/var/log/maillog中的邮件日志以了解问题的原因。在正确配置了postfix之后,我曾经遇到过类似的问题。我在说fatal: setrlimit: Permission denied时出错。解决方法是通过getsebool httpd_can_sendmail命令检查httpd是否可以发送邮件。如果httpd可以发送邮件是关闭的,那么通过命令setsebool -P httpd_can_sendmail 1启用它。希望这能有所帮助。