我遇到一个简单的PHP联系表单问题。我发送表单时没有遇到任何错误,但没有任何内容发送到我的电子邮箱。 任何帮助将不胜感激。
这是HTML
<form method="POST" name="contactform" action="contact-form-handler.php">
<p>
<label for='name'>Your Name:</label> <br>
<input type="text" name="name">
</p>
<p>
<label for='email'>Email Address:</label> <br>
<input type="text" name="email"> <br>
</p>
<p>
<label for='message'>Message:</label> <br>
<textarea name="message"></textarea>
</p>
<input type="submit" value="Submit"><br>
</form>
和PHP
<?php
$errors = '';
$myemail = 'name@website.com';//<-----Put Your email address here.
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 = "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);
//redirect to the 'thank you' page
header('Location: contact-form-thank-you.html');
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Contact form handler</title>
</head>
<body>
<!-- This page is displayed only if there is some error -->
<?php
echo nl2br($errors);
?>
答案 0 :(得分:2)
检查基础邮件系统。
如果你在Linux机器上,它可能只配置为本地交付,这样你就可以发送电子邮件到你的用户名@ yourhostname,它最终会在/var/mail/yourusername
此外,您应在exit()
调用后放置Header
,以便在重定向后不再发送其他HTML。
答案 1 :(得分:0)
对于从PHP脚本发送电子邮件,我建议您使用PHPMailer类http://phpmailer.worxware.com/
它易于实现且易于使用。我给你举了一个例子(抱歉西班牙语评论:)):
发件人: 西班牙语 ▼ 至: 英语 ▼强>
// Instantiate an object of the class we call phpmailer
// For example
mail $ mailer = new phpmailer ();
// define the properties and call methods
// for the mail order
// With PluginDir tells the phpmailer class which
// is the class smtp as I mentioned at the beginning of
// this example will be in the subdirectory includes
$ mailer-> PluginDir = ". /Inc/";
// With the Mailer property we indicate that we will use an SMTP server
$ mailer-> Mailer = "smtp";
// Assign to Host the name of our SMTP server
$ mail-> Host = "EmailServer.com"
// We tell you which is our username and password
$ mail-> Username = "email", $ mail-> Password = "passwd"
// Indicate which is our-n-mail address and name it
// we want to see the user who reads our email
$ mailer-> From = "senderemail@sender.com"
$ mailer-> FromName = "Sender name" ;
// The default Timeout 10, is a bit low because I use
// a free account, so I put it to 15
$ Mailer-> Timeout = 15;
// Indicate which is the destination address of the email
$ mailer-> AddAddress ($ this-> destination);
// Assign the message subject and body. The body of the message put in html
$ mailer-> Subject = "Subject"
$ mailer-> Body = "Body with HTML"
// Define AltBody by mail if the recipient does not support html formatted email
$ mailer-> AltBody = "Alternative Body";
// Send the message, if no problems // $ success variable contains the value true
$ success = $ mailer-> Send ();
// If the message has not been sent 4 trials be conducted more like a lot
// to send the message, every attempt will be made 5 seconds after
// the previous one, for it uses the sleep function
$ Tries = 1; while ((! $ Exit) & & ($ attempts <5))
{
sleep (4),
$ success = $ mailer-> Send (), $ attempts + +;
}
if (! $ success)
{
echo "Failed to send. Try again later..
$ mailer-> ErrorInfo;} else {echo" Query successfully sent. "
}
原始答案版本
//instanciamos un objeto de la clase phpmailer al que llamamos
//por ejemplo mail
$mailer = new phpmailer();
//Definimos las propiedades y llamamos a los métodos
//correspondientes del objeto mail
//Con PluginDir le indicamos a la clase phpmailer donde se
//encuentra la clase smtp que como he comentado al principio de
//este ejemplo va a estar en el subdirectorio includes
$mailer->PluginDir = "./inc/";
//Con la propiedad Mailer le indicamos que vamos a usar un servidor smtp
$mailer->Mailer = "smtp";
//Asignamos a Host el nombre de nuestro servidor smtp
$mail->Host = "EmailServer.com";
//Le decimos cual es nuestro nombre de usuario y password
$mail->Username = "email";
$mail->Password = "passwd";
//Indicamos cual es nuestra direcci—n de correo y el nombre que
//queremos que vea el usuario que lee nuestro correo
$mailer->From = "senderemail@sender.com";
$mailer->FromName = "Sender name";
//el valor por defecto 10 de Timeout es un poco escaso dado que voy a usar
//una cuenta gratuita, por tanto lo pongo a 15
$mailer->Timeout=15;
//Indicamos cual es la dirección de destino del correo
$mailer->AddAddress($this->destino);
//Asignamos asunto y cuerpo del mensaje. El cuerpo del mensaje lo ponemos en formato html
$mailer->Subject = "Subject"
$mailer->Body = "Body with HTML";
//Definimos AltBody por si el destinatario del correo no admite email con formato html
$mailer->AltBody = "Alternative Body";
//se envia el mensaje, si no ha habido problemas
//la variable $exito tendra el valor true
$exito = $mailer->Send();
//Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas como mucho
//para intentar enviar el mensaje, cada intento se hara 5 segundos despues
//del anterior, para ello se usa la funcion sleep
$intentos=1;
while ((!$exito) && ($intentos < 5)) {
sleep(4);
$exito = $mailer->Send();
$intentos++;
}
if(!$exito){
echo "Error al enviar. Intentelo de nuevo mas tarde. ".$mailer->ErrorInfo; }else{
echo "Consulta enviada correctamente.";
}
答案 2 :(得分:0)
如果您正在拨打mail
电话,那么您的所有输入都是好的。注意mail
返回一个布尔值也很有用,所以你可以这样做:
if (mail($to, $email_subject, $email_body, $headers))
{
//redirect to the 'thank you' page
header('Location: contact-form-thank-you.html');
}
else
{
$errors .= "\n" . 'Mail environment failure.';
}
如果您看到该错误,则表示在php.ini中未正确配置mail
。有关您需要在php.ini中设置的值的更多信息,请参阅此文章:http://www.techrepublic.com/article/a-tour-of-the-phpini-configuration-file-part-2/5272345
答案 3 :(得分:-1)
我认为这可能是电子邮件标题的问题。根据规范,标题和实际内容之间应该有一个新的界限。
$headers .= "Reply-To: $email_address\r\n";
这可能有所帮助。