2015-10-07 60 views
10

我使用PHP使用mail()函數成功發送郵件,但在發送時顯示爲服務器地址,而不是我在劇本已配置。 Postfix安裝在apache服務器上。在ServerFault answer我讀使用-f和-r標誌,但不工作,要麼是這樣的:後綴忽略PHP mail()函數

mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r [email protected]"); 

我已經能夠做的最好的就是改變後綴myorigin這是本地計算機名稱的主機名到機器名稱的父域。

這使我相信Postfix忽略或剝離From:元素?

+0

鏈接ubuntu頁面 –

+0

我該怎麼做? @KarolyHorvath –

+0

沒關係,我意識到你現在說的是...這是一個服務器故障的答案...我添加了鏈接。 –

回答

5

您可以讓Postfix的完成其工作重寫頭和加入適量From:地址。爲此,Postfix有sender_canonical_maps

比方說,您的Web服務器(或進程管理器)下用戶名爲username運行,你想有[email protected]在你的電子郵件,而不是[email protected]不清的From:頭。然後,規範地圖將包含:

#/etc/postfix/canonical 
username [email protected] 

配置Postfix的使用它不能簡單:

postmap /etc/postfix/canonical 
postconf -e sender_canonical_maps=hash:/etc/postfix/canonical 

其他選項是告訴後綴,以紀念所有的電子郵件從你的服務器發送來自[email protected]發通過luser_relay方式:

postconf -ev [email protected] 

如果你不能做到這一點,很可能已經有人這樣做是爲了你,但這樣做是錯誤的。這可能是你無法更改From:地址的原因,因爲它被Postfix強制覆蓋。

9
mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r [email protected]"); 

不能工作爲mail()只接受5個參數:bool mail (string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]])

對我來說都

mail($to, $subject, $message, null, "-r [email protected]"); 
mail($to, $subject, $message, 'Name <[email protected]>', "-r [email protected]"); 

工作(我沒有在任何後綴附加限制可能改寫發件人)。還要確保發件人的格式正確(沒有空格或任何內容)。

不過,我建議調整在php.ini的sendmail_path設置包括「-r [email protected]」參數。

如果它不爲你工作,你應該在這裏發佈的郵件頭,並檢查你的日誌文件warnigns /錯誤。注意:請確保您不會將用戶輸入的數據直接傳遞到mail(),因爲如果用戶可以插入換行符(例如\nCC: [email protected]在主題,郵件或郵件中),您的服務器可能用於發送垃圾郵件。

4

你已經在你的mail()調用中有了頭文件參數兩次,因此你的$additional_parameters參數沒有被使用,因爲它是一個函數中的第6個參數,它只接受5.你應該移動頭文件你的頭的其餘部分:

//Be mindful to protect from email injection attacks. 
$fromname = str_replace("\n", "", $fromname); 
$from = str_replace("\n", "", $from); 

//This assumes that $headers is already set, containing your other headers 
$headers .= 'From: ' . $fromname . ' <'.$from.">\n"; 

mail($to, $subject, $message, $headers, "-f $from -r [email protected]"); 

利用這一點,我希望你的第5個參數是現在多餘的,可以簡化爲:

$fromname = str_replace("\n", "", $fromname); 
$from = str_replace("\n", "", $from); 

$headers .= 'From: ' . $fromname . ' <'.$from.">\n"; 

mail($to, $subject, $message, $headers); 
+1

'trim'對字符串內的換行符沒有幫助。 – cweiske

+0

沒有必要同時指定'-r'和'-f'。 – MrTux

+0

@MrTux - 你是對的,那些標誌看起來完全一樣。但是,我不相信這是造成問題中描述的問題;爲了清晰起見,我將保留原樣。 – HPierce

4

在PHP中,語法mail˚F結如下:

mail($to, $subject, $message, $headers, $parameters); 

所以你的情況,如果要指定一個不同的「發件人」地址和不同的「返回路徑」你的代碼應該如下:

$to = "[email protected]"; 
$subject = "Your reset email"; 
$message = "<message text/html>"; 
$from = "[email protected]"; 
$bounceEmail = "[email protected]"; 
$headers = array(
    "From: " . $from 
); 
$headers = implode("\r\n", $headers); 
$parameters = "-r" . $bounceEmail; 

// Send it! 
mail($to, $subject, $message, $headers, $parameters); 

希望這有助於!

+0

引用PHP的文檔: 要在電子郵件標題末尾插入的字符串。 這通常用於添加額外的標題(From,Cc和Bcc)。 **多個額外的頭文件應該用CRLF(\ r \ n)**分隔。如果使用外部數據來組成這個頭部,則應對數據進行消毒,以便不會注入不需要的頭部。 http://php.net/manual/en/function.mail.php – Jamesking56

+0

^(MrTux的評論被刪除了,但我會離開這裏繁榮) – Jamesking56