我有同樣的問題。我在家裏有一個開發服務器,在外部服務器機房有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'應該確定幫助,如果你還沒有安裝它,可能是它沒有在系統中。 –