1

お問い合わせフォームを設置しようとしています。フォームは電子メールを送信し、オプションで送信者を CC します。JavaScript が有効になっている場合、フォームは contact-ajax.php に送信され (フォームを感謝のメッセージに置き換えます)、それ以外の場合は contact.php に送信されます (感謝のページにリダイレクトされます)。フォールバック フォームは正常に機能しますが、ajax フォームが起動するたびに、完全に空のメールが送信されます (CC オプションがオンになっている場合は、送信者と受信者の両方に送信されます)。なぜこれが起こっているのかわかりません。任意の洞察をいただければ幸いです。

フォーム HTML:

<form method="post" id="email_form" name="email_form" action="contact.php">
    <label for="name">Name:</label><br />
    <input type="text" name="name" id="name" placeholder="John Doe" /><br />
    <label for="email">Email Address:</label><br />
    <input type="text" name="email" id="email" placeholder="johndoe@gmail.com" /><br />
    <label for="subject">Subject </label></td><br />
    <input type="text" name="subject" id="subject" placeholder="Subject" /><br />
    <label for="message">Message:</label></td><br />
    <textarea cols="35" rows="5" name="message" id="message" placeholder="Your Message"></textarea><br />
    <input type="checkbox" name="cc" id="cc" checked value="Yes" /><label for="cc"> Send yourself a copy of this message</label><br />
    <input class="submit pulldown button" name="submit" id="submit" type="submit" value="Send Message" />
</form>

Javascript:

$(document).ready(function() {
$('#email_form #submit').click(function(event) {
    event.preventDefault();
    $.ajaxSetup ({
        cache: false
        });
    $.ajax({
        type: 'POST',
        url: 'contact-ajax.php',
        data: $("#email_form").serializeArray(),
        success: function(msg) {
            if(msg=='Mail sent') {
                alert(msg);
                }
            else {
                alert('Error sending mail. Please try again.');
                }
            },
        error: function(ob,errStr) {
            alert('Error sending mail. Please try again.');
            }
        });
    return false;
    });
});

スクリプトによって呼び出される PHP フォーム (contact-ajax.php):

<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    $name = $_POST['name'];
    $visitor_email = $_POST['email'];
    $email_subject = $_POST['subject'];
    $message = $_POST['message'];
    $today = date('r');
    $email_from = "address@domain.tld";
    $to = "address@domain.tld";
    $email_body = "On $today $name wrote:\n"."$message";
    $headers = "From: $email_from \r\n";
    $headers .= "Reply-To: $visitor_email \r\n";
    if (isset($_POST['cc'])) {
        $headers .= "CC: $visitor_email \r\n";
        }
    $headers .= "X-Mailer: PHP/". phpversion();
    mail($to,$email_subject,$email_body,$headers);
    if(mail($to, $subject, $body, $headers)) {
        die('Mail sent');
        }
    else {
        die('Error: Mail failed');
        }
    }
?>

非 Ajax php スクリプト (contact.php) はheader('Location: thanks_page.html');、最後のifステートメントではなく で終わることを除いて、同じです。

空白の電子メールには件名やメッセージ本文は含まれませんが、差出人、返信先、および CC フィールドはすべて、正しい (空ではない) メッセージとまったく同じように入力されます。私は数日間問題を理解しようとしてきましたが、追跡できないようです。

4

4 に答える 4

3

mail 関数 send mail.. mail() を 2 回書きます.. if の戻り値をチェックするだけで十分です

mail($to,$email_subject,$email_body,$headers);
if(mail($to, $subject, $body, $headers)) { ......

この方法でのみ使用してください:

if(mail($to, $subject, $body, $headers)) { //mail sent 
} else { 
//mail not sent 
}

UPDATE は使いやすいPHPMailerを使用し、単純な php メール機能よりも優れていると思います。

于 2013-01-27T23:42:31.723 に答える
0

2 通のメールを受け取る理由をカバーするすべての回答を除いて、2 通目のメールが空である理由にはかなり明白な理由があります。

mail($to,$email_subject,$email_body,$headers);
if(mail($to, $subject, $body, $headers)) 

if ステートメントでは$subject、 and$bodyの代わりに$email_subjectandがあり$email_bodyます。

于 2013-01-28T01:07:03.670 に答える
0

私はこれだと信じています:

if (isset($_POST['cc'])) {
    $headers .= "CC: $visitor_email \r\n";
}
$headers .= "X-Mailer: PHP/". phpversion();
mail($to,$email_subject,$email_body,$headers); <-- Sends FIRST email
if(mail($to, $subject, $body, $headers)) { <-- Sends ANOTHER email
    die('Mail sent');
    }
else {
    die('Error: Mail failed');
    }
}

多分試してください:

$retVal = mail($to,$email_subject,$email_body,$headers);
if($retVal) {

ありがとう、マット

于 2013-01-27T23:46:46.727 に答える
0

ベンスは、あなたがメール機能を 2 回呼び出した有効な点を指摘しています...

一部の情報が空白になっている理由がよくわかりませんが、PHP でこれを実行できますか? :

$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $visitor_email \r\n";
if (isset($_POST['cc'])) {
    $headers .= "CC: $visitor_email \r\n";
    }

代わりに、常に次のように連結を行います。

$headers = "From: ".$email_from." \r\n";
$headers .= "Reply-To: ".$visitor_email." \r\n";
if (isset($_POST['cc'])) {
    $headers .= "CC: ".$visitor_email." \r\n";
    }
于 2013-01-27T23:49:53.287 に答える