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.

#5 inviato da: manu il 17/10/2010 alle ore 17:33
ciao, potresti dirmi che indirizzo bisogna scrivere nel parametro localhost? il mio sito è www.aloetours.com, hosting è da www.limedoains.com, smtp è mail.limedomains.net

#6 inviato da: Vito D'Alessandro il 18/10/2010 alle ore 8:40
normalmente può essere lasciato localhost. in caso contrario bisogna chiedere informazioni al proprio hosting.

#7 inviato da: mirko il 15/3/2011 alle ore 17:50
Ciao, ho provato ma mi da questo errore Parse error: syntax error, unexpected $end in C:ProgrammiEasyPHP-5.3.3wwwinvia.php on line 93 è strano perchè sarebbe localizzato in questa riga di codice fputs($smtpConnect,"QUIT" . $newLine); così ho provato anche a togliere l'ultima parte,quella di chiusura della connessione ma continua a darmi lo stesso errore,solo che ora nn c'è nulla sulla riga 93...mah! Sto cercando di utilizzare questo tuo metodo per inviare mail da locale,spero si possa fare,sai sono nuovo del settore. grazie

#8 inviato da: mirko il 15/3/2011 alle ore 17:56
Scusami,ho commesso un errore,prima di togliere l'ultima parte l'errore che mi dava era questo Parse error: syntax error, unexpected TSTRING in C:ProgrammiEasyPHP-5.3.3wwwinvia.php on line 93 me ne sono reso conto ora che ho reinserito la parte di codice ed ho riprovato...

#9 inviato da: renato il 21/11/2011 alle ore 10:6
Premesso che sono un autodidatta, ho anch'io un problema simile. Mi puoi dedicare qualche minuto? 1-Ho realizzato uno script simile al tuo 2-in locale tunziona tranquillamente 3-dal sito ha funzionato tranquillamente per alcuni mesi 4-improvvisamente non funziona più alla richiesta $smtpConnect = fsockopen($smtpserver, $port, $errno, $errstr, $timeout); risponde Failed to connect puoi dirmi perché e cosa posso fare?


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
LAU080

LAU080
Realizzato per conto dell'agenzia imature di Bari. Impaginazione e gestione progetti in PHP+MySQL. Uso di plugin jQuery quali Cufòn style, Shadowbox.
Dal Guestbook
03/04/2009 - Carlo Maione

Complimenti sinceri per il tuo nuovo sito e in bocca al lupo per la tua carriera!!!! Carlo Maione

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