I Socket
Nella parte quinta abbiamo visto come inviare una Mail attraverso una funzione, che a sua volta utilizzava proprio i socket.
Brevemente diremo che i socket sono una interfaccia di comunicazione UNIX per consentire la comunicazione tra processi ed applicazioni attraverso la rete, cosa che permette di colloquiare con un processo funzionante su un'altra macchina servendosi di un protocollo di rete come il TCP/IP. L'applicazione apre un "socket" (innesto) e dichiara l'indirzzo di destinazione, di seguito la rete si occupa di creare la connessione.
Infatti si può benissimo inviare una mail utilizzando direttamente i socket, infatti che cosa è una mail se non una serie di dati da inviare alla porta 25 (Simple Mail Transfer) ?
Per il resto bisogna scriverci dentro (fputs) tutto, incluso le intestazioni, rispettando lo standard per le SMTP (rfc1090, rfc974, rfc822, rfc821 scaricati dal sito AlterNIC e in allegato) ed attendere la risposta (fputs).
Ci sono una quarantina di funzioni, ma la princiaple, quella che permette di aprire la connessione, è
    int fsockopen (string [udp://]hostname, int port [, int errno [, string errstr [, float timeout]]])
Gli argomenti sono semplici da comprendere:
L'hostname (mbox.docenti.org  p.e.), la porta (25 per l'SMTP), l'errore restituito sottoforma numerica e descrittiva se la connessione non ha avuto successo, il tempo d'attesa per la chiamata al sistema. La funzione restituisce un int di valore booleano (TRUE/FALSE, nr/0), che permette di sapere se la connessione ha avuto successo.
Poi inviare le richieste al server web con
    int fputs (int fp, string str, int [length])
e attendere la risposta con
    string fgets (int fp, int length)
fp è il numero della connessione (file puntato), str la stringa che viene inviata e length la grandezza del buffer
infine si deve chiudere la connessione con
    bool fclose (int fp)
il programmino sockmail.php:
 
<?php
  // impostazione variabili
  // il mail server e il tempo d'attesa
  // a 30 secondi
  $strMailServer = "mbox.docenti.org";
  $flTempodAttesa = 30;
  $strMyTemp = "";

  // connessione
  // nome host, porta, errore numero, errore descrizione, timeout
  $intMyConn = fsockopen($strMailServer, 25, $intErr, $strErr, $flTempodAttesa);

  // verifica connessione TRUE/FALSE
  if ($intMyConn)
  {
   // connessione avvenuta
   fputs ($intMyConn, "HELO host\n");
   fgets ($intMyConn, 128); // colloca risposta nel buffer

   fputs ($intMyConn, "MAIL FROM: <info@docenti.org>\n");
   fgets ($intMyConn, 128); // colloca risposta nel buffer

   fputs ($intMyConn, "RCPT TO: <fm@docenti.org>\n");
   fgets ($intMyConn, 128); // colloca risposta nel buffer

   fputs ($intMyConn, "DATA\n");
   $strMyTemp = fgets ($intMyConn, 128); // colloca risposta nel buffer

   fputs ($intMyConn, "Subject: socket mail!\n");
   fputs ($intMyConn, "inviata dal web.\n");
   fputs ($intMyConn, "\n");
   fputs ($intMyConn, "Bye\n");
   fputs ($intMyConn, ".\n");

   fputs ($intMyConn, "QUIT\n"); // termine connesisone

   fclose ($intMyConn);
  }
  else
  {
     // errore
     echo "Connessione al server $strMailServer fallita <br>\n";
     echo "Errore nr $intErr - descr. $strErr <br>\n";
  }
?>

Rispetto ad ASP è una operazione visibilente più complessa, dato che PHP utilizza i socket e per forza di cose bisogna scrivere, dopo aver aperto la connessione, tutti i valori da inviare. In ASP è un oggetto CDONTS, preconfezionato ed estremamente semplice.
Chi naturamente volesse utilizzare oggeti preconfezionati in PHP può far uso di PHPNuke (http://www.phpnuke.org/), che offre svariate soluzioni per il WEB programmabili con pochissime istruzioni: forum, chat, mail, impaginatori, carreli spese, ecc
Indubbiamente PHp offre soluzioni molto potenti, ma scarseggia fortemente, di oggetti che devono essere costruiti a mano.
Altresì si possono richiedere anche infomazioni sul proprio server, utilizzando tutte le porte disponibili (svrinfo.php):
 
<?php
  $strHostName = "localhost";
  function GetMyWebServices($strHostName, $strService, $intPort)
  {
    $intMyConn = fsockopen($strHostName, $intPort);
    if ($intMyConn)
     {echo "Servizio: <i>$strService su porta $intPort</i> <b>attivo</b><br>\n";
       fclose ($intMyConn);
     }
    else
     {echo "Servizio: <i>$strService su porta $intPort</i> non attivo<br>\n"; }

   }

  echo "Host Name: <i>$strHostName</i><br>\n";
    $strMyConn = GetMyWebServices($strHostName, "http", 80);
    $strMyConn = GetMyWebServices($strHostName, "ftp", 21);
    $strMyConn = GetMyWebServices($strHostName, "smtp", 25);
    $strMyConn = GetMyWebServices($strHostName, "pop3", 110);
    $strMyConn = GetMyWebServices($strHostName, "ssh", 22);
    $strMyConn = GetMyWebServices($strHostName, "mysql", 3306);
    $strMyConn = GetMyWebServices($strHostName, "news", 119);
?>

L'esempio si commenta da sè, come anche il risultato del mio server

Finestra risultato

Termina la parte generale, dove sono stati affrontati tutti gli argomenti più importanti utili per poter affrontare circa il 90% di soluzioni per il web. Seguiranno poco alla volta quelli particolari e più approfonditi.
Buon lavoro !

Scarica gli esempi allegati

Attenzione: gli esempi qui mostrati funzionano con copia e incolla a patto che vengano tolti tutti i caratteri superflui (colore, spaziatura, ...) utili per una migliore visualizzazione sui browser, ma fastidiosi per il parser PHP!

Pagina precedente - Pagina successiva