Newsgroup: it.comp.lang.visual-basic
Titolo: [OT] router e blocco invio dati

Probabilmente questo e' il NG giusto a meta', ma ci provo lo stesso...
Ho postato qualche giorno fa chiedendo aiuto per un programma che 
utilizza un ocx per inviare mail con allegati.
Pensavo ci fossero problemi di librerie o registrazione di ActiveX, ma 
oggi ho provato ad installare su un pc vergine ed il prog funziona 
correttamente.
La domanda:
E' possibile che qualche impostazione del firewall di un router blocchi 
la comunicazione di mswinsck.ocx o di altro componente che tenta di 
accedere alla rete?
Una prima versione del mio programma utilizavva direttamente winsock per 
inviare un messaggio ad un server smtp, e gia' allora, sul pc del 
cliente, la comunicazione non avveniva. Allora, pensando di sbagliare 
qualcosa nella procedura ho installato questo componente kmail, ma il 
problema persiste. Il programma era installato, presso il cliente, prima 
su win98se, poi su winxp, ma con lo stesso risultato.
Visto che a me funziona, l' ultima spiaggia e' appunto quella che il 
router abbia qualche impostazione che blocca la comunicazione, anche se 
l'ipotesi mi sembra bizzarra.
Se qualcuno ha delle idee ...
grazie
		maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 l'ipotesi mi sembra bizzarra.
Il router, un firewall HW o un firewall SW...
tra l'altro, visto che parli di Xp, non è che hai attivato
il firewalling di xp?
Parlaci di configurazioni e vedremo...
ciao
ugo

 Parlaci di configurazioni e vedremo...
Come sei duro! :-)
Ti dico cosa ho provato a fare:
-Internet Explorer funziona
-Outlook funziona
-telnet 
smtp.pippo.com
 25 funziona e posso dare i comandi di invio posta ...


 posta ...
Allora ammenochè non ci sia un firewall sw installato sul PC è un problema
del tuo software! ;)


Allora riformulo la domanda:
Xp pone particolari problematiche per l'utilizzo di mswinsck.ocx et 
similia? Versioni di dll sovrascritte o incompabili?
A parte il sistema operativo ;-) il pc del cliente e quello dove ho 
fatto il test sono vergini. Nessuna applicazione installata, a parte 
office 2000.
L'errore e' di trasmissione:
if kmail.sendmail(indirizzo, oggetto, testo...) then
	msgbox "messaggio inviato"
else
	msgbox "messaggio non inviato"
endif
E l'errore restituitomi e': "Unable to transmit".
Tutti i dati necessari per l'invio del messaggio ci sono.
boh


 -telnet 
smtp.pippo.com
 25 funziona e posso dare i comandi di invio posta ...
Non posso risolvere il tuo problema con kmail, ma per provare
e analizzare meglio la cosa, fai un "programmino" con l'esempio
SMTP del Sito Comune e vedi se quello funziona (tra parentesi,
manda anche gli allegati :-) ).
Altrimenti, dicci che numero o messaggio di errore viene fuori.
P.S.: non so se il FW di XP permette di filtrare le singole applicazioni
che tentano di uscire, come fanni i PFW più seri, prova a vedere.
Bye, G.

 
Tanto per rendere le cose piu' complicate, ho dovuto installare su win 
xp, che non conosco ... :-(


 manda anche gli allegati :-) ).
Ho mandato al cliente il programmino generato con il progetto del SC e 
... funziona!
Chissa' cosa diamine avevo scritto nella prima versione che non funzionava.
Vabbe' il solito tempo perso inutilmente.
Rimane il problema del kmail.ocx ...


 ... funziona!
Continuo questa saga sperando che possa essere d'aiuto ad altri ...
Riepilogo velocemente:
Programma che tramite protocollo smtp invia un messaggio ad una casella 
di posta elettronica. Ho utilizzato prima come modello il progetto del 
sito comune, abbandonato poi per un ocx kmail.ocx che non funzionava, ho 
infine ripreso in mano il progetto del SC.
Sul pc dove sviluppo e su un pc vergine funziona tutto, ma dal cliente 
nisba.
Dopo lunga indagine ho scoperto l'inghippo.
L'invio del messaggio avviene con una struttura di questo tipo.
sub inviaDati
	winsock1.SendData mieiDati
	cicloDiAttesa OK	'contiene doevents
end Sub
Sub Winsock1_DataArrival
	OK = true
