PHP 使用表单验证器时出错

PHP Errors when using form validator

我在使用联系表时遇到了以下 PHP 错误,在客户说他们一周后没有收到电子邮件之前,它工作正常。作为一个朋友帮我做后端,他现在没空问,我想问问你是否可以给我一个提示,我需要修复什么。

错误:

`[Wed Feb 17 16:43:44 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP 注意:未定义变量: headers in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html

[Wed Feb 17 16:43:44 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP Warning: mail(): 发现多个或格式错误的换行符additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html

[2016 年 2 月 17 日星期三 16:45:18 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义变量:headers 在 /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html

[Wed Feb 17 16:45:18 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP Warning: mail(): 发现多个或格式错误的换行符additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html

[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义索引:/var/www/vhosts/wscgmbh 中的名称.de/httpdocs/php/contact-form-handler.php 第 12

[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义索引:/var/www/vhosts/wscgmbh 中的电子邮件.de/httpdocs/php/contact-form-handler.php 第 13

[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:标准错误:PHP 注意:未定义的索引:/var/www/vhosts/wscgmbh 中的消息.de/httpdocs/php/contact-form-handler.php 第 14

[2016 年 2 月 18 日星期四 09:40:15 [警告] [客户端 213.23.122.15] mod_fcgid:stderr:PHP 注意:未定义变量:headers 在 /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html

[2 月 18 日星期四 09:40:15 2016] [警告] [客户端 213.23.122.15] mod_fcgid:stderr:PHP 警告:mail():在additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html`


这是 form-handler 的代码,一直有效,但突然失效了

<meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
 <?php 
$errors = '';
$myemail = 'service@wscgmbh.de';
if(empty($_POST['name'])  || 
empty($_POST['email']) || 
empty($_POST['message']))
{
$errors .= "\n Error: all fields are required";
}

$name = $_POST['name']; 
$email_address = $_POST['email']; 
$message = $_POST['message']; 

if (!preg_match(
"/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]    {2,3})$/i", 
$email_address))
{
$errors .= "\n Error: Invalid email address";
}

if( empty($errors))
{
$to = $myemail; 
$email_subject = "Sie haben eine neue Nachricht von: $name";
$email_body = "Sie haben eine neue Nachricht erhalten, hier sind die     Details: \n\nName: $name \nEmail: $email_address \nNachricht: \n$message"; 

$headers [] .= 'From: WSC-Kontaktformular' . "\r\n";
$headers [] = "Antworten Sie: {$email_address}";

mail($to,$email_subject,$email_body,implode("\r\n",$headers));
//redirect to the 'thank you' page

echo '<script> 
        alert("Danke für Ihre Nachricht. Wir werden uns bald bei  melden!");
        window.location = "http://www.wscgmbh.de"
    </script>';
 } 
 ?>

我不是专家,PHP,所以我真的希望有人能帮助我! 非常感谢您!!!

这里的问题是你遗漏了(并将 header 声明为数组):
(另请参阅下面关于 Antworten Sie:Edit)。

$headers   = array();

放在上面:

$headers [] .= 'From: WSC-Kontaktformular' . "\r\n";
$headers [] = "Antworten Sie: {$email_address}";

您还需要删除点(连接)和 . "\r\n"

implode("\r\n",$headers) 会处理的。

$headers   = array();
$headers [] = 'From: WSC-Kontaktformular';
$headers [] = "Antworten Sie: {$email_address}";

根据邮件手册的示例:

$headers   = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=iso-8859-1";
$headers[] = "From: Sender Name <sender@domain.com>";
$headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
$headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
$headers[] = "Subject: {$subject}";
$headers[] = "X-Mailer: PHP/".phpversion();

mail($to, $subject, $email, implode("\r\n", $headers));

此外,From: 需要的是电子邮件而不是姓名,因此邮件可能因此而成为垃圾邮件。

  • 使用电子邮件地址。

参考:


如果你想使用点(连接)和 \r\n,那么你需要使用以下内容,并按照手册中的示例:

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);

编辑:

我注意到 Antworten Sie: 这个词在德语中似乎是 "reply" 的意思(当我访问 Google 翻译时)。

如果它是 From:Reply-to,那么您不能将其用作邮件 header 的一部分,而是 Reply-To:根据手册状态:

Reply-To: webmaster@example.com

因此,您的代码需要读作:

$headers   = array();
$headers [] = 'From: WSC-Kontaktformular';
$headers [] = "Reply-To: {$email_address}";

这也是导致 header 失败的一个因素。

改变mail($to,$email_subject,$email_body,implode("\r\n",$headers));

至:

if(mail($to,$email_subject,$email_body,implode("\r\n",$headers))) { 
      echo "Mail sent."; 
   } else { 
      echo "Error."; 
   }

如果您看到 "Mail sent",那么 mail() 就完成了它的工作。还可以查看您的垃圾邮件。

error reporting 添加到您的文件的顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

旁注:显示错误只应在试运行中进行,绝不能在生产中进行。


考虑使用 PHPMailer 或 Swiftmailer:

它们是 PHP 的 mail() 功能的替代品。