PDA

View Full Version : Invio email


Carmen
20-04-2004, 15:02
Ciao,

Vorrei chiedervi se potreste aiutarmi ad risolvere un grosso problema:

Praticamente in VB o una pagina dalla quale invio email con allegato un file utilizzando il componente WINSOCK.

Fin quà tutto ok, visto che riesco ad inviare l'email tranquillamente. Il problema si è presentato dovendo usare lo stesso programma su un pc dotato di connessione ADSL, per la quale per l'invio delle email occorre settare anche i parametri "AUTENTICAZIONE DEL SERVER NECESSARIA" Idem quella contenuta in OUTLOOK dove successivamente dovranno essere impostati nome account e password forniti dal provider.

Praticamente il programma non mi dà nessun errore, ma le email inviati non arrivano mai a destinazione visto che il provider richiede che per la posta in uscita siano impostati i parametri come sopra dicevo.

Per favore, qualcuno di voi sà come poter impostare al WINSOCK questi parametri?

Oppure se qualcuno di voi conosca qualche altro componente per l'invio di email con annesso allegato che mi possa suggerire, anche se preferirei risolvere con WINSOCK visto che cio tutto già fatto.

Spero che mi possiate aiutare, perchè mi trovo abbastanza incasinata.


Ciao, Carmen

cionci
20-04-2004, 15:48
Con Winsock di dovresti essere fatta tutto il protocollo per SMTP per inviare una email... Cambia soltanto nella prima parte dove l'informazione su username e password viene inviata codificata in base 64...
Dovresti trovare qualcosa a riguardo qui: http://www.faqs.org/rfcs/rfc2821.html

Carmen
21-04-2004, 14:53
Ciao. Ti invio il progetto così magari se puoi le dai un'occhiata che forse e più chiaro.

Ciao.

cionci
21-04-2004, 16:23
Ora sinceramente non posso metterci le mani...

http://www.technoids.org/saslmech.html#appB
L'autenticazione è all'appendice B...

Il client deve inviare:

AUTH LOGIN

Successivamente alla risposta del server deve inviare lo username codificato in Base64...
Dopo la risposta del server deve inviare la password codificata in base64...
Se è andata bene riceve un reply del tipo 235...

Tutto questo va messo subito dopo questa riga (prima di HELO):

'il programma si 'presenta' al server inviando il proprio IP address

Per l'algortimo di codifica Base64 ci dovrebbe essere molto in rete...avevio postato tempo fa un Encode/Decode ma non mi riesce trovarlo...

