我有同样的问题。我在家里有一个开发服务器,在外部服务器机房有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]
,这可能不是你的意图。
是'sendmail'安装在你的盒子上吗? –
我该如何检查? – Astha
'yum install sendmail'应该确定帮助,如果你还没有安装它,可能是它没有在系统中。 –