Scaricare posta tramite vb.net

venerdì 13 marzo 2009 - 15.40

basicdany Profilo | Expert

Ciao a tutti, dovrei in automatico scaricare la posta elettronica da vari server, questo dovrei realizzarlo
tramite vb.net, qualcuno mi puo postare cosa potrei fare questo via codice.

La mia applicazione dovrebbe essere sempre in attesa di nuove email

grazie a tutti, il miglior forum nel settore!!!!

Gianni77 Profilo | Junior Member

c'è un ottimo articolo qui su dotnethell :

http://www.dotnethell.it/articles/POP3.aspx

io lo sto usando con successo, dopo alcune modifiche. Per fargli controllare la posta ogni tot di tempo, metti un timer che ti richiama le funzioni che ti interessano. Se ti serve, predisponi un database per memorizzare le email e a questo punto se vuoi invii i comandi per la cancellazione se i messaggi sono stati scaricati correttamente. In effetti postarti un codice cosi vuol dire creare il programma completo... comincia a smanettare con il codice dell'articolo in questione e vedrai che è abbastanza semplice.

basicdany Profilo | Expert

ok, mi studio un po il codice e ti faccio sapere, grazie tanto.

basicdany Profilo | Expert

ciao, ho studiato il codice che mi ha postato come esempio, ho un problema, riesco a ha
collegarmi ,
fare il login
ma quando vado per leggere il messaggio n.1 per esempio:

Public Sub getMessage(ByVal intMessageNum As Integer)
Dim intHeaderEnd As Integer
Dim strHeader As String
'controllo che sia connesso
_strMessage = ""
If blnConnect Then
_strMessage = executeCommand("RETR " + intMessageNum.ToString())
'controllo che il messaggio sia stato ricevuto
If chekMessage(_strMessage) Then
'cerco la fine degli header, e la fine è caratterizzata dalla prima
'riga dopo due a capi
strHeader = executeCommand("TOP " + intMessageNum.ToString())
'imposto gli header
getHeader(strHeader)
'reimposto il testo del messaggio
_strMessage = _strMessage.Replace(strHeader, "")
End If
End If
End Sub

la procedura quando legge alla variabile "strHeader" mi restituisce "-ERR Protocol error."
tengo a precisare che mi collego con alice.

aspetto gentile risposta, nel caso se mi puo postare qualche esempio o codice
grazie tanto

basicdany Profilo | Expert

ciao, ho studiato il codice che mi ha postato come esempio, ho un problema, riesco a ha
collegarmi ,
fare il login
ma quando vado per leggere il messaggio n.1 per esempio:

Public Sub getMessage(ByVal intMessageNum As Integer)
Dim intHeaderEnd As Integer
Dim strHeader As String
'controllo che sia connesso
_strMessage = ""
If blnConnect Then
_strMessage = executeCommand("RETR " + intMessageNum.ToString())
'controllo che il messaggio sia stato ricevuto
If chekMessage(_strMessage) Then
'cerco la fine degli header, e la fine è caratterizzata dalla prima
'riga dopo due a capi
strHeader = executeCommand("TOP " + intMessageNum.ToString())
'imposto gli header
getHeader(strHeader)
'reimposto il testo del messaggio
_strMessage = _strMessage.Replace(strHeader, "")
End If
End If
End Sub

la procedura quando legge alla variabile "strHeader" mi restituisce "-ERR Protocol error."
tengo a precisare che mi collego con alice.

aspetto gentile risposta, nel caso se mi puo postare qualche esempio o codice
grazie tanto

Gianni77 Profilo | Junior Member

Si hai ragione, difatti quel codice sorgente ricordo aveva qualche errore. Il comando TOP difatti non serve precisamente a leggere l'header di un messaggio ma a leggerne le prime Y righe e non ha quella sintassi ma questa:

TOP X Y

dove X= numero messaggio e Y= righe da leggere
(http://www.settorezero.com/wordpress/leggere-le-email-utilizzando-telnet/)

per scorporare il vero e proprio header dal resto dell' email puoi intercettare i due ritorni a capo (che caratterizzano la separazione dell'header dal corpo del messaggio) e quindi eliminare tutta la parte di messaggio dalla posizione iniziale fino al punto in cui ci sono i due ritorni a capo e ottenerne quindi soltanto il corpo, prova a modificare il sorgente in questo senso nel frattempo che cerco un po la roba che scrissi tempo fa su questo argomento

basicdany Profilo | Expert

ciao, ti ringrazio tanto, come ti dicevo mi da errore quando leggo l'email:
strHeader = executeCommand("TOP " + intMessageNum.ToString())

-pero leggendo la variabile _strMessage vedo tutto il testo dell'email, che mi basterebbe pure, basta che
cerco quello che mi interessa e mi basterebbe gia cosi, pero' noto che non ho tutto il testo dell'email
ma solo 1020 caratteri, quindi dopo 1020 carattere perdo l'altro testo.

If chekMessage(_strMessage) Then
TextBox2.Text = _strMessage
'cerco la fine degli header, e la fine è caratterizzata dalla prima
'riga dopo due a capi
strHeader = executeCommand("TOP " + intMessageNum.ToString())
'imposto gli header
getHeader(strHeader)
'reimposto il testo del messaggio
_strMessage = _strMessage.Replace(strHeader, "")
End If

-l'altro problema e che non si collega a tutti i pop d'ingresso pero questo dipende dalla connessione ad
internet che si possiede, esempio io che ho alice, riesco solo a collegarmi hai pop di alice, tu come hai
risolto questo problema.