end Sub
Su alcuni server smtp (la statistica e' il 50% dei casi :-) il ciclo si 
svolge troppo velocemente ed il server si perde probabilmente qualcosa, 
rimane in uno stato non coerente e non si accorge che il messaggio gli 
e' gia' stato mandato.
Per risolvere ho aggiunto una istruzione sleep(5) in winsock1_DataArrival.
Non si capisce comunque perche' con alcuni server si debba rallentare il 
flusso di dati e con altri no... Nel RFC relativo a SMTP non si parla di 
specifiche sulla velocita' di invio dei dati ...
Se qualcuno ha commenti o suggerimenti sulla questione sono graditi.
ciao


 
Qui intendevo:
Sub Winsock1_SendComplete
	OK = true
end sub


 Per risolvere ho aggiunto una istruzione sleep(5) in winsock1_DataArrival.
Esiste un altro evento, non ricordo se Connect o OnConnect, che genera anche
un DataArrival, ma che in realtà non contiene dati.
Prova a fare un po' di debug su questo.
Un'altra cosa che consiglio sempre, è di verificare, nel dataarrival (quando
non avviene OnConnect), che nei dati ci sia un VbCrLf.
Accade infatti che si riceva una parte della risposta del server, e si inizi
ad invare il comando successivo, mentre in realtà il winsock sta ancora
ricevendo, e questo in qualche modo dà problemi.
Mettendo a True il flag OK solo se arriva VbCrLf e il primo carattere dei
dati è un '2' o un '3', si evita a priori ogni problema.
Considera anche, ma questo immagino tu l'abbia già visto, che molti server
richiedono tassativamente il parametro Sender o Recipient all'interno dei
dati da mandare dopo il 354. Ad esempio, alcuni server SMTP di 
libero.it
, se
non mandi il Recipient all'interno del messaggio dopo il DATA, ti
rispediscono indietro il messaggio.
Ciao
Alberto

 Se qualcuno ha commenti o suggerimenti sulla questione sono graditi.
Un consiglio, e una pulce nell'orecchio: lascia la Sleep in tutti i casi,
e poi, in realtà ci vorrebbe anche un timeout sulla connessione.
Guarda tutti i problemi che hanno avuto (e hanno tuttora) gli utenti
di OE con i server di Interbusiness...
In genere si consiglia di aumentare il timeout a 2:30 secondi prima
di ritentare un invio che si pensa fallito.
Bye, G.

 
Il timeout lo ho parametrizzato e lo posso far modificare ...
grazie


 
Questo e' a posto ...
Ho mandato al cliente una versione di prova. Speriamo in bene perche' mi 
sto scocciando. Mi costava meno far arrivare la fibra nel suo ufficio (a 
Lugano)! :-)
grazie


 po' tutto. Se metto sleep(5) funziona!
Hai provato un doevents al posto della Sleep ?
Oppure (idea brillante di quelle che di solito non funzionano :-) )
ad usare la Sleep solo quando mandi il punto finale ?
Bye, G.


26/11/2002 10.24.31         WS_DataArrival: 354 Ready for data
26/11/2002 10.24.31         MailTo2 - Subject: mio messaggio
26/11/2002 10.24.31         MailTo2 - Body
26/11/2002 10.24.56         MailTo2 - Chiudi messaggio
26/11/2002 10.24.56         WS_DataArrival: 250 Message received OK
26/11/2002 10.24.56         Getreply2: 250 Message received OK
26/11/2002 10.24.56         MailTo2 - Quit
26/11/2002 10.24.56         WS_DataArrival: 221 
smtp.com
 closing
26/11/2002 10.24.56         Getreply2: 221 
smtp.com
 closing
Non ho loggato tutti gli OK dell'evento SendComplete ...
 >
 > Hai provato un doevents al posto della Sleep ? Oppure (idea brillante
 > di quelle che di solito non funzionano :-) ) ad usare la Sleep solo
 > quando mandi il punto finale ?
 >
Le ho provate un po' tutte. Ero anche arrivato alla conclusione che i
problemi si verificano se si inviano piu' di 255 caratteri (numero
magico) e allora sono andato a rileggermi tutti gli rfc ... una
sofferenza ...
Il codice copiato praticamente paro-paro dal SC e':
Dim righe() As String
righe = Split(messaggio, vbCrLf)
For i = 0 To UBound(righe, 1)
     OKToSend = False
     WS(1).SendData righe(i) & Chr$(13) & Chr$(10)
     While OKToSend = False: DoEvents: Wend
Next i
...
e poi:
Private Sub WS_SendComplete(Index As Integer)
'setta il flag di avvenuta consegna pacchetto
     Sleep (sleepDelay)	' questo lo ho aggiunto io per farlo funzionare
     OKToSend = True
End Sub
ciao


 Dim righe() As String
[CUT]
Se non c'č niente di riservato, potresti mandarmi in mail
il codice che usi ? Vorrei fare un paio di prove con due o
tre server diversi.
Ah, un'altra cosa: se ti connetti con un Telnet alla porta 25 di
quel server e provi a mandare la mail "a mano", funziona ?
Manda anche la stringa che ti risponde quando ti connetti
all'inizio e quello che ti risponde se dai il comando HELP.
Da quello che ho capito il server č Mailsite della Rockliffe, ma
vorrei esserne sicuro.
Bye, G.


Tombola! L'istruzione HELP non e' implementata!
grazie ancora


 Tombola! L'istruzione HELP non e' implementata!
???
Inaccettabile... AFAIK fa parte della RFC. :-(
Bye, G.