我已经向引导站点添加了一个电子邮件表单,并且正在发送和接收电子邮件,但内容被剥离了。电子邮件到达时没有消息,姓名,电子邮件地址等。我绝对是一个新手,所以我假设脚本有问题。请你们好心看看这个剧本,告诉我我错过了什么?谢谢。
<?php
header('Content-type: application/json');
$status = array(
'type'=>'success',
'message'=>'Email sent!'
);
$name = @trim(stripslashes($_POST['name']));
$email = @trim(stripslashes($_POST['email']));
$subject = @trim(stripslashes($_POST['subject']));
$message = @trim(stripslashes($_POST['message']));
$email_from = $email;
$email_to = 'david@myemail.com';
$body = 'Name: ' . $name . "'n'n" . 'Email: ' . $email . "'n'n" . 'Subject: ' . $subject . "'n'n" . 'Message: ' . $message;
$success = @mail($email_to, $subject, $body, 'From: <'.$email_from.'>');
echo json_encode($status);
die;
Here's the HTML
<div class="col-sm-8">
<h4>Contact Form</h4><br><br>
<div class="status alert alert-success" style="display: none"></div>
<form id="main-contact-form" class="contact-form" name="contact-form" method="post" action="sendemail.php" role="form">
<div class="row">
<div class="col-sm-5">
<div class="form-group">
<input type="text" class="form-control" required placeholder="First Name">
</div>
<div class="form-group">
<input type="text" class="form-control" required placeholder="Last Name">
</div>
<div class="form-group">
<input type="text" class="form-control" required placeholder="Email address">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-lg">Send Message</button>
</div>
</div>
<div class="col-sm-7">
<textarea name="message" id="message" required class="form-control" rows="8" placeholder="Message"></textarea>
</div>
</div>
</form>
</div><!--/.col-sm-8-->
首先,你需要在 die 语句之后转义你的 php 标签,否则什么都行不通,因为 php 认为你有疯狂的语法错误(html),因为你从来没有关闭过 php。
无论如何,我小心翼翼地用我在另一个网站上的表单替换了您的 php,它似乎可以很好地发送电子邮件。这让我相信问题主要出在您的标记上。
仔细查看您的标记,我发现只有表单和文本区域元素具有 name 属性。 @Sean是正确的,因为每个输入都需要设置名称属性,否则您将无法使用 PHP 访问它。
当你写语句时,你说$name = $_POST['name'];
"从名称属性等于'name'的输入元素中获取值,并将其值存储在php变量$name
中"。您的电子邮件功能正常工作但不传递表单数据的原因是您的输入缺少所需的名称属性。如果你做一个
var_dump $name; die;
您将看到$name内部没有值。因此,mail() 函数也不起作用。
所以比较
<input type="text" class="form-control" required placeholder="First Name">
<input type="text" class="form-control" required placeholder="Last Name">
<input type="text" class="form-control" required placeholder="Email address">
跟
<input name="first_name" type="text" class="form-control" required placeholder="First Name">
<input name="last_name" type="text" class="form-control" required placeholder="Last Name">
<input name="email_address" type="text" class="form-control" required placeholder="Email address">
现在我们已经为输入提供了名称属性,并且 php 有一种方法可以引用它们,我们可以说:
$name = @trim(stripslashes($_POST['first_name']));
$email = @trim(stripslashes($_POST['last_name']));
$subject = @trim(stripslashes($_POST['email_address']));
花点时间确保每个 $_POST 调用都具有其相应输入的 name 属性。不管你给它们起什么名字,只要它们匹配。
完成此操作后,您应该会看到电子邮件中传递的正确值。其他一些小要点是删除@Raptor提到的函数之前的@符号。这些不会破坏您的脚本,但是如果出现错误,它们会让您失明。@ 符号表示"抑制错误消息",因此在没有它们的情况下它的工作原理基本相同:
$name = trim(stripslashes($_POST['first_name']));
$email = trim(stripslashes($_POST['last_name']));
$subject = trim(stripslashes($_POST['email_address']));
更好的是仔细处理错误,像这样
try {
$success = mail($to, $company_name, $body, 'From: <'.$email.'>');
} catch (Exception $e) {
echo 'Exception: ' . $e->getMessage();
}
但这是另一个主题。
此外,正如@Raptor所提到的,您并没有真正从$status数组中获得任何好处,因为您没有更新它以反映是否发送电子邮件的结果。由于没有必要使此脚本正常工作,因此我想说暂时省略该部分。
还可以考虑使用 php 的 heredoc 函数来创建电子邮件的正文内容。它增加了源代码和生成的电子邮件的可读性。现在你可以看到使用 php 邮件功能实际上是多么简单。这是你的php正在做的事情的精简版本,所以你可以看到主句柄。
<?php
// handle form submission
$emailSubject = 'Entry from your contact form';
$to = 'david@myemail.com';
$name = $_POST['full_name'];
$phone = $_POST['phone_number'];
$email = $_POST['email'];
$comments = $_POST['comments'];
$body = <<<EOD
<br><hr><br>
Full Name: $name <br>
Phone: $phone <br>
Email: $email <br>
Message from user: $comments <br>
EOD;
$headers = "From: $email'r'n";
$headers .= "Content-type: text/html'r'n";
$success = mail($to, $emailSubject, $body, $headers);
?>
希望这可以帮助您解决问题,如果我错过了什么,请告诉我。祝你好运!