ciao aspetto il tuo aiuto,
grazie tanto

Gianni77 Profilo | Junior Member

Per quanto riguarda la prima questione, te l'ho detto, non recuperi il messaggio perchè il comando TOP non ha quella sintassi, il codice li ha un bug, io ho modificato la sub GetMessage della classe POP in questo modo e mi funziona bene:

Public Sub getMessage(ByVal intMessageNum As Integer) 'Dim intHeaderEnd As Integer Dim strHeader As String 'controllo che sia connesso _strMessage = "" If blnConnect Then _strMessage = executeCommand("RETR " + intMessageNum.ToString()) 'controllo che il messaggio sia stato ricevuto If chekMessage(_strMessage) Then 'cerco la fine degli header, e la fine è caratterizzata dalla prima 'riga dopo due a capi Dim headerEnd As Integer = _strMessage.IndexOf(vbCrLf & vbCrLf) If headerEnd > 0 Then strHeader = _strMessage.Substring(0, headerEnd) 'imposto gli header getHeader(strHeader) 'reimposto il testo del messaggio _strMessage = _strMessage.Replace(strHeader, "") End If End If End If End Sub

per quanto riguarda la seconda domanda, è ovvio che se ti colleghi con alice non puoi (normalmente) scaricare la posta di libero e viceversa. Se vuoi fare per forza una cosa del genere devi ricorrere a software che ti installano un server pop sul tuo pc, uno buono è freepops:

http://www.freepops.org/it/

qui: http://www.chicchedicala.it/2007/11/30/leggere-le-email-di-libero-su-outlook-express-guida-freepops/ c'è una guida che ti illustra come far funzionare freepops.

basicdany Profilo | Expert

1)ciao, ho inserito quella procedura che mi hai passoto tutto ok se scarico l'email con la stessa connessione
del mio server.

2)ho visto quei link per scaricare da altri server e noto questo problema

ricevo il contenuto dell'email da questa procedura:"chekMessage",
come vedi la passo a una txtrisposteserver per avere un debug delle risposte

Private Function chekMessage(ByVal strMessage As String) As Boolean
'controllo le prime tre letter del messaggio
'se con +OK l'operazione è stata eseguita con successo
If Mid(strMessage, 1, 3) = "+OK" Then
txtrisposteserver.Text = txtrisposteserver.Text & strMessage
Return True
Else
txtrisposteserver.Text = txtrisposteserver.Text & strMessage
Return False
End If
End Function

mentre dalla procedura vera e propria modificata da te che passo il contenuto a una TextBox2.Text :

Public Sub getMessage(ByVal intMessageNum As Integer)
'Dim intHeaderEnd As Integer
Dim strHeader As String
'controllo che sia connesso
_strMessage = ""
If blnConnect Then
_strMessage = executeCommand("RETR " + intMessageNum.ToString())
'controllo che il messaggio sia stato ricevuto
If chekMessage(_strMessage) Then
TextBox2.Text = _strMessage
'cerco la fine degli header, e la fine è caratterizzata dalla prima
'riga dopo due a capi
Dim headerEnd As Integer = _strMessage.IndexOf(vbCrLf & vbCrLf)
If headerEnd > 0 Then
strHeader = _strMessage.Substring(0, headerEnd)
'imposto gli header
getHeader(strHeader)
'reimposto il testo del messaggio
_strMessage = _strMessage.Replace(strHeader, "")
End If
End If
End If
End Sub

RICEVO COME RISPOSTA:"+OK ANSWER FOLLOW"

ANCHE SE FUNZIONA COSI POTREBBE ANDARE, MA VOLEVO CAPIRE IL PERCHE' NON VORREI CHE SI POSSONO
CREARE PROBLEMI CON ALCUNI PROVIDER.
SE MI PASSO L'EMAIL TI PASSO IL SORGENTE CHE HO REALIZZATO CON IL TUO AIUTO MOLTO PREZIOSO

ASPETTO RISPOSTA GRAZIE


Gianni77 Profilo | Junior Member

scusa non riesco a capire che vuoi dire. Il codice che ti ho postato io lo utilizzo regolarmente, addirittura con un timer che mi controlla la posta ogni 5 minuti alla ricerca di una email con soggetto particolare per attivarmi una procedura, 24 ore su 24 per settimane. nessun problema.
Adesso non capisco cosa ti serve, potresti spiegarti meglio?

basicdany Profilo | Expert

Ciao, volevo dirti che ricevo l'email non dalla procedura di ricezione "getMessage" ma dalla procedura
"chekMessage" con alcuni server che ho provato.

Per spiegarti meglio da getMessage RICEVO COME RISPOSTA:"+OK ANSWER FOLLOW"
da "chekMessage" ricevo il testo dell'email.

ANCHE SE FUNZIONA COSI POTREBBE ANDARE, MA VOLEVO CAPIRE IL PERCHE' NON VORREI CHE SI POSSONO
CREARE PROBLEMI CON ALCUNI PROVIDER.
SE MI PASSO L'EMAIL TI PASSO IL SORGENTE CHE HO REALIZZATO CON IL TUO AIUTO MOLTO PREZIOSO

ASPETTO RISPOSTA GRAZIE

luxsor Profilo | Guru

Ciao Daniele,
nella RFC 1939 specifica poco e niente riquardo alla risposta "ANSWER FOLLOW", ma potrebbe essere dovuta quando un gestore di servizi blocca un'altro gestore, quindi il messaggio risulta vuoto.

Ti consiglio di fare alcuni test su gestori e email differenti, così ti togli tutti i dubbi.

Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5