Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Stringhe, Winsock e POP3

salve a tutti, volevo chiedere un consiglio per un problema che davvero non
riesco a capire...
tramite il controllo winsock scarico una e-mail dal mio server pop3,
dopodiché memorizzo l'intera mail (completa di intestazione) nella stringa
"messaggio". Fino a qua tutto regolare, ho provato anche a copiare la
stringa in una textbox per vedere come appariva e tutto sembra funzionare
alla perfezione. In una form, perň, vorrei fare apparire il nome del
mittente
della e-mail. Qui nascono i miei problemi. Il codice che ho scritto é
questo:
riga = ""      'é una variabile stringa
    For j = 1 To Len(messaggio)    'ciclo di lettura carattere per carattere
      riga = riga & Mid$(messaggio, j, 1)   'costruisco la prima riga un
carattere per volta
      If Mid$(messaggio, j, 1) = Chr$(13) Then
      'nel caso siamo a fine riga (vbcrlf) si entra nell'if
        Debug.Print Mid$(riga, 1, 5)   'visualizzo nella immediate i primi 4
caratteri della riga
        If (Mid$(riga, 1, 5) = "FROM") Then
       'se i primi 4 caratteri sono "FROM" allora scrivo quello che c'č dopo
nella caption della
       'label lblmittente2. Il problema é che il programma non entra mai in
questo if, nonostante
       'la finestra immediate mi visualizzi tra gli altri anche "FROM"
          Mittente = Mid$(riga, 6, Len(riga))
          lblMittente2.Caption = Mittente
        End If
        riga = ""     'riazzero la riga
      End If
    Next j
--
Fabio Ruini
(
fabi...@libero.it
)
"Non si puň descrivere la passione, la si
puň soltanto vivere" (Enzo Ferrari)


Newsgroups: it.comp.lang.visual-basic
Subject: [?] Stringhe, Winsock e POP3
Lines: 53
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.50.4133.2400
ecc. ecc.
A prescindere da considerazione su come strutturare i dati contenuti in tale stringa,
ecco come estrarre nickname ed email:
Public Sub Prova(ByVal strMessage As String)
Dim Righe() As String
Dim cnt As Long
Dim buffer As String
Dim posEmail As Integer
Dim posChiudiEmail As Integer
Dim strNick As String
Dim strEmail As String
Righe = Split(strMessage, vbNewLine, -1, vbTextCompare)
For cnt = 0 To UBound(Righe)
 
    If (StrComp(Left$(Righe(cnt), 5), "From:", vbTextCompare) = 0) Then
 
        buffer = Trim$(Mid$(Righe(cnt), 6))
        posEmail = InStr(1, buffer, "<", vbTextCompare)
        posChiudiEmail = InStr(1, buffer, ">", vbTextCompare)
        If (posEmail) Then
            If (posEmail = 1) Then
                strNick = Trim$(Mid$(buffer, posChiudiEmail + 1))
                strEmail = Trim$(Mid$(buffer, 2, posChiudiEmail - 2))
            Else
                strNick = Trim$(Left$(buffer, posEmail - 1))
                strEmail = Trim$(Mid$(buffer, posEmail + 1, posChiudiEmail - posEmail))
            End If
        End If
 
        strNick = Replace(strNick, """", "")
        Debug.Print strNick
        Debug.Print strEmail
 
        Exit For
 
    End If
Next cnt
End Sub
ciao, hal

grazie mille... ma cosa c'é di sbagliato nel mio codice?


>grazie mille... ma cosa c'é di sbagliato nel mio codice?
Premesso che anche il mio esempio e' incompleto
(provandolo in diverse situazioni lo vedrai), lo scopo era portare l' attenzione su:
1.
la concatenazione di stringhe e' lenta perche' ogni volta vb rialloca la memoria, quindi, 
facendolo carattere per carattere, vb esegue una malloc (o qualcosa del genere) ogni volta
(vb non e' un fulmine con le stringhe, anzi ...) ;
2.
il tuo ciclo, di per se' valido, e' difficile da gestire perche' non organizza i dati in modo strutturato:
ho volutamente inserito le chiamate a Split, Instr, Mid, Replace e StrComp per osservarne 
le caratteristiche e invitando quindi a studiarne le potenzialita';
3.
If (Mid$(riga, 1, 5) = "FROM") Then
Questa tua riga e' il motivio scatenante il tuo post, anche se poi mi sono preso la liberta'
di andare un pochino oltre.
Cmq, la spiegazione specifica e' che l' operatore = confronta le stringhe in modalita'
binaria e non testuale, sicche' "from" <> "FROM" <> "From" <> "fROm" ecc.
Percio' il rimedi possibili sarebbero stati due:
a) If (UCase$(Mid$(riga, 1, 5)) = "FROM") Then
b) If (StrComp(Mid$(riga, 1, 5), "FROM", vbTextCompare) = 0) Then
Grazie per la pazienza usata fino qui e spero di essere stato utile.
ciao, hal

 'se i primi 4 caratteri sono "FROM" 
Allora non usare un "5" nei parametri di Mid$ :-)
Comunque forse ti sarebbe piu' semplice prendere i primi caratteri del
messaggio (sino al primo doppio crlf), splittarli questi sui carriage
return, e avresti la lista degli header del messaggio, da cui sarebbe
facile capire i vari valori. In ogni caso dovresti forse usare "From: "
anziche' "From" soltanto...
-- 
 Pastrano

 ha scritto nel messaggio
news:9bufsh$9v6am$1...@ID-56381.news.dfncis.de...


 ha scritto nel messaggio
news:200142258875.4652.1@yairakofdcqw...

in effetti questo é un altro dei problemi che non sono riuscito a capire...
ho provato in tutti due i modi, ma con gli stessi (scarsissimi) risultati.
Nella finestra immediate, la prima stringa che compare é di 5 caratteri e
tutte quelle successive sono di 4... sinceramente non riesco a spiegarmelo,
ma é per questo che ho usato il 5 nel mid$...
--
Fabio Ruini
(
fabi...@libero.it
)
"Non si può descrivere la passione, la si
può soltanto vivere" (Enzo Ferrari)

é questo il mio vero arcano :-)
Tu facevi il test su Chr$(13), ma il ritorno a capo e' 0x13 0x10 (cioe' due byte),
quindi tu per leggere FROM passavi 5 a Mid$, ma il primo carattere era il LineFeed
che ti mandava il il from a capo (non hai notato che ti saltava una riga ?).
Ecco perche' ti avevo suggerito la funzione Split.
ciao, hal

 ciao, hal
porco boia... infatti la finestra immediate mi faceva vedere della roba
strana... per l'esattezza ho postato un msg sempre in questo thread a
pastrano... cinque caratteri della prima, riga vuota e quattro caratteri di
quelle successive, intervallate tutte da una riga vuota!
grazie mille, hal!


 nel mid$...
Credo sia colpa del fatto che non controlli i vbcrlf ma solo il chr(13),
ma comunque ti conviene usare la funzione split(). Anche perche' non so
che uso ne vuoi fare, ma devi tenere conto che la riga degli headers puo'
proseguire anche dopo il crlf: se inizia con gli spazi o il tab, allora e'
il proseguo dell'header precedente (e mi pare di avere visto che molto
spesso i vari Outlook fanno cosi', forse per cercare di dar noia ai
programmi che non stanno attenti a tutto - ma proprio a tutto - e
convincerci che OE e' la panacea di tutti i mali: a pensar male etc etc)
-- 
 Pastrano