Pagina 1 di 3

Funzione (mail) PHP5

Inviato: mer gen 09, 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 gen 09, 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 gen 09, 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 gen 09, 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 gen 09, 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 &#232; 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 &#232; stato inviato</h3>
<h3>L'indirizzo e-mail indicato non &#232; 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 &#232; stato inviato correttamente</h3>
<h3>Risponderemo il pi&#249; 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 gen 09, 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 gen 09, 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 gen 09, 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 gen 09, 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 gen 09, 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 gen 10, 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 gen 10, 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 gen 10, 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="&nbsp;";
   //$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 gen 10, 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

Codice: Seleziona tutto

mail($to, $oggetto, $messaggio, $header);


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 gen 10, 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.....