2012-03-01 39 views
1

我正在爲我的網站使用PHP提供反饋表單,我認爲它正在工作,但隨後它將箭頭指向代碼。PHP郵件表格無法正常工作

無論如何,表單有4個字段:「名稱」,「電子郵件」,「主題」和「消息」。

如果所有四個字段都有內容,我會收到「消息失敗」警報。

看作爲是這種情況,我在4個場的3與內容測試,這使我4個組合:

combo 1 - "name", "email", "subject" 
combo 2 - "name", "email", "message" 
combo 3 - "name", "subject", "message" 
combo 4 - "email", "subject", "message" 

將結果如下:

combo 1 - "Thank you for your message." 
combo 2 - "Thank you for your message." 
combo 3 - "Message failed." 
combo 4 - "Thank you for your message." 

這裏是我使用的HTML代碼:

<form action="contact.php" method="post"> 
    <input type="hidden" name="page" value="contact" /> 
    <input type="hidden" name="req" value="submit" /> 
    Your Name: <input type="text" name="name" /> 
    <br/> 
    Your Email: <input type="text" name="email" /> 
    <br/> 
    Subject: <input type="text" name="subject" size="69" /> 
    <br/> 
    Message: 
    <br/> 
    <textarea cols="63" rows="8" name="message"></textarea> 
    </br> 
    <input type="submit" value="Send" /> 
    <input type="reset" value="Clear" /> 
</form> 

這裏是contact.php:

<?php 
    $field_name = $_POST['name']; 
    $field_email = $_POST['email']; 
    $field_subject = $_POST['subject']; 
    $field_message = $_POST['message']; 

    $mail_to = '[email protected]_website.com'; 
    $subject = 'Message from a site visitor '.$field_name; 

    $body_message = 'From: '.$field_name."\n"; 
    $body_message .= 'E-mail: '.$field_email."\n"; 
    $body_message .= 'Subject: '.$field_subject."\n"; 
    $body_message .= 'Message: '."\n"; 
    $body_message .= $field_message; 

    $headers = 'From: '.$field_email."\r\n"; 
    $headers .= 'Reply-To: '.$field_email."\r\n"; 

    $mail_status = mail($mail_to, $subject, $body_message, $headers); 

    if ($mail_status) { ?> 
<script language="javascript" type="text/javascript"> 
    alert('Thank you for your message.'); 
    window.location = './contact.html'; 
</script> 
<?php 
    } 
    else { ?> 
<script language="javascript" type="text/javascript"> 
alert('Message failed.'); 
window.location = './contact.html'; 
</script> 
<?php 
    } 
?> 

代碼有問題嗎?我不明白爲什麼這樣做。

+1

當測試組合,你在字段中輸入相同的值全部時間即thisadress @ hotmail的。每次都在電子郵件中發送。 – Anton 2012-03-01 23:32:12

+0

好吧,電子郵件是一個不好的例子,因爲它是唯一沒有在失敗的消息中使用的例子。但你明白了。 – Anton 2012-03-01 23:34:08

+0

是的,我確實把每個領域相同的價值 – Anon 2012-03-01 23:40:45

回答

3

來自Anton的很好的答案,但我想挖掘一點點,並擴大他的答案。

如果你想確保有人發送電子郵件,需要用PHP進行硬編碼(而且html5也會很酷,但這可以避免,所以你仍然需要php)。我也刪除了javascript位,因爲它感覺不相關。這是我會嘗試,因爲它是短暫的,我會在同一頁面做所有。有許多微妙的變化:

<?php 
$field_name = $_POST['name']; 
$field_email = $_POST['email']; 
$field_subject = $_POST['subject']; 
$field_message = $_POST['message']; 


//If all required fields are filled 
if (!empty($field_name)&&!empty($field_email)&&!empty($field_message)) 
    { 
    $mail_to = '[email protected]_website.com'; 
    $subject = 'Message from a site visitor: '.$field_name; 

    $body_message = 'From: '.$field_name."\n"; 
    $body_message .= 'E-mail: '.$field_email."\n"; 
    $body_message .= 'Subject: '.$field_subject."\n"; 
    $body_message .= 'Message: '."\n"; 
    $body_message .= $field_message; 

    $headers = 'From: '.$field_email."\r\n"; 
    $headers .= 'Reply-To: '.$field_email."\r\n"; 

    $mail_status = mail($mail_to, $subject, $body_message, $headers); 

    echo "Thank you for your message."; 
    } 

//If not all required fields are filled display form again. 
else 
    { ?> 
    Please fill all the required fields.<br> 

    <form action="" method="post"> 
    <input type="hidden" name="page" value="contact" /> 
    <input type="hidden" name="req" value="submit" /> 

    <?php //The php bits are to retrieve the valid fields ?> 
    Your Name*: <input required type="text" value="<?php echo $field_name; ?>" name="name"/> 
    <br/> 
    Your Email*: <input required type="email" value="<?php echo $field_email; ?>" name="email" /> 
    <br/> 
    Subject: <input type="text" name="subject" value="<?php echo $field_subject; ?>" size="69" /> 
    <br/> 
    Message*: 
    <br/> 
    <textarea required cols="63" rows="8" name="message"><?php echo $field_message; ?></textarea> 
    </br> 
    <input type="submit" value="Send" /> 
    <input type="reset" value="Clear" /> 
    </form> 

    <?php 
    } 
?> 

否則,如果你不關心誰發送,你可以只是把這樣的事情

$field_name = $_POST['name']; 
$field_email = $_POST['email']; 
if (empty($field_email)) $field_email="[email protected]"; 
$field_subject = $_POST['subject']; 
$field_message = $_POST['message']; 

最後一件事,我希望這只是一個僞代碼,因爲它不符合幾乎所有的html規則。您需要< HTML>標籤,<身體>等...

只是測試和偉大的工作(;

+0

我仍然有同樣的問題。我嘗試了4種組合並且有相同的問題,但這次它說「謝謝你的留言。」但我沒有收到電子郵件。 – Anon 2012-03-02 01:18:50

1

的問題大概是這樣的:從http://php.net/manual/en/function.mail.php

報價發送郵件時,郵件必須包含From頭部。這可以是 使用additional_headers參數設置,或者可以在php.ini中設置默認值 。

如果不這樣做將導致類似警告的錯誤消息: 郵件():「sendmail_from」沒有在php.ini或自定義設置「從:」頭 失蹤。 From標題也​​設置Windows下的Return-Path。

換句話說,如果您沒有包含正確的「From:[email protected]」的標題,則會發生錯誤。