Vito D'Alessandro

Web Designer Bari, Programmatore PHP MySQL Bari, Web Developer Bari

Home PageContattiSitemapArea Riservata

Vito D'Alessandro si occupa di sviluppo siti
internet professionali ed è programmatore php.
Progetta e realizza siti web in Bari e provincia.
Random Photo
> Home > Blog > Programmazione > Invio E-Mail in PHP tramite SMTP

29 Dicembre 2007

Invio E-Mail in PHP tramite SMTP

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.



Postato da Vito D'Alessandro alle 15.11 in Programmazione


Commenti

#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.


Lascia anche tu il tuo commento!

Nome*:
Home Page:
E-Mail*: (resterà segreta)
Commento*:

Codice di sicurezza*:
  
*: i campi contrassegnati con l'asterisco sono obbligatori
Ricerca Articoli


Categorie
Archivio
Espandi Tutti | Contrai Tutti
Ultimo Progetto
Pizzeria da Gianni

Pizzeria da Gianni
Realizzazione completa poggiandosi su Wordpress, modifica di alcuni plugin utilizzati, modifica codice jQuery.
Dal Guestbook
16/06/2009 - Eugenio

tutto ben fatto .. e Vito lo sa .. ;-) quando vuoi una bella implementazione in Flash, fatti sentire :-P

Vuoi lasciare anche tu un messaggio o vedere gli altri commenti?