vici_1
21-04-2004, 23:58
Mi ero avventurato nello studio del protocollo SMTP(Simple Mail Transfer Protocol ed e' descritto nell'RFC 821 (vedi sito "The Internet Engineering Task Force" all'indirizzo http://www.ietf.org in particolare qui : http://www.ietf.org/rfc/rfc0821.txt?number=821) per inviare email con un pgm in C tramite la libreria winsock... un disastro.
Mi sono bloccato proprio sull'autenticazione.
Ho risolto, devo dire brillantemente in VB, utilizzando i componenti Microsoft MAPI Controls.

Ecco il mio semplicissimo listato che invia email con uno o piu' allegati. Anche con connessione ADSL. Ovviamente utilizza utente e password nonche' parametri del server definiti nel mio client di posta predefinito che e' outlook Exsperss.
Nel Form ho inserito i due controlli MAPISession e MAPIMessages

Option Explicit
Dim fso As New FileSystemObject
Dim path1 As String

Private Sub Form_Load()

Dim i As Integer
Dim ff As Boolean

i = 0
ff = False

Do While Not ff

i = i + 1

path1 = "e:\vipgmc\intraday_web\pagina" & i & ".html"

If fso.FileExists(path1) _
Then
' inizio istruzioni per invio email ----------
MAPISession1.DownLoadMail = False
MAPISession1.SignOn

MAPIMessages1.SessionID = MAPISession1.SessionID
MAPIMessages1.MsgIndex = -1

MAPIMessages1.RecipAddress = "[email protected]"
MAPIMessages1.MsgSubject = "quotazioni "
MAPIMessages1.AttachmentPathName = path1

MAPIMessages1.Send

MAPISession1.SignOff
' fine istruzioni per invio email ----------
Else
ff = True
End If

Loop

'fine programma
End

End Sub

Carmen
22-04-2004, 11:07
Ciao Cionci;

O dato un'occhiata al link che mi segnalavi, però al riguardo non sono molto preparata, per cui devo dire che mi viene alquanto complicato riuscire ad mettere insieme le parti di codice mancante.

Non vorrei sembrarti troppo invadente, ma spero che riuscirai ad trovare un frammento del tuo tempo per potermi magari postarmi tù stesso il frammento di codice mancante...

Io intanto cercherò di capirci qualcosa....


A presto, e grazie. Carmen

cionci
22-04-2004, 17:49
Ecco qua...
Permette di inviare se è presente l'autenticazione (devi mettere username e password), ma non mi funziona con gli attachment...

Carmen
23-04-2004, 11:01
Ciao.

Ti ringrazio tantissimo per il tuo prezziosissimo aiuto. Ancora non lo provato su una connessione ADSL, lo farò nel pomeriggio e ti faccio sapere se tutto OK!

L'allegato non lo mandava perchè nella cartella la dove si trova il programma bisogna che ci sia una cartella di nome Files


Ancora grazie e a presto. Carmen

Carmen
24-04-2004, 10:12
Tutto OK! O provato il tutto anche con la connessione ADSL e funziona perfettamente.

Avrei da chiederti un'ultimo favore qualora fosse possibile.

Sarebbe possibile aggiungere una barra di progressione la quale darebbe l'idea dello stato di avanzamento dell'operazione? un po' come outlook quando si invia una email. La cosa sarebbe utile quando l'allegato abbia delle dimensioni rilevanti, per cui il trascorrere di qualche minuto per l'invio del messaggio potrebbe indurre al fatto che non stia succedendo nulla.

Notavo che winsock è dotato dell'evento "SendProgress", purtroppo non so' come utilizzarlo. Non so' se magari ai qualche chicca da postarmi su cio'.


Ciao. Carmen

cionci
24-04-2004, 10:31
Per l'invio di una semplice email non occupa molto tempo...magari il problema è l'attachment...

uuEncodeToFile "x.uue", logoFile
Open "x.uue" For Input As 10
While EOF(10) = False
Line Input #10, l$

OKToSend = False
WS(1).SendData l$ & Chr$(13) & Chr$(10)
While OKToSend = False: DoEvents: Wend

Il punto in cui avanza è quello sopra...
Devi fare una cosa del genere:

uuEncodeToFile "x.uue", logoFile
passo = fsize / 100
parziale = 0
avanzamento = 0 'questa è la progress bar
Open "x.uue" For Input As 10
While EOF(10) = False
Line Input #10, l$
parziale = parziale + grandezza di l$ + 2
avanzamento = Int(parziale / passo)
OKToSend = False
WS(1).SendData l$ & Chr$(13) & Chr$(10)
While OKToSend = False: DoEvents: Wend

Carmen
24-04-2004, 13:54
Ciao, provando il codice che mi ai postato, devo dire che funziona e non funziona.

Ti spiego: Per far funzionare la ProgressBar dovrei settare il suo valore Max "ProgressBar.Max = xxx";

su questa riga "avanzamento = Int(parziale / passo)" mi da un errore, funziona se la lascio così "avanzamento = Int(parziale)"


questa riga "parziale = parziale + grandezza di l$ + 2" la dovrei forse scrivere così? "parziale = parziale + len(l$) + 2"



Ciao

cionci
24-04-2004, 14:01
Infatti il mio non era codice VB, ma pseudocodice...

Comunque mi sono scordato di dirti che fsize è la grandezza del file in Kb...da determinare in qualsiasi modo ti riesca...

Comunque strano che non ti funzioni... Hai definito "passo" ?
"avanzamento" è la progressbar...

Devi settare il max a 100...ed il valore dell'avanzamento della progressbar al valore che ho dato ad avanzamento...

Credo che per la grandezza di l$ vada bene così...non sono sicuro...non programmo in VB :(

Carmen
24-04-2004, 15:24
Accidentaccio! Non và. o impostato il codice così:

uuEncodeToFile "x.uue", logoFile
passo = FileLen(App.Path & "\files\" & TxtLogo) / 100
parziale = 0
avanzamento = 0 'questa è la progress bar
ProgressBar1.Max = 100

Open "x.uue" For Input As 10
While EOF(10) = False
Line Input #10, l$

parziale = parziale + Len(l$) + 2
avanzamento = Int(parziale / passo)
MsgBox avanzamento
'ProgressBar1.Value = avanzamento

OKToSend = False
WS(1).SendData l$ & Chr$(13) & Chr$(10)
While OKToSend = False: DoEvents: Wend

Non và perche il valore di avanzamento supera quello della prorpietà Max della progressbar, quindi ottengo un bel errore.

Dove sbaglio?

cionci
24-04-2004, 15:55
Ci sono dei problemi sulla lettura del file...ho fatto qualche piccola correzzione, me nella variabile non ci finiscono mai i dati non capisco...

uuEncodeToFile "x.uue", logoFile
passo = FileLen(App.Path & "\files\x.uue") / 100
parziale = 0
avanzamento = 0 'questa è la progress bar
ProgressBar1.Max = 100

Open App.Path & "\files\x.uue" For Input As #10
While EOF(10) = False
Line Input #10, l$

parziale = parziale + Len(l$) + 2
avanzamento = Int(parziale / passo)
MsgBox avanzamento
ProgressBar1.Value = avanzamento

OKToSend = False
WS(1).SendData l$ & Chr$(13) & Chr$(10)
While OKToSend = False: DoEvents: Wend

Carmen
24-04-2004, 16:10
Prova così. Io leggo il suo valore


passo = FileLen(App.Path & "\x.uue") / 100
...
....
Open App.Path & "\x.uue" For Input As #10

cionci
24-04-2004, 16:12
Ma allora va ora ?
passo me lo inizializzava bene...era la lettura che non andava...

cionci
24-04-2004, 16:17
Originariamente inviato da Carmen
Prova così. Io leggo il suo valore


passo = FileLen(App.Path & "\x.uue") / 100
...
....
Open App.Path & "\x.uue" For Input As #10
Così non inzializza nemmeno passo...

Carmen
24-04-2004, 16:21
uuEncodeToFile "x.uue", logoFile
passo = FileLen("x.uue") / 100
MsgBox passo
parziale = 0
avanzamento = 0 'questa è la progress bar
Open "x.uue" For Input As 10

While EOF(10) = False
Line Input #10, l$

parziale = parziale + (Len(l$) + 2)
avanzamento = Int(parziale / passo)
MsgBox avanzamento
ProgressBar1.Value = avanzamento

OKToSend = False
WS(1).SendData l$ & Chr$(13) & Chr$(10)
While OKToSend = False: DoEvents: Wend


Con questo codice adesso finalmente mi funziona perfettamente. Ovviamente ti ringrazio del tuo prezziosissimo aiuto...


Carmen

cionci
24-04-2004, 16:39
Perfetto... Funziona tutto ;)

Carmen
24-04-2004, 16:41
Siamo proprio forti!!! :p :p

Ops! Sei proprio forte :D :D :D