2013-09-25 8 views
6

Ho acquistato un modello di sito Web semplice con un modulo di contatto php. Tutto funziona alla grande con l'unica piccola eccezione di ricevere effettivamente i messaggi inviati tramite il modulo. Cioè, il modulo di contatto mostrerebbe un messaggio di successo, ma il messaggio non arriverà mai.indirizzo di risposta nel modulo di contatto php

Dopo un lungo back and forth con il mio servizio di hosting, ho scoperto che per evitare spoofing non consentono l'invio di e-mail dove l'indirizzo FROM non ospita. Cioè, se un visitatore del sito scrive la sua gmail/yahoo ecc. Nel modulo, non lo capisco.

Hanno suggerito di utilizzare l'indirizzo di posta elettronica ospitato con loro come indirizzo DA e di ricevere l'email di input del visitatore come indirizzo REPLY-TO. Questo sembra ragionevole.

Così ho scavato in giro (per esempio qui: PHP reply-to error - comes with admin email not sender of contact form e php Contact Form on website and reply-to email)

e le risposte suggeriscono qualcosa l'aggiunta di un componente di intestazioni:

$headers = 'From: [email protected]' . "\r\n" . 
    'Reply-To: [email protected]' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 

e anche aggiungere alla

mail($to, $subject, $message, $headers); 

quindi è quello che ho fatto. $ email è definita in questo modello come quello che e-mail del visitatore, così quello che ho fatto è stato:

$subject = "Contact Form: $name"; 
$message = "$message"; 
$headers = 'From: [email protected]_domain.com' . "\r\n" . 
    'Reply-To: $email' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 

mail($to, $subject, $message, $headers); 

Questo è tutto bello e dandy, ma ancora non funziona bene. Messaggi di posta elettronica Do passare attraverso la società, ma i dettagli sono:

from: [email protected]_domain.com via servername.hosting_company.com 
**reply-to: [email protected]_company.com** 
to: [email protected]_domain.com 

così, la risposta al indirizzo non è ancora quello che il visitatore a sinistra.

Potete aiutarmi con questo? Non so cos'altro posso fare.

Grazie mille!


se qualcuno è interessato, ecco il file php completo:

<?php 

// Clean up the input values 
foreach($_POST as $key => $value) { 
    if(ini_get('magic_quotes_gpc')) 
     $_POST[$key] = stripslashes($_POST[$key]); 

    $_POST[$key] = htmlspecialchars(strip_tags($_POST[$key])); 
} 

// Assign the input values to variables for easy reference 
$name = $_POST["name"]; 
$email = $_POST["email"]; 
$message = $_POST["message"]; 

// Test input values for errors 
$errors = array(); 
if(strlen($name) < 2) { 
    if(!$name) { 
     $errors[] = "You must enter a name."; 
    } else { 
     $errors[] = "Name must be at least 2 characters."; 
    } 
} 
if(!$email) { 
    $errors[] = "You must enter an email."; 
} else if(!validEmail($email)) { 
    $errors[] = "You must enter a valid email."; 
} 
if(strlen($message) < 10) { 
    if(!$message) { 
     $errors[] = "You must enter a message."; 
    } else { 
     $errors[] = "Message must be at least 10 characters."; 
    } 
} 

if($errors) { 
    // Output errors and die with a failure message 
    $errortext = ""; 
    foreach($errors as $error) { 
     $errortext .= "<li>".$error."</li>"; 
    } 
    die("<span class='failure'><h3>Sorry, The following errors occured:</h3><ol>". $errortext ."</ol><a href='contact.html' class='more'>Refresh Form</a></span>"); 
} 


// --------------------------------------// 
// Send the email // INSERT YOUR EMAIL HERE 
$to = "[email protected]_domain.com"; 
// --------------------------------------// 


$subject = "Contact Form: $name"; 
$message = "$message"; 
$headers = 'From: [email protected]_domain.com' . "\r\n" . 
    'Reply-To: $email' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 


mail($to, $subject, $message, $headers); 

// Die with a success message 
die("<span class='success'><h3>Successfully Sent!</h3> Your message is on its way, we will respond to you shortly.</span>"); 

// A function that checks to see if 
// an email is valid 
function validEmail($email) 
{ 
    $isValid = true; 
    $atIndex = strrpos($email, "@"); 
    if (is_bool($atIndex) && !$atIndex) 
    { 
     $isValid = false; 
    } 
    else 
    { 
     $domain = substr($email, $atIndex+1); 
     $local = substr($email, 0, $atIndex); 
     $localLen = strlen($local); 
     $domainLen = strlen($domain); 
     if ($localLen < 1 || $localLen > 64) 
     { 
     // local part length exceeded 
     $isValid = false; 
     } 
     else if ($domainLen < 1 || $domainLen > 255) 
     { 
     // domain part length exceeded 
     $isValid = false; 
     } 
     else if ($local[0] == '.' || $local[$localLen-1] == '.') 
     { 
     // local part starts or ends with '.' 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $local)) 
     { 
     // local part has two consecutive dots 
     $isValid = false; 
     } 
     else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) 
     { 
     // character not valid in domain part 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $domain)) 
     { 
     // domain part has two consecutive dots 
     $isValid = false; 
     } 
     else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', 
       str_replace("\\\\","",$local))) 
     { 
     // character not valid in local part unless 
     // local part is quoted 
     if (!preg_match('/^"(\\\\"|[^"])+"$/', 
      str_replace("\\\\","",$local))) 
     { 
      $isValid = false; 
     } 
     } 
     if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) 
     { 
     // domain not found in DNS 
     $isValid = false; 
     } 
    } 
    return $isValid; 
} 

?> 
+3

È necessario utilizzare le virgolette doppie attorno alla stringa $ headers quando lo si crea: le virgolette singole trattano la stringa come letterale, quindi le variabili non vengono interpolate. – andrewsi

+0

Grazie mille mcuh @andrewsi! :) – MajorKooter

risposta

9

Prova a cambiare questa parte del codice:

$subject = "Contact Form: $name"; 
$message = "$message"; 
$headers = 'From: [email protected]_domain.com' . "\r\n" . 
    'Reply-To: $email' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 

A tal:

$subject = "Contact Form: $name"; 
$message = "$message"; 
$headers = 'From: [email protected]_domain.com' . "\r\n" . 
    'Reply-To: ' . $email . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 

Prendi in pratica lo $ email dall'interno dell'offerta singola e aggiungerlo a quella stringa

+0

grazie a tutti e due. questo sembra funzionare. non ho il karma da condividere ... mi dispiace – MajorKooter

+0

@MajorKooter - se questo ha funzionato, allora puoi contrassegnare questa risposta come accettata. – andrewsi

+1

@andrewsi grazie, anche se ti meriti il ​​merito dato che questo è quello che ho usato. grazie per il tuo commento. – MajorKooter