Pagina 1 di 3
Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 21:22
da samiel
I raffinati potrebbero obiettare che PHP non è propriamente un linguaggio
di programmazione, ma credo comunque che questo sia il forum più adatto,
visto che adesso ce l'abbiamo... Ma veniamo al dunque. Ho caricato
un piccolo sito su Netsons è vi ho inserito una pagina con un form php
per inviare e-mail. E fin qui nulla di strano. Però, cosa che mi risulta
incomprensibile: se attraverso questo form invio mail dove il mittente
dichiara come suo un indirizzo e-mail appartenente a certo domini
(tele2, netsons) oppure se ne inventa uno falso, allora le mail arrivano.
Se invece l'indirizzo inserito è di gmail o di virgilio, allora non arriva
nulla. Di che si tratta secondo voi? Liste bianche e liste nere?
Grazie
M.
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 21:38
da conraid
Anche se andrebbe visto il form, solitamente non si guarda il mittente, ma l'IP. Altrimenti addio. Quindi
Magari è la stessa netsons ad avere qualche blocco, ma mi sembra strano.
A quale indirizzo dovrebbero arrivare?
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 21:47
da aschenaz
Succede anche a me: da alcuni hosting le mail su gmail arrivano regolarmente, da altri no...
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 21:54
da conraid
ninobi ha scritto:Succede anche a me: da alcuni hosting le mail su gmail arrivano regolarmente, da altri no...
Lui parlava di mittente non di destinatario.
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 22:14
da samiel
Il codice è questo:
Codice: Seleziona tutto
<?php
if(isset($_POST['name']) && isset($_POST['email']) && isset($_POST['subject']) && isset($_POST['messaggio'])){
// indirizzo e-mail destinatario
$receiverMail = "teatroinfolle@netsons.org";
// pulizia dei dati inseriti
$name = ltrim(rtrim(strip_tags(stripslashes($_POST['name']))));
$email = ltrim(rtrim(strip_tags(stripslashes($_POST['email']))));
$subject = ltrim(rtrim(strip_tags(stripslashes($_POST['subject']))));
$messaggio = ltrim(rtrim(strip_tags($_POST['messaggio'])));
// lettura dell'indirizzo IP
$ip = getenv("REMOTE_ADDR");
// formattazione del messaggio ( \n per le messe a capo )
$msgformat = "Messaggio da: $name ($ip)\nEmail: $email\n\n$messaggio";
// verifica campi obbligatori
if(empty($name) || empty($email) || empty($subject) || empty($messaggio)) {
echo "<br /><br /><h3>Il messaggio non è stato inviato</h3>
<h3>Sei pregato di compilare tutti i campi</h3><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /><br />"; }
//verifica l'indirizzo mail
elseif(!ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
echo "<br /><br /><h3>Il messaggio non è stato inviato</h3>
<h3>L'indirizzo e-mail indicato non è valido</h3><br /> <br /> <br /> <br /> <br /> <br /> <br /><br /> <br />"; }
else{
//invio del messaggio
mail($receiverMail, $subject, $msgformat, "From: $name <$email>");echo "<br /><br /><h3>Il messaggio è stato inviato correttamente</h3>
<h3>Risponderemo il più presto possibile</h3>
<h3>Grazie di averci scritto!</h3><br /> <br /> <br /> <br /> <br /> <br /> <br />"
;
}
}
else{
//metti il form
$self=$_SERVER['PHP_SELF'];
echo <<<FRM
<h3>Puoi inviare una comunicazione <br /> a <span class="white">TEATRO IN F<span class="emph">O</span>LLE</span> <br /> direttamente da questo form</h3>
<h3>Riempi i campi richiesti <br /> e premi il pulsante "Invia"</h3>
<br /><br />
<form action="$self" method="post">
Nome:<br /><br />
<input name="name" size="50" maxlength="40" />
<br /><br /><br />
Indirizzo e-mail:<br /><br />
<input name="email" size="50" maxlength="40" />
<br /><br /><br />
Oggetto:<br /><br />
<input name="subject" size="50" maxlength="40" />
<br /><br /><br />
Messaggio:<br /><br />
<textarea name="messaggio" cols="50" rows="8"></textarea>
<br /><br /><br />
<input type="submit" value="Invia" />
<input type="reset" value="Cancella" />
</form>
FRM;
}
?>
Ho scritto all'assistenza Netsons, vediamo se ne sanno qualcosa...
L'indirizzo è quello di Netsons. Adesso provo a cambiarlo con uno
dei miei account, vediamo se funge...
M.
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 22:23
da conraid
A parte che è bruttino, l'ho provato e funziona con mittente gmail su altro server
Nel senso che mi arriva una mail
tu devi capire se parte. Scrivi in qualche log.
Se parte, se cioè la funzione mail fa il suo lavoro, a quel punto è il server di netsons che blocca per chissà quale motivo.
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 22:54
da samiel
A parte che è bruttino
Si accettano consigli... Considera che sto muovendo
i miei primissimi passi in php. Hai migliori da propormi?
Ho fatto un esperimento, sostituendo $receiverMail
con un altro account, e le mail arrivano tutte.
Dunque il form spedisce regolarmente e, a quanto
pare, le mail vengono in effetti inoltrate.
Sembra che il blocco sia a livello ricezione... boh...
Grazie
M.
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 22:59
da conraid
samiel ha scritto:A parte che è bruttino
Si accettano consigli... Considera che sto muovendo
i miei primissimi passi in php. Hai migliori da propormi?
Domani te ne mando uno che uso io. Premetto che non è OOP, nuitari se legge si arrabbierà
Per l'altro discorso problema di loro allora.
Ma bloccare per dominio è una scelta orribile
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 23:04
da nuitari
AHHHHHH NON E' OOOOOOOOPPPPPPPPPPPP!!!!!!!!! E' IL MAAAAAAAALEEEEEEEEEEEEEEE .
scherzo, mica sono così fanatico dell'oop =) se no non programmerei in C .
Comunque, ti consiglio di usare e scaricare phpmailer. E' una classe per l'invio delle mail che supporta pienamente il formato mime/multipart e permette anche di usare l'autenticazione SMTP. Ho scritto anche un mod per incorporare le immagini, se la usi te lo passo.
Re: Funzione (mail) PHP5
Inviato: mer 9 gen 2008, 23:07
da conraid
nuitari ha scritto:AHHHHHH NON E' OOOOOOOOPPPPPPPPPPPP!!!!!!!!! E' IL MAAAAAAAALEEEEEEEEEEEEEEE .
scherzo, mica sono così fanatico dell'oop =) se no non programmerei in C .
in Object-C
nuitari ha scritto:
Comunque, ti consiglio di usare e scaricare phpmailer. E' una classe per l'invio delle mail che supporta pienamente il formato mime/multipart e permette anche di usare l'autenticazione SMTP. Ho scritto anche un mod per incorporare le immagini, se la usi te lo passo.
A volte mi serve una cosa più semplice.
comunque samiel potrebbe risolvere con l'smtp esterno in effetti, sempre che netsons gli permetta di farlo
no, correggo cavolata, perché è in ricezione ha detto.
@samiel
MA se ti mandi le mail da un client di posta con mittente gmail ti arrivano a quell'indirizzo?
Re: Funzione (mail) PHP5
Inviato: gio 10 gen 2008, 0:04
da samiel
Domani te ne mando uno che uso io
Ok, vedi tu se mandarmelo con un PM
o se ti serva le mia e-mail. Grazie!
Per l'altro discorso problema di loro allora.
Ma bloccare per dominio è una scelta orribile
Ho il sospetto che sia così. Ho mandato a quell'indirizzo
una email da gmail lasciando stare il form e non è arrivata.
Adesso scrivo all'assistenza. Però mi pare una follia!
M.
Re: Funzione (mail) PHP5
Inviato: gio 10 gen 2008, 0:10
da samiel
No, che idiota... Avevo scritto netsons.com...
Dal web le mail di gmail arrivano alla casella di netsons.
Ma dal form no... Mistero!!!!!
M.
Re: Funzione (mail) PHP5
Inviato: gio 10 gen 2008, 8:31
da aschenaz
Prima avevo letto in fretta (chiedo venia).
Il tuo problema io l'ho risolto inserendo un mittente fisso e aggiungendo l'e-mail del contatto in "reply-to".
Questo è lo script che ho fatto io - ho modificato parecchie cose (non escludo qualche errore, perciò), perché l'originale richiama dei metodi della classe che uso io - ho tolto anche qualche parte di cui parlerò dopo:
Codice: Seleziona tutto
// modifica queste variabili
$to="destinatario-email";
$mitt="mittente"; // inserisci un'email fissa: es. admin@dominio
$site="nomesito";
$paginaform="indirizzopaginadelform";
$nm=trim($_POST["nome"]);
$cg=trim($_POST["cognome"]);
$em=trim($_POST["email"]);
isset($_POST["telefono"]) ? $tl=trim($_POST["telefono"]) : $tl=0;
$tx=trim($_POST["testo"]);
if($nm=="" | $em=="" | $cg=="" | $tx=="") {
$paginaform.="&messaggio=campo-richiesto";
// devi impostare la visualizzazione del messaggio nel form
// naturalmente io ho messo & perché suppongo ci sia già un ? nella querystring
// altrimenti sostituisci (qui e sotto) & con ?
header("Location: $paginaform");
exit();
} elseif(!eregi("^[a-z0-9][_\.a-z0-9-]+@([a-z0-9][0-9a-z-]+\.)+([a-z]{2,4})",$em)) {
$paginaform.="&messaggio=email-non-valida";
header("Location: $paginaform");
exit();
} else {
// poi spiego perché uso mysql...
$qry=sprintf("INSERT INTO contatti VALUES('','%s','%s','%s','%s','%s')",addslashes($nm),addslashes($cg),$em,$tl,addslashes($tx));
$res=mysql_query($qry) or die("inserimento fallito");
$id=mysql_insert_id();
$mrq="SELECT * FROM contatti WHERE ID='$id'";
$mrr=mysql_query($mrq);
$mrw=mysql_fetch_object($mrr);
$sub="Contatti sito $site";
$mnm=stripslashes($mrw->Nome);
$mcg=stripslashes($mrw->Cognome);
$mrw->Testo!="" ? $mtx=wordwrap(stripslashes($mrw->Testo),70) : $mtx=" ";
//$headers = 'MIME-Version: 1.0' . "\r\n";
//$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers = 'From: $mitt\r\n";
$headers .= 'Reply-To: '.$mrw->Email. "\r\n";
$message=<<<EOM
Hai ricevuto un contatto dal sito $site
-------------------------------------------------------------------
Da:\t$mnm $mcg
E-mail:\t$mrw->Email
Telefono:\t$mrw->Telefono
-------------------------------------------------------------------
Contenuto del messaggio:
-------------------------------------------------------------------
$mtx
EOM;
if(mail($to,$sub,$message,$headers)) {
$paginaform.="&messaggio=messaggio-inviato";
header("Location: $paginaform");
exit();
} else {
$paginaform.="&messaggio=invio-fallito";
header("Location: $paginaform");
exit();
}
Non sarà il massimo, ma funziona abbastanza bene.
Avevo fatto una versione che creava un messaggio in html, ma non sempre veniva visualizzato correttamente ed ho preferito rinunciarci.
Io utilizzo da un po' anche un sistema di anti-spam testuale accessibile che fa capo a delle domande-risposte in una tabella mysql. Preferisco non usare il
captcha (che personalmente odio). In ogni caso, qualcosa bisogna fare, altrimenti si viene sommersi dallo spam.
Uso mysql perché voglio lasciare traccia dei contatti e anche perché, così, ho risolto definitivamente il noioso problema delle vocali accentate (coi soliti sistemi avevo esiti diversi in base alle diverse versioni di php).
Rimane, comunque, il problema che segnalavo prima: se inserisco come destinatario un indirizzo gmail, con alcuni hosting funziona, con altri no.
Re: Funzione (mail) PHP5
Inviato: gio 10 gen 2008, 12:28
da conraid
ninobi ha scritto:
Rimane, comunque, il problema che segnalavo prima: se inserisco come destinatario un indirizzo gmail, con alcuni hosting funziona, con altri no.
Ed il problema è relativo solo ai form php da quel che mi dite. Strano.
Per le lettere accentate devi dire cosa usi nell'intestazione della mail, che naturalmente deve essere lo stesso che hai nella pagine html. Tanto in php non elabori la cosa.
Io ho fatto form anche per siti in giapponese usando l'utf-8
Metti sia l'header http sia il content-type nella pagina html in utf-8, e poi nella mail ci aggiungi qualcosa tipo
Codice: Seleziona tutto
$header .= "Content-type: text/plain; charset=UTF-8\n";
e poi mandi con
arrivano in giapponese senza fare nient'altro.
Fai finta di essere un client mail, devi settare anche il content-type altrimenti prende quello di default che spesso è ASCII
@samiel
Se quello mandato da ninobi ti funziona non ti mando il mio, fammi sapere
alla fine fanno tutti la stessa cosa più o meno, ed io non ho soluzioni per netsons
Re: Funzione (mail) PHP5
Inviato: gio 10 gen 2008, 16:59
da nuitari
Vedi perchè è utile usare una classe all-purpose? Se hai delle librerie (che siano classi o meno) programmate come si deve, non ha scopo riscrivere ed inventare ogni volta l'acqua calda.. è già tutto li dentro. E non è che usi chissà quali risorse immani.....