



29 Dicembre 2007
E dopo un pò di giorni per smaltire i bagordi natalizi e l'influenza torno a scrivere sul mio sito.
L'ultima scoperta è quella riguardante l'invio, tramite SMTP, di una E-Mail dal vostro sito.
Mi ricorda molto quando, in Inghilterra, non potevo usare la mailbox in maniera canonica. Quindi mi sono dovuto adattare all'utilizzo del Telnet. È stata quindi una "riscoperta" piacevole!
Veniamo al dunque.
Supponiamo di avere il nostro bel form HTML impostato in questo modo:
<form method="post" action="invia.php">
Nome: <input type="text" name="nome" size="30" /><br />
Cognome: <input type="text" name="cognome" size="30" /><br />
E-Mail: <input type="text" name="email" size="30" /><br />
Messaggio: <textarea rows="10" cols="40" name="messaggio"></textarea><br />
<input type="submit" value="Invia" /><input type="reset" value="Cancella" /><br />
</form>
Ok, fin qui niente di nuovo, un normalissimo form. Il bello viene ora!!! Creiamo la pagina invia.php che ci servirà per elaborare e spedire il tutto via SMTP.
Cominciamo col creare le variabili che conterranno i dati da inviare nella mail:
$nome = $_POST['nome']; # Recupero il campo Nome
$cognome = $_POST['cognome']; # Recupero il campo Cognome
$email = $_POST['email']; # Recupero il campo E-Mail
$to = "indirizzo@mittente.com"; #Imposto il l'indirizzo a cui inviare la mail
$subject = "E-Mail dal sito da parte di $nome $cognome"; # Imposto l'oggetto della mail
$body = nl2br($_POST['messaggio']); # Recupero il campo Messaggio
Impostiamo dunque i parametri di connessione al nostro server SMTP:
$smtp_server = "smtp.host.com"; # Il server SMTP a cui vogliamo collegarci
$port = "25"; # Porta del server...generalmente è la 25
$timeout = "30"; # Tempo di attesa per la risposta del server
$username = "vostrausername"; # La vostra username
$password = "vostrapassword"; # La vostra password
$localhost = "localhost"; # Indirizzo dell'host ospitante
$newLine = "\r\n"; # Servirà per andare a capo nei comandi Telnet
Connettiamoci dunque al server SMTP:
$smtpConnect = fsockopen($smtp_server, $port, $errno, $errstr, $timeout);
$smtpResponse = fgets($smtpConnect, 515);
if(empty($smtpConnect))
{
$output = "Failed to connect: $smtpResponse";
return $output;
}
else
{
$logArray['connection'] = "Connected: $smtpResponse";
}
Se la connessione è andata a buon fine ci possiamo autenticare:
#Diciamo al server che vogliamo autenticarci
fputs($smtpConnect,"AUTH LOGIN" . $newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['authrequest'] = "$smtpResponse";
# Invio username
fputs($smtpConnect, base64_encode($username) . $newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['authusername'] = "$smtpResponse";
# Invio password
fputs($smtpConnect, base64_encode($password) . $newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['authpassword'] = "$smtpResponse";
Fatto questo "salutiamo" il server:
fputs($smtpConnect, "HELO $localhost" .
$newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['heloresponse'] = "$smtpResponse";
Ora possiamo inviare l'email vera e propria:
# Indico il mittente
fputs($smtpConnect, "MAIL FROM: $email" . $newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['mailfromresponse'] = "$smtpResponse";
# Indico il destinatario
fputs($smtpConnect, "RCPT TO: $to" . $newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['mailtoresponse'] = "$smtpResponse";
# Indico che ora voglio scrivere l'e-mail
fputs($smtpConnect, "DATA" . $newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['data1response'] = "$smtpResponse";
# Costruisco l'Headers
$headers = "MIME-Version: 1.0" . $newLine;
$headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;
$headers .= "To: $to <$to>" . $newLine;
$headers .= "From: $nome $cognome <$email>" . $newLine;
# Invio l'e-mail
fputs($smtpConnect, "To: $to\nFrom: $email\nSubject: $subject\n$headers\n\n$body\n.\n");
$smtpResponse = fgets($smtpConnect, 515);
$logArray['data2response'] = "$smtpResponse";
E infine chiudiamo la connesisone col server SMTP:
fputs($smtpConnect,"QUIT" . $newLine);
$smtpResponse = fgets($smtpConnect, 515);
$logArray['quitresponse'] = "$smtpResponse";
Divertente no? Doveste avere problemi col codice non esitate a chiedere.
| #1 inviato da: paolo il 8/6/2010 alle ore 18:45 |
forse un "sleep(1)" deve essere dopo ogni fputs
o l'email non si invia |
| #2 inviato da: Vito D'Alessandro il 12/6/2010 alle ore 13:30 |
Devo controllare, probabilmente con più di un destinatario si verifica questo problema. Grazie per la segnalazione! |
| #3 inviato da: Manuel il 25/6/2010 alle ore 10:36 |
ciao mi da questi errori Warning: fsockopen(): phpnetworkgetaddresses: gethostbyname failed in c:programmieasyphp1-8wwwjsinvia.php on line 18 Warning: fsockopen(): unable to connect to mail.mskhom.it:25 in c:programmieasyphp1-8wwwjsinvia.php on line 18 Warning: fgets(): supplied argument is not a valid stream resource in c:programmieasyphp1-8wwwjsinvia.php on line 19 cosa posso fare? |
| #4 inviato da: Vito D'Alessandro il 25/6/2010 alle ore 11:22 |
Direi che come prima cosa devi ricontrollare l'indirizzo del server: mail.mskhom.it sembra essere sconosciuto. Ho provato a collegarmi a qualcosa di più simile: mail.mskhome.it. Forse è a questo che ti riferivi e funziona. Le uniche cose che non ho inserito sono username e password e ricevo ovviamente un errore di autenticazione. Se non hai ancora risolto ricontattami, anche via mail, e vediamo di dargli una controllata. |