2011-12-01 125 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。希望這可以幫助。

相關問題