Leggere la posta su POP3 con ASP.NET

di Maurizio Alberti, in ASP.NET,

Non vi piacerebbe poter sapere se avete ricevuto della posta senza dover usare un client di posta come Outlook Express e senza dovervi collegare al sito che vi fornisce l'accesso per la vostra Web Mail, spesso pieno zeppo di pubblicità e di immagini che rallentano il collegamento?

Con ASP.NET questo è possibile in una manciata di righe di codice.

Leggendo un articolo interessante su ASPAlliance.com mi è venuta voglia di crearmi una semplice WebMail che mi permettesse di poter sapere quanti messaggi ho su una mia casella di posta elettronica e quanto spazio occupano, mi sono quindi andato a prendere l'RFC 1939 che illustra nei dettagli il Post Office Protocol (POP3) e ho iniziato...

Quello che mi serviva era una client TCP che mi permettesse di inviare comandi al server di posta e recuperarne le risposte, la classe System.Net.Sockets fa' al caso nostro, in quanto fornisce gli oggetti e i metodi per costruire connessioni di rete ad hoc, dichiariamo quindi gli spazi dei nomi appropriati:

<%@ import Namespace="System.Net" %>
<%@ import Namespace="System.Net.Sockets" %>

L'interfaccia grafica

Per quel che riguarda l'interfaccia ci servono due textbox normali (per server e utente), se usate WebMatrix o Visual Studio potete trascinarle dalla barra degli strumenti nella finestra di Design e impostare gli attributi, altrimenti basterà ricopiare il codice qui sotto:

<form id="calc" method="post" runat="server">
Server di posta (POP3): 
<asp:TextBox id="host" runat="server" Width="200px"></asp:TextBox>

Utente per collegamento: 
<asp:TextBox id="utente" runat="server" Width="200px"></asp:TextBox>

Password della casella: 
<asp:TextBox id="pwd" runat="server" Width="200px" TextMode="Password" />

<asp:Button id="Button1" runat="server" Text="Controlla Casella"></asp:Button>

Una per la password della casella avrà ovviamente la proprietà TextMode="PassWord" per mascherarne il contenuto dagli sguardi indiscreti. Facciamo però attenzione: questo non è un metodo ad alta sicurezza, se volessimo proteggere le nostre password dagli "sniffer" dobbiamo abbandonare il protocollo HTTP e affidarci a connessioni sicure (HTTPS).

Inseriamo quindi un pulsante per l'invio dei dati. Non è inserito nessun attributo

onclick=&quot;funzione&quot;
, in quanto il click del pulsante fa scattare comunque il caricamento della pagina tramite la procedura chiamata PostBack, quindi basterà inserire la funzione nell'evento Page_load, controllando se si stratta del primo caricamento o di quello avvenuto in seguito alla pressione del pulsante.

Sub Page_load()
  if ispostback() then
   lblMessaggi.Text = ""
   ReadMail(host.text, utente.text, pwd.text)
  end if
End Sub<

Collegarsi al mail server

La funzione ReadMail si occupa di effettuare tutto il lavoro, prendendo come parametri l'indirizzo del server di posta, il nome dell'account e la password:

Una label è utile per mostrare i risultati del nostro esempio e sicuramente è più efficiente del vecchio Response.Write , fornendoci il pieno controllo della posizione delle scritte:

<asp:Label id="lblMessaggi" runat="server"></asp:Label>

Adesso inizia il bello: per accedere ai servizi che ci fornisce il server di posta dobbiamo prima aprire un canale di comunicazione con il Server stesso, poi collegarci tramite utente e password, inviare i comandi, leggere le risposte, ed infine scollegarci.

Procediamo per passi. Per collegarsi al server di posta, dobbiamo creare un "canale" sul quale poi la nostra pagina ASP.NET e il server possano comunicare; questo canale è ovviamente una collegamento TCP sulla porta 110, la porta standard sulla quel i server di posta stanno "in ascolto".

Se ne occupa la funzione

ReadMail
del nostro esempio.

La variabile NetStream ci permette di recuperare le risposte sul collegamento TCP, MyResponse contiene i risultati dell'invio dei comandi al server:

Dim NetStream as NetworkStream, MyResponse as string

Prima di tutto apriamo una connessione con il server di posta sulla porta 110 (quella di default, altrimenti si può cambiare di conseguenza) ed in caso di errore sul collegamento TCP al server viene restituito un messaggio:

 try
  TcpC.Connect(host,110)
catch MyEx as Exception
  lblMessaggi.Text += "Errore nella connessione all'host: " & host & " (porta 110)
" & _
   "L'errore riportato è: " & MyEx.message & "
Controlla e riprova
"
end try
3 pagine in totale: 1 2 3

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti