2010-03-04 42 views
2

以下代碼向我發送一封電子郵件,其中包含以下變量。最後一條if語句中的一條說明如果(郵件)回顯「你會很快與你聯繫」。當腳本運行時,我得到迴應「你會很快聯繫」,但是,我從來沒有收到一封電子郵件。PHP郵件功能,這裏有什麼錯?

我確實有一個較小的聯繫人腳本(在此之後發佈的第一個較大的聯繫人腳本)。

注:contants.php和functions.php中都包含,做工精細 WEBMASTER_EMAIL在contanstants.php定義是正確的,因爲我的 較小的接觸腳本使用相同的變量和電子郵件我很好。

感謝您的幫助

<?php 

// pull constant variables 
include("php/constants.php"); 

error_reporting (E_ALL^E_NOTICE); 

$post = (!empty($_POST)) ? true : false; 

if($post) { 
    include ("php/functions.php"); 
} 

// general info 
$name = stripslashes($_POST['contact']); 
$phone = $_POST['phone']; 
$email = trim($_POST['email']); 
$time_to_reach = $_POST['time-to-reach']; // what the best time to reach them? 

// delivery info 
$delivery_address = $_POST['del-address']; 
$delivery_city = $_POST['del-city']; 
$delivery_state = $_POST['del-state']; 
$delivery_zip = $_POST['del-zip']; 

// moving city info if applicable 
$moving_address = $_POST['move-address']; 
$moving_city = $_POST['move-city']; 
$moving_state = $_POST['move-state']; 
$moving_zip = $_POST['move-zip']; 

// date needed 
$month = $_POST['month']; 
$day = $_POST['day']; 
$year = $_POST['year']; 

// how long do you need the storage? 
$storage_length = $_POST['time-length']; 

// how many containers do you need? 
$quantity_containers = $_POST['number-of-containers']; 

// how did you hear about us? 
$tracker = $_POST['tracker']; 

// message 
$message_holder = htmlspecialchars($_POST['message']); 

$error = ''; 

// check general info 
if(!$name) { $error .= 'Please enter your name.<br />'; } 
if(!$email) { $error .= 'Please enter an e-mail address.<br />'; } 
if($email && !ValidateEmail($email)) { $error .= 'Please enter a valid e-mail address.<br />'; } 
if(!$time_to_reach) { $error .= 'Please select the best time to reach you.<br />'; } 

// check delivery info 
if(!$delivery_address) { $error .= 'Please enter you current address.<br />'; } 
if(!$delivery_city) { $error .= 'Please enter your current city.<br />'; } 
if(!$delivery_state) { $error .= 'Please enter your current state.<br />'; } 
if(!$delivery_zip) { $error .= 'Please enter your current zip code.<br />'; } 

// check date needed 
if(!$month) { $error .= 'Please enter the approximate date you need the storage.<br />'; } 
if(!$day) { $error .= 'Please enter the approximate date you need the storage.<br />'; } 
if(!$year) { $error .= 'Please enter the approximate date you need the storage.<br />'; } 

// check length of time needed 
if(!$storage_length) { $error .= 'Approximatly how long will you need the storage unit for?<br />'; } 

// check quantity of storages 
if(!$quantity_containers) { $error .= 'How many containers will you need?<br />'; } 

// check advertising tracker 
if(!$tracker) { $error .= 'Please let us know how you\'ve heard of us.<br />'; } 

// check message (length) 
if(!$message_holder || strlen($message_holder) < 10) { 
    $error .= "Please enter your message. It should have at least 10 characters.<br />"; 
} 

// build email message 
$message = "Name: {$name} 
Phone: {$phone} 
Email: {$email} 
Best time to reach: {$time_to_reach}\n 
----------------------------------------------------- 
Delivery address: {$delivery_address} 
       {$delivery_city}, {$delivery_state} {$delivery_zip} 

Moving address: {$moving_address} 
       {$moving_city}, {$moving_state} {$moving_zip} 
----------------------------------------------------- 
Date needed: {$month}/{$day}/{$year} 
Length of time needed: {$storage_length} 
Number of containers: {$quantity_containers} 
Where did you hear about us? 
{$tracker}\n 
Message: {$message_holder}\n"; 

if(!$error) { 
    $mail = mail(WEBMASTER_EMAIL, $subject, $message, 
     "From: [email protected]\r\n" 
     ."Reply-To: ".$name."<".$email.">\r\n" 
     ."X-Mailer: PHP/" . phpversion()); 

    if($mail) { 
     echo '<p>Thank you, you will be contacted soon.</p>'; 
    } 
} else { 
    echo '<div class="notification_error">'.$error.'</div>'; 
} 

?> 

下面的腳本,腳本接觸,沒有工作意味着我收到一封電子郵件。

<?php 

// pull constant variables 
include("php/constants.php"); 

error_reporting (E_ALL^E_NOTICE); 

$post = (!empty($_POST)) ? true : false; 

if($post) { 
    include ("php/functions.php"); 
} 

