2011-11-21 85 views
9

當我通過瀏覽器執行我的電子郵件腳本時,會返回超時致命錯誤(除非我大幅增加執行時間,那麼它將運行正常,而不是我正在尋找的解決方案)。 電子郵件發送到,但它需要永遠(平均5分鐘)到達(在我的收件箱)!
(考慮到通過命令行它完美的作品我認爲,在SMTP php.ini中肯定是配置好。)mail()超時問題

因此,這是由瀏覽器請求執行的代碼:

<?php 
mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>'); 
?> 

,當我運行此相同的(?是不是真的一樣,我開始懷疑自己)通過命令行代碼:

php -r "mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>');" 

它完美的作品!腳本運行,停止並且電子郵件立即到達(2/3秒)。

那麼,什麼會導致這種差異,以及如何解決它呢?有任何想法嗎?
在此先感謝。


[編輯]一些額外的信息:
- 機器是windows
- 服務器爲localhost
- php.ini文件是瀏覽器和CLI實例都相同


[編輯]
謝謝大家試圖猜測哪個是問題。我提出了問題跳出來,以前有人遇到過這個問題,並且知道具體的事情。鑑於沒有具體的東西出現,沒有任何的建議真的起作用,我決定接受讓我得出更多關於這個問題的結論的東西...... +1對於你所有有用的知識/想法(/猜測):-)

+2

命令行和瀏覽器實際上使用了兩個不同的php.ini文件。你可能想搜索php.ini並比較你的設置 – Patrick

+1

這對我來說毫無意義;所以我檢查:'php --ini'返回與瀏覽器相同的配置文件路徑。 – acm

+0

我假設sendmail_path也一樣嗎? – djdy

回答

5

我假設的一些couses,但我用Linux和Windows上,我可以olny猜測:

  1. php_cli和mod_php的2個不同的二進制文件,mod_php,並且可以稍微受損
  2. php_cli和mod_php的使用2個不同的用戶,apache用戶的網絡配置文件可能是問題(DNS,防火牆,代理...)
  3. 您的PHP腳本是在「有問題」的位置或包含一些有問題的角色,但您的CLI腳本是由param,嘗試執行相同的腳本:php -fz:\ path \ to \ php \ mail.php
+0

嗨,我試圖通過CLI執行文件,如你所述,它按預期工作,即時交付;所以問題不應該是腳本文件。 – acm

+0

@andrematos驗證.1你可以重新安裝mod_php並驗證.2你可以從apache/html_page系統(「php -fz:\ path \ to \ php \ mail.php」) –

+0

嗨Ivan,我測試過.2並驚訝地發現它和直接從瀏覽器執行mail()一樣多。那麼是否有可能使用不同的用戶?我的意思是,它的安裝方式都是一樣的,同時......仍然沒有道理......謝謝。 – acm

2

只是要清楚:腳本使用的php-instance與命令行代碼使用的php-instance是一樣的嗎?

許多網絡主機使用smtp-relay,它會收集一堆電子郵件並一次全部發送,所以如果郵件遲到,這不會是一種奇怪的行爲。但是,執行時間太長是不正常的。

+0

我從我的機器上運行這個,所以是的,它是一樣的。 – acm

3

鑑於此便條http://php.net/manual/en/function.mail.php,它似乎很可能,這個問題與MTA,而不是直接PHP:

Windows實現郵件的()不同,從UNIX實現多種方式。首先,它不使用本地二進制來編寫消息,而只使用直接套接字,這意味着需要在網絡套接字(可以在本地主機或遠程機器上)上監聽MTA。

也許它與MTA對特定用戶的響應方式或用戶特定的防火牆規則有關,用於機器上的傳出郵件連接。你可以運行命令行作爲web服務器用戶而不是你自己嗎?如果是這樣,是否會從命令行重新創建問題?

如何讓Web服務器執行命令行PHP而不是解析的PHP文件? (例如,也許你可以通過CGI運行批處理腳本。)這是否解決了問題?

(對不起,這些是不是明確的答案更多的猜測。)

+0

特羅特,謝謝你的努力,但正如我向塞卡解釋的(見評論),我不認爲我正在通過MTA。我可能有錯誤的想法tho .. – acm

+0

@andrematos MTA是處理郵件傳輸的通用術語。無論如何,我仍然會檢查涉及用戶和防火牆規則的潛在問題。 – Trott

2

嘗試設置用戶名和密碼爲「從」郵件ID。所以它可以快速驗證併發送郵件。

你試過PHP mailer

在我看來,它在幾秒鐘內發送郵件。下面的例子會讓你快速瀏覽一下如何使用php郵件類。

include "class.phpmailer.php"; 
$msg="Hello! This is a test..." 
$mail=new PHPMailer(); 
$email="[email protected]"; //person who receives your mail 
$mail->IsSMTP(); 
$mail->Host = "localhost"; 
$mail->SMTPAuth = true; 
$mail->Username = "[email protected]"; //your mail id 
$mail->Password = "sdfsd441"; //password for your mail id 
$mail->SetFrom('[email protected]', 'admin'); //from address 
$mail->AddAddress($email); 
$mail->Subject ="Test Mail"; 
$mail->Body = $msg; 
$mail->IsHTML(true); 
$mail->MsgHTML($msg); 
$mail->Send(); 

編輯:
在PHP手冊,他們說這樣,

Windows實現郵件()從UNIX實現許多方面有所不同。首先,它不使用本地二進制來編寫消息,而只使用直接套接字,這意味着需要在網絡套接字(可以在本地主機或遠程機器上)上監聽MTA。

這樣可能會導致延遲?我認爲這link可能會幫助你。

+0

我嘗試了PHPMailer和[Swift](http://swiftmailer.org/),其行爲完全相同。 – acm

+0

@andrematos檢查我的答案編輯部分 – VKGS

+0

Sekar,我連接到目標SMTP。我的設置是這樣的:SMTP:mail.example.com; FROM:[email protected]; TO:[email protected];所以我認爲MTA在這裏沒有任何作用。 – acm

2

發送之前在劇本郵件請務必打印出變量SMTPsmtp_portini_get(),並sendmail_from和肯定,這是工作價值觀。在Windows上運行的PHP沒有通過Sendmail發送郵件的好處,並且無論PHP開發人員拼湊在一起的任何內容都是粗略的。

我總是喜歡通過Telnet測試郵件,所以我可以看到,如果服務器是給那個不被客戶端傳回正確的錯誤:

c:\> telnet smtp.domain.com 25 

220 smtp.domain.com ESMTP Postfix 
helo mailtest 
250 smtp.domain.com 
mail from: [email protected] 
250 2.1.0 Ok 
rcpt to: [email protected] 
250 2.1.5 Ok 
data 
354 End data with <CR><LF>.<CR><LF> 
from: [email protected] 
to: [email protected] 
subject: test mail 

this is a test message 
. 
250 2.0.0 Ok: queued as 42AD8364FE0E 
quit 
221 2.0.0 Bye 
2

我的第一個猜想是,瀏覽器的版本您的郵件已經有一個上下文或連接準備好發送。 相反,直接(php -r)執行必須加載郵件上下文。

要確認這個想法,您可以製作一個循環發送10封郵件,並在第一個郵件更快後檢查郵件。