Проблема с контактной формой PHP - PullRequest
1 голос
/ 27 мая 2011

У меня проблема с простой контактной формой 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);
    ?>

Ответы [ 4 ]

2 голосов
/ 27 мая 2011

Проверьте базовую почтовую систему.

Если вы используете Linux-бокс, он может быть настроен только для локальной доставки, поэтому вы можете отправить электронное письмо на адрес yourusername @ yourhostname, и оно будет отображаться в /var/mail/yourusername

Кроме того, вы должны поставить exit() после вызова Header, чтобы не отправлять дополнительный HTML после перенаправления.

0 голосов
/ 28 мая 2011

Если вы делаете вызов 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.';
}

Если вы видите эту ошибку, то это означает, что mail неправильно настроен в php.ини.Для получения дополнительной информации о значениях, которые необходимо установить в php.ini, см. Эту статью: http://www.techrepublic.com/article/a-tour-of-the-phpini-configuration-file-part-2/5272345

0 голосов
/ 27 мая 2011

Для отправки писем из скрипта 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.";
}
0 голосов
/ 27 мая 2011

Я думаю, что это может быть проблема с заголовками электронной почты.Из спецификации должна быть новая строка между заголовками и фактическим содержимым.

$headers .= "Reply-To: $email_address\r\n"; Это может помочь.

...