2009-08-13 113 views
1

我試圖在公司網站上實現密碼重置功能,如果用戶需要重置密碼,她可以點擊一個鏈接,隨機生成一個新密碼將發送到她的收件箱。PHP郵件問題

我使用PHP mail()函數。現在,我在Ubuntu機器上運行PHP5。在php.ini中,我聲明SMTP是運行郵件服務器和smtp_port的機器的IP爲25.此外,我嘗試telnet到端口25上的郵件服務器併發送郵件 - 它工作(我的工作終端是Windows) 。

問題是郵件沒有被髮送/接收 - 調用mail()的PHP腳本掛起約1分鐘,其末尾mail()返回true

最糟糕的是,我對如何甚至找出問題所在 - 使用PHP,使用Ubuntu,使用郵件服務器或使用代碼提出了一些想法!

有人可以幫忙嗎?

回答

2

我沒有在php.ini看了最近,但不會說:

[mail function] 
; For Win32 only. 
;SMTP = 

強調對於Win32僅

您可能想要看看PEAR::Mail。當pear.php.net實際上是響應,那是。

+0

我在一篇教程中讀到,如果未指定sendmail_path,linux也將成功使用SMTP字段。那是不正確的? – 2009-08-13 16:32:35

+0

據我所知,這是不正確的。在郵件命令的註釋部分,它甚至會說「Windows的郵件實現與Unix的實現有很多不同之處,首先,它不使用本地二進制文件來編寫郵件,而只使用直接套接字」意味着unix版本總是使用sendmail。 – Powerlord 2009-08-13 16:35:49

+0

然後我將使用PEAR :: Mail。我現在正要離家去(這裏晚上10點)。將在早上寫關於它:) – 2009-08-13 16:39:11

1

你可以檢查你的mail.err和mail.log文件嗎?

+0

我絕對是Linux的新手。我似乎無法找到mail.err和mail.log文件:( – 2009-08-13 16:35:21

+1

/var/log /目錄通常包含大多數Linux發行版的所有日誌 – Steven 2009-08-13 16:46:47

+0

mail.err具有以下條目:「我的非限定主機名(OCR )unknown; sleep for retry「。我不知道它是什麼意思 – 2009-08-14 04:21:55

0

您的電子郵件服務器可能需要身份驗證(「POP before SMTP」或ASMTP - Authenticated SMTP)。由於您最近可能從Windows計算機上檢查了您的電子郵件,因此您的IP地址將通過身份驗證並允許短時間發送電子郵件:從您的Ubuntu計算機,可能不會。

在Ubuntu機器上,看看你是否不能使用你的SMTP服務器的IP地址:PHP應該算出如何發送郵件。否則,您將不得不找出如何對您的電子郵件服務器進行身份驗證並將其實施到PHP中。

+0

不需要驗證我使用telnet(Ubuntu)發送了一封郵件到郵件服務器 - 它沒有驗證就可以工作 – 2009-08-14 11:17:03

+0

好的,嘗試刪除php中的條目。 ini文件引用服務器的IP地址,以查看PHP是否能夠使用sendmail發送電子郵件 – 2009-08-14 12:18:24

0

嘗試從shell發送帶有郵件程序的電子郵件。首先看看是否有效。

+0

從shell-telnet(Ubuntu)發送郵件 – 2009-08-14 11:17:44

+0

然後它必須是php的配置。功能在php.ini中配置? – grigy 2009-08-14 11:27:33

+0

[郵件功能] ;僅適用於Win32。 SMTP = 192.168.1.10 smtp_port = 25 ;僅適用於Win32。 sendmail_from = [email protected] ;僅適用於Unix。您也可以提供參數(默認值:「sendmail -t -i」)。 sendmail_path =/usr/sbin/sendmail – 2009-08-14 11:39:35

0

您的ISP可能是問題所在。端口25經常被ISP阻止,以防止大規模垃圾郵件。嘗試更改爲非標準端口,看看是否有幫助。

編輯和here是詳細說明問題的東西(儘管他們的解決方案是中繼到ISP郵件服務器,而不是更改端口)。

+0

機器都在一個內部LAN(甚至沒有網關) – 2009-08-13 16:36:27

+0

如果是這樣的話,日誌也將是我的下一站。 – Steven 2009-08-13 17:06:55

0

例如,您需要Zend Framework SMTP郵件類,因爲這個愚蠢的braindead php實現不適用於Unix上的SMTP端口。

請訂閱PHP Core郵件列表並抱怨 - 如果越來越多的人進來,他們可能會改變它,並且他們看到的不是每個人的sendmail。

0

也可以通過使用郵件庫繞過php的mail()函數。例如SwiftMailer(http://swiftmailer.org/)這是一個非常好的安全發送電子郵件的類(普通/ html)。

使用此類,您可以直接連接到SMTP服務器並繞過服務器配置。