PHP Conference Japan 2024

執行階段組態

這些函式的行為會受到 php.ini 中設定的影響。

郵件組態選項
名稱 預設值 可變更 變更日誌
mail.add_x_header "0" INI_PERDIR  
mail.log NULL INI_SYSTEM|INI_PERDIR  
mail.force_extra_parameters NULL INI_SYSTEM|INI_PERDIR  
SMTP "localhost" INI_ALL  
smtp_port "25" INI_ALL  
sendmail_from NULL INI_ALL  
sendmail_path "/usr/sbin/sendmail -t -i" INI_SYSTEM  
如需 INI_* 模式的詳細資訊和定義,請參閱組態設定可能設定的位置

以下是組態指令的簡短說明。

mail.add_x_header bool

新增 X-PHP-Originating-Script,其中將包含腳本的 UID,後接檔名。

mail.log string

記錄所有 mail() 呼叫的日誌檔路徑。日誌項目包含腳本的完整路徑、行號、To 地址和標頭。

mail.force_extra_parameters string

強制將指定的參數作為額外參數傳遞給 sendmail 二進位檔。這些參數將始終取代 mail() 的第五個參數的值。

SMTP string

僅限 Windows 使用:SMTP 伺服器的主機名稱或 IP 位址,PHP 應使用該伺服器來發送使用 mail() 函式發送的郵件。

smtp_port int

僅限 Windows 使用:使用 mail() 發送郵件時,要連線至以 SMTP 設定指定的伺服器的連接埠號碼;預設為 25。

sendmail_from string

在透過 SMTP (僅限 Windows) 直接發送的郵件中應使用哪個 "From:" 郵件地址。此指令也設定 "Return-Path:" 標頭。

sendmail_path string

sendmail 程式的位置,通常為 /usr/sbin/sendmail/usr/lib/sendmailconfigure 會盡力為您找到此程式並設定預設值,但如果失敗,您可以在此處設定。

未使用 sendmail 的系統應將此指令設定為其郵件系統提供的 sendmail 包裝器/替代程式 (如果有的話)。例如,» Qmail 使用者通常可以將其設定為 /var/qmail/bin/sendmail/var/qmail/bin/qmail-inject

qmail-inject 不需要任何選項即可正確處理郵件。

此指令也適用於 Windows。如果設定,則會忽略 smtpsmtp_portsendmail_from,並執行指定的命令。

新增註解

使用者提供的註解 4 則註解

26
elitescripts2000 at yahoo dot com
10 年前
在 Ubuntu 13.04 上,不確定其他發行版。

如果您只是取消註解預設的

sendmail_path = "sendmail -t -i"

您的 mail() 函式都會失敗。這是因為您應該放置完整路徑 (即 /usr/sbin/sendmail -t -i )

文件指出 PHP 會盡力尋找正確的 sendmail 路徑,但它顯然對我失敗了。

因此,請始終輸入 sendmail 的完整路徑,否則您可能會得到意外的失敗結果。

作為次要註解:那些只想強制執行 -f 參數的人,您可以使用以下方式在 php.ini 中執行此操作

mail.force_extra_parameters = -fdo_not_reply@domain.tld

您可以將 sendmail 路徑註解掉,它仍然會使用預設值 (在 UNIX 下 -t -i 選項,如果您查找它們,則它們的設定非常重要)...

但是,現在沒有辦法變更此設定,即使使用 mail() 函式的第五個參數也是如此。 -f 很重要,因為如果未設定,則將設定為 PHP 腳本執行的任何使用者,而您可能不希望這樣。

此外,如果發生錯誤,-f 會設定 Return-Path: 標頭,該標頭用作退回地址,以便您可以處理它們。由於某些原因,您無法在 mail() 標頭中設定 Return-Path: ...您以前可以。現在您必須使用 -f 選項。
3
jscholz at wisc dot edu
2 年前
文件應明確指出,在使用僅為 /usr/sbin/sendmail 時,sendmail 不會預設為 -t -i。您確實需要指定選項。

我知道這可能看似理所當然,但我浪費了數小時試圖讓 mail() 工作,結果才發現 sendmail 程式預設情況下並未如文件中規定的那樣傳遞 -t 和 -i。
-1
php dot net at ii0 dot net
8 年前
如果有人在 PHP 錯誤記錄中收到此不明的錯誤訊息
"sh: -t: command not found"
從 PHP 5.4 升級後,這可能是您的解決方案。

我將 PHP 從 5.4 升級到 5.6,我們所有的 mail() 功能突然中斷,沒有任何有用的錯誤記錄。

如果您是這種情況,並且您一直在使用 ini_set() 來設定 "sendmail_path",那麼請注意,即使它顯然沒有在升級文件中提到,也沒有在 php.net (或十幾個論壇) 上找到的任何地方提到,您現在需要在 php.ini 檔案中設定 sendmail_path;如果您使用 ini_set() 來動態指定 sendmail 二進位檔的路徑,則現在會忽略該路徑。

因此,只需在 php.ini 中指定 "sendmail_path" 即可。就是這樣,這修復了我們所有的 mail() 功能。

希望這個小小的註解可以為其他人節省我花費在疑難排解和研究上的時間。乾杯!
-3
Mark Simon
5 年前
值得重申的是,如上所述,sendmail_path 也適用於 Windows,覆寫其他 Windows SMTP 設定。

php.ini 中的註解「僅限 Unix」並未明確說明這一點。

這使得替換假的 sendmail 程式,甚至是 shell 腳本/批次檔案來將郵件儲存到文字檔中相對容易。

我在 PHP 中教學或測試時使用此技術。
To Top