为什么此电子邮件表格代码无效?

问题描述:

我试图运行一个电子邮件表单,它从用户的输入表单中获取文本并将它们发送到我想要的电子邮件(在下面的php中被看作$ myemail)。为什么此电子邮件表格代码无效?

<form method="post" name="contact_form" action="Contact.php"> 
     Your Name: <input type="text" required name="name"> 
     Email Address: <input type="text" required name="email"> 
     Message: <textarea required name="message"></textarea> 
     <input type="submit" value="Submit"> 
</form> 

<?php 
$errors = ''; 
$myemail = 'enterDesiredEmail'; 

if(empty($_POST['name']) || empty($_POST['email']) || empty($_POST['message'])) { 
     $errors .= "\n Error: all fields are required"; 
} 

$name = null; 
$email_address = null; 
$message = null; 

$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 = "Contact form submission: $name"; 
    $email_body = "You have received a new message. ". 
    " Here are the details:\n Name: $name \n ". 
    "Email: $email_address\n Message \n $message"; 
    $headers = "From: $myemail\n"; 
    $headers .= "Reply-To: $email_address"; 
    mail($to,$email_subject,$email_body,$headers); 
} 
?> 

我把上面的代码吐出到网页上,然后把文件上传到我的服务器。在网上访问网页,填写表单内容并点击sbmit,页面刷新后输入文本和textarea会按预期清除。当我查看了我设置的电子邮件时,没有收到任何消息。我能做些什么来纠正这个代码,以便所需的电子邮件地址实际上收到一条消息?

非常感谢。

+2

邮件命令需要设置sendmail或其他邮件服务器。 –

+0

尝试并向您的标题添加类型,以便服务器知道如何处理脚本。按类型我的意思是如果它是一个HTML电子邮件或只是文本。其次,为邮件功能实例化一个变量。如果邮件实际发送则返回true,否则返回false。例如$ send = mail(....):if($ sent)做东西....希望这会有所帮助 –

+1

您需要在标题字段之间加上'\ r \ n',而不是'\ n'。 – Barmar

一些指针可能会很好地解决您的问题没有明确告诉你是什么原因这个问题实际上是:

1)Use Error Logging

2)检查您的服务器上是否有有效的邮件服务器设置。如Jason K.的评论中所述

3)使用邮寄图书馆,如PHPMailer。它回避了大量的头痛。

4)检查您的电子邮件地址是否有效the correct code,主要是使用filter_var而不是使用钝的正则表达式。

也检查电子邮件是消毒FILTER_SANITIZE_EMAIL)以及。

5)如果不使用或者建立一个库,如PHPMailer的或SwiftMailer那么你需要检查您mail headers are exactly correct

BONUS
似乎有什么用电子邮件行尾[包括标题]一些conflictingaccounts,但我会建议PHP_EOL\r\n(在Linux服务器上同样的事情)。 \n不适合。正如Barmar的评论所述。

祝你好运

您需要从内插双引号内的实际$电子邮件变量:如果您指定其他标题,如收件人,抄送和密件抄送
$headers = "From: $myemail\n";$headers = "From: ${myemail}"."\r\n";

额外的标题应该用CRLF(\ r \ n)分隔。

这是从PHP文档的例子:

`<?php 
    $to  = '[email protected]'; 
    $subject = 'the subject'; 
    $message = 'hello'; 
    $headers = 'From: [email protected]' . "\r\n" . 
    'Reply-To: [email protected]' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 
    mail($to, $subject, $message, $headers); 
?> 

编码愉快!

+1

''From:$ myemail \ n“'和'”From:$ {myemail} \ n“'没有区别。你只需要花括号来处理复杂的变量。 – Barmar

您应该尝试使用PHPMailer等库。在大多数情况下,mail()函数有时不够灵活以达到您所需要的。 mail()功能还需要本地邮件服务器。另外,PHPMailer提供了很多插件,例如设置附件的能力或向用户发送HTML电子邮件的能力。使用这样的图书馆也意味着你的电子邮件将会在很多人测试和使用之后几乎所有的时间被发送出去。

你可以找到这里使用的PHPMailer教程:使用PHPMailer的从网站采取https://www.sitepoint.com/sending-emails-php-phpmailer/

示例代码:

<?php 

require_once "vendor/autoload.php"; 

//PHPMailer Object 
$mail = new PHPMailer; 

//From email address and name 
$mail->From = "[email protected]"; 
$mail->FromName = "Full Name"; 

//To address and name 
$mail->addAddress("[email protected]", "Recepient Name"); 
$mail->addAddress("[email protected]"); //Recipient name is optional 

//Address to which recipient will reply 
$mail->addReplyTo("[email protected]", "Reply"); 

//CC and BCC 
$mail->addCC("[email protected]"); 
$mail->addBCC("[email protected]"); 

//Send HTML or Plain Text email 
$mail->isHTML(true); 

$mail->Subject = "Subject Text"; 
$mail->Body = "<i>Mail body in HTML</i>"; 
$mail->AltBody = "This is the plain text version of the email content"; 

if(!$mail->send()) 
{ 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} 
else 
{ 
    echo "Message has been sent successfully"; 
} 

?>