Ciao,
Mi sono accorto che all'improvviso il mio form "Contatti" dal mio sito qui su altervista.org non invia email ad utenti che vorrebbero comunicare con me.
Infatti un mio collega mi ha fatto presente a voce la cosa, dopo che inutilmente aveva tentato di contattarmi per un progetto tramite il mio modulo sul mio sito, con un suo account su @gmail.com ed un altro che ha su @yahoo.com
Dico subito che nello spam accedendo via browser ai suoi due account NON c'era nulla!
Allora ho provato io a fingermi un utente del mio sito e ho inserito i dati provando prima anch'io con un account che ho su @gmail.com e poi con un altro che ho su @yahoo@com ma nulla: nello spam accedendo via browser nei due account NON c'era assolutamente nulla.
Siccome su una tabella del mio db registro appunto i dati di chi vuole contattarmi, vedo infatti qui sia i tentativi con il nome e email e il contenuto dei suoi messaggi (i campi che ho reso obbligatori) fatti dal mio collega, che i miei.
In passato invece tutti gli utenti e pure io stesso mi contattavano benissimo sia da @gmail.com che da @yahoo.com
Non ho cambiato nulla nello script PHP che qui sotto indico ed è in semplice text/plain.
Infatti per il servizio di newsletter mi affido invece alla API di Mailchimp che ho integrato perfettamente con il mio sito, ed invia email in HTML in modo perfetto.
Ecco una parte del codice:
Codice PHP:
<?php
// includo il file con le impostazioni per i contatti
require_once 'settings_contatti.php';
// inzio i controlli sui dati immessi dall'utente
if ( isset($_POST['submit']) )
{
foreach ($_POST as $key => $value)
{
// elimino eventuali spazi aggiuntivi con trim()
$temp = trim($value);
// se è richiesta ma vuota aggiungila all'array missing
if ( !strlen($temp) && in_array($key, $required) )
{
array_push($missing, $key);
}
// se il campo è aspettato, setta la variabile associata
else if ( in_array($key, $expected) )
{
${$key} = strip_tags($temp);
/* in questo caso creo:
$nome, $email, $provincia, $messaggio, $validate_token ed elimino con la funzione strip_tags() tutti i tag HTML e PHP immessi erroneamente dall'utente nei vari campi del form. */
}
}
/**** ESEGUO QUI LA VALIDAZIONE PER IL CAPTCHA ****/
try
{
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Eseguo la validazione
$stmt = $pdo->prepare("SELECT * FROM validation WHERE url_key = ? AND expire_date > NOW()");
$stmt->execute(array($_POST['token']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
}
catch (PDOException $e)
{
echo "Error!: " . $e->getMessage() . "<br />";
die();
}
/*** FINE VALIDAZIONE PER IL CAPTCHA ***/
/* CONTROLLI: VERIFICO 3 CONDIZIONI
PRIMA DI PROCEDERE CON INVIO EMAIl E DATI NEL DB */
/*
1) Se l'array $missing è vuoto, vuol dire che sono stati inseriti i valori
obbligatori, qui $name, $email, $messaggio, $validate_token
2) Se l'indirizzo email inserito è corretto, cosa che controllo tramite
la funzione filter_var(), con il filtro FILTER_VALIDATE_EMAIL
3) Se la stringa del captcha corrisponde a quella sul db,
SOLO se tutte queste si verificano, procedo con l'inserimento dello username nel db
*/
if ( empty($missing) && filter_var($email, FILTER_VALIDATE_EMAIL) && $row && ($row['captcha'] == $_POST['validate_token']) )
{
/* Costruisco le email da inviare, riportando tutti i vari campi;
Invio 2 email: una la devo ricevere io per rispondere all'utente, ed un'altra all'utente stesso per fargli sapere che tutto è andato ok, ed ha compilato correttamente il form. */
//variabili create nel passag. precedente
$message = "Ciao, $nome\n\n";
$message .= "Ecco il testo del messaggio che mi hai inviato:\n\n";
$message .= "Messaggio:\n $messaggio\n\n";
$message .= "Appena posso ti contatterò al tuo email qui sotto indicato:\n\n";
$message .= "$email\n\n";
try
{
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT nome_provincia FROM province WHERE id_pro = ?");
$stmt->execute(array($_POST['provincia']));
$row_provincia = $stmt->fetch(PDO::FETCH_ASSOC);
}
catch (PDOException $e)
{
echo "Error!: " . $e->getMessage() . "<br />";
die();
}
$message .= "La tua provincia è: " . ( !isset($_POST['provincia']) || !is_numeric($_POST['provincia']) ? 'nessuna provincia indicata' : $row_provincia['nome_provincia'] ) . "\n\n";
$message .= "Grazie e a presto. Ciao.";
//limita la lunghezza a 70 caratteri per la compatibilità
$message = wordwrap($message, 70);
//invio un'email all'utente per avvisarlo che mi ha inviato il messaggio
$to = $email;
//oggetto dell'email inviata
$subject = 'Invio messaggio per info/assistenza/preventivi ecc.';
// gli headers
/* ATT: per ottenere nella email che si invia all'utente le lettere accentate tipiche dell'italiano come città, iguazzù, cioè ecc. e NON delle storpiature bisogna indicare, nel modo che segue, SIA il charset=utf-8 SIA il Content-Transfer-Encoding: 7bit */
$headers = 'Content-Type: text/plain; charset=utf-8' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 7bit' . "\r\n";
$headers .= 'From: admin@yahoo.com' . "\r\n";
$headers .= 'Reply-To: noreply' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
// qui mando una copia carbone nascosta (per nascondere all'utente il // mio email) anche a me stesso, perché devo rispondergli ovviamente
$headers .= 'Bcc: mio_nome@gmail.com' . "\r\n";
//invia le 2 email
$mail_sent = mail($to, $subject, $message, $headers);
$info_message = '<p class="info">' . $info_mail_sent . '</p>';
if ( $mail_sent )
{
// Se tutto è ok l'array $missing - quello per i // campi obbligatori - non serve più quindi lo svuoto.
// ed analogamente svuoto anche l'array $expected -
// quello per i campi NON obbligatori -
unset($missing);
unset($expected);
ecc..