// variables 
$name = stripslashes($_POST['name']); 
$phone = $_POST['phone']; 
$email = trim($_POST['email']); 
$tracker = $_POST['tracker']; 
$message_holder = htmlspecialchars($_POST['message']); 

$error = ''; 

// check name 
if(!$name) { 
    $error .= 'Please enter your name.<br />'; 
} 

// check email 
if(!$email) { 
    $error .= 'Please enter an e-mail address.<br />'; 
} 

// validate email 
if($email && !ValidateEmail($email)) { 
    $error .= 'Please enter a valid e-mail address.<br />'; 
} 

// check advertising tracker 
if(!$tracker) { 
    $error .= 'Please let us know how you\'ve heard of us.'; 
} 

// check message (length) 
if(!$message_holder || strlen($message_holder) < 10) { 
    $error .= "Please enter your message. It should have at least 10 characters.<br />"; 
} 

// build email message 
$message = "Name: {$name} \n 
Phone: {$phone} \n 
Email: {$email} \n 
Where did you hear about us? 
{$tracker}\n\n 
Message: {$message_holder}\n"; 

if(!$error) { 
    $mail = mail(WEBMASTER_EMAIL, $subject, $message, 
     "From: [email protected]\r\n" 
     ."Reply-To: ".$name."<".$email.">\r\n" 
     ."X-Mailer: PHP/" . phpversion()); 

    if($mail) { 
     //header("Location: thank_you.php"); 
     echo "Thank you. You will be contacted soon."; 
    } 
} else { 
    echo '<div class="notification_error">'.$error.'</div>'; 
} 

?> 
+1

只是一個愚蠢的評論 - - 你可以考慮'$ post =(!empty($ _ POST))? true:false;'進入'$ post =!empty($ _ POST);'。 – 2010-03-04 18:05:48

+1

第二個想法是,根據PHP文檔,'empty()'等於'!((bool)$ var)',所以你可以使用'$ post =(bool)$ _ POST;'。 – 2010-03-04 18:21:29

回答

2

使用赤裸裸的郵件功能是自找麻煩(http://en.wikipedia.org/wiki/E-mail_injection,PHP的具體信息:http://www.damonkohler.com/2008/12/email-injection.html),並防止簡單的調試。我建議你在郵件功能上使用對象封裝,這是因爲當你過濾標題時,通過使它成爲一個非標準的PHP郵件表單頭注入垃圾郵件發送者的目標,並且允許你更容易地調試郵件傾倒創建的郵件對象並查看其內容。對於調試,它還允許您在沒有/不想擁有郵件服務器並且不想嘗試的計算機上進行本地測試的情況下提供「最終回顯郵件」在您只是測試功能時發送郵件。

這裏是我創建並使用自己的包裝(可供修改和使用): http://github.com/tchalvak/ninjawars/blob/master/deploy/lib/obj/Nmail.class.php

或者只是看看PEAR郵件:http://pear.php.net/package/Mail/

+0

Err,只是要注意,我提到的Nmail類沒有在該版本中內置的必要的用戶輸入驗證內容,因此您必須自己創建這些內容。 – Kzqai 2010-03-04 22:59:40

+0

爲這個例子添加了一些天真的黑名單過濾,但我會說只是用梨郵件去。 :d – Kzqai 2010-03-04 23:42:28

0

這不是我跳出來,爲什麼不你是否試圖把錯誤一直轉到最後,看看它是否有效。

error_reporting(1); 

在腳本的頂部。

0

編輯:對不起,我現在看到你有打開錯誤報告。確保您的INI文件設置正確。嘗試刪除^ E_NOTICE,以便您也看到這些警告。

我有問題,mail()根本不會說什麼(它會執行,如果成功)。如果您傾向於使用mail(),則可以使用SwiftMailer,它在出現錯誤時通常會引發有用的異常,並且包括一個使用mail()的傳輸類Swift_MailTransport,但它們都裝扮成一個很好的面向對象的界面。

0

因此,由於問題的性質(郵件正在接收交付 - $郵件爲真),問題可能出現在郵件內容中。你有權訪問郵件服務器本身嗎?你能檢查日誌嗎? var_dump()$ subject,$ message,並將頭文件設置爲var和var_dump()。用細齒梳檢查內容物。刪除可疑字符和換行符,直到它可以正常工作。

有一件事要嘗試......(雖然,你的其他郵件被接受了這個事實說,這很可能並非如此)

http://www.php.net/manual/en/function.mail.php

如果沒有收到郵件,只能儘量 使用LF(\ n)的。一些差 質量Unix郵件傳輸代理 自動取代LF由CRLF自動 (如果CRLF是 使用導致CR翻倍)。這應該是最後的手段, 因爲它不與»RFC 2822

與郵件的問題()是,它只是餵養發送到本地sendmail守護進程遵守。它不會給你任何有關郵件的積極反饋,並且中繼郵件頭有時會讓你的垃圾郵件降級。

我檢查出http://sourceforge.net/projects/phpmailer/

0

在消息中嘗試包裹線與 $消息=換行70個字符($消息,70); 嘗試用\ n代替\ r \ n,以防您的郵件功能替換爲\ r \ n \ n並且您以\ r \ r結尾\ n