我使用的是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记录中的type
是NS
,则该域充当电子邮件域,这对于自己服务器的主机名来说是可以的,但效果略有不同。如果您将现有电子邮件域(例如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
启用它。希望这能有所帮助。