Newsgroup: it.comp.lang.visual-basic
Titolo: spedire email da vb

Ciao a tutti, vorrei sapere come fare a spedire una email con attachment da
una applicazione in visual basic. Mi potete aiutare?
Grazie mille e buon lavoro a tutti!!

 Grazie mille e buon lavoro a tutti!!
Devi essere in grado di gestire i socket.

Studiati la RFC riguardante SMTP e poi studiati Winsock. Se vuoi altre
informazioni scrivimi in e-mail.
--
Ramses
http://evilzone.tsx.org
ICQ: 39860665
"La prima volta che ho preso l'alcole ho visto Dio"
by Claudio Zanon
"hey" <h...@hey.hey> ha scritto nel messaggio
news:8oe1nq$3ll0$1...@stargate1.inet.it...



Prova a guardare questo:
http://www.cis.ohio-state.edu/htbin/rfc/rfc1939.html
-- 
Andrea Zwirner
wul...@interfree.it
Poni ciň che sei nel minimo che fai.

 Poni ciò che sei nel minimo che fai.

 una applicazione in visual basic. Mi potete aiutare?
Da inserire in un form in cui č presente un controllo winsock (e
nient'altro).
Per spedire piů file, inserirli tutti in una stringa separati da vbcrlf
La procedura l'ho presa da internet, e riadattata (molto poco) alle mie
esigenze, sfortunatamente non ricordo chi č l'autore. 
Option Explicit
Private Const SmtpPort = 25
Private Enum SMTP_State     'Stato comunicazione con il server smtp
    MAIL_CONNECT
    MAIL_HELO
    MAIL_FROM
    MAIL_RCPTTO
    MAIL_DATA
    MAIL_DOT
    MAIL_QUIT
End Enum
Private m_State As SMTP_State               'Stato di invio, indica i
vari stati di invio iniziati
Private m_strEncodedFiles As String         'Stringa di invio
Dim Host As String
Dim MailMit As String
Dim MailDest As String
Dim MailTesto As String
Dim MailSubject As String
Dim ListAttach() As String
Dim ProgressInvio As String
Public Event Stato(descStato As String)
Property Let Mail_HostSmtp(Smtp As String)
'************************************
    Host = Smtp
End Property
Property Let Mail_Mittente(Mitt As String)
'************************************
    MailMit = Mitt
End Property
Property Let Mail_Destinatario(Dest As String)
'****************************************
    MailDest = Dest
End Property
Property Let Mail_Corpo(Corpo As String)
'*************************************
    MailTesto = Corpo
End Property
Property Let Mail_Oggetto(Subject As String)
'***************************************
    MailSubject = Subject
End Property
Property Let Mail_Attach(FileAtt As String)
'*************************************
    ListAttach = Split(FileAtt, vbCrLf)
End Property
Property Get Mail_StatoInvio() As String
'**********************************
    Mail_StatoInvio = ProgressInvio
End Property
Public Sub Send()
'****************
'Invio mail
Dim NumFileAttach As Integer        'Contatore file in attach
 
    ProgressInvio = "Start"
    On Local Error Resume Next
    m_strEncodedFiles = ""
 
    NumFileAttach = UBound(ListAttach)
 
    If Err.Number = 0 Then
 
        For NumFileAttach = 0 To UBound(ListAttach)    'Allego tutti i
file selezionati
            m_strEncodedFiles = m_strEncodedFiles &
UUEncodeFile(ListAttach(NumFileAttach)) & vbCrLf      'Stringa di
attach, di tutti i file
        Next NumFileAttach
 
    End If
 
    Winsock1.Connect Trim$(Host), SmtpPort      'Mi connetto al server
dell'invio posta
    m_State = MAIL_CONNECT                      'Stato di connessione
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'*********************************************************
'Lettura risposte del server
Dim strServerResponse   As String
Dim strResponseCode     As String
Dim strDataToSend       As String
 
Dim varLines    As Variant
Dim varLine     As Variant
Dim strMessage  As String
 
    On Local Error GoTo Errore_Invio
 
    Winsock1.GetData strServerResponse      'Lettura dei dati inviati
dal server
 
    Debug.Print strServerResponse
 
    'Get server response code (first three symbols)
    strResponseCode = Left(strServerResponse, 3)    'Codice inviato dal
server, indica lo stato di trasmsissione
 
    'Only these three codes tell us that previous
    'command accepted successfully and we can go on
 
    If strResponseCode = "250" Or _
       strResponseCode = "220" Or _
       strResponseCode = "354" Then         'Riposte server corrette
 
        Select Case m_State             'Stato d'invio
 
            Case MAIL_CONNECT           'Connesso
            '----------------
 
                ProgressInvio = "Helo"
 
                m_State = MAIL_HELO             'Nuovo stato connesione,
presentazione
 
                strDataToSend = Trim$(MailMit)    'Indirizzo del
mittente
                strDataToSend = Left$(strDataToSend, InStr(1,
strDataToSend, "@") - 1)      'Tolgo il dominio dall'indirizzo del
mittente
                'Send HELO command to the server
                Winsock1.SendData "HELO " & strDataToSend & vbCrLf     
'Mi presento al server
 
                Debug.Print "HELO " & strDataToSend
 
            Case MAIL_HELO              'Presentazione
            '-------------
 
                ProgressInvio = "From"
                m_State = MAIL_FROM         'Indirizzo del mittente
 
                'Send MAIL FROM command to the server
                Winsock1.SendData "MAIL FROM:" & Trim$(MailMit) &
vbCrLf      'Passo il mittente al server
 
                Debug.Print "MAIL FROM:" & Trim$(MailMit)
 
            Case MAIL_FROM          'Mittente
            '-------------
 
                ProgressInvio = "RCPTTO"
                m_State = MAIL_RCPTTO       'segnalazione destinatario
 
                Winsock1.SendData "RCPT TO:" & Trim$(MailDest) &
vbCrLf     'destinatario della mail
 
                Debug.Print "RCPT TO:" & Trim$(MailDest)
 
            Case MAIL_RCPTTO        'Destinatario
            '---------------
 
                ProgressInvio = "DATA"
                m_State = MAIL_DATA         'Invio dati mail
 
                Winsock1.SendData "DATA" & vbCrLf       'Inizio invio
dati mail al server
 
                Debug.Print "DATA"
 
            Case MAIL_DATA          'Inizio invii dati
            '-------------
 
                ProgressInvio = "DOT"
                m_State = MAIL_DOT          'Termine Invio
 
                'So now we are sending a message body
                'Each line of text must be completed with
                'linefeed symbol (Chr$(10) or vbLf) not with vbCrLf
 
                'Send Subject line
                Winsock1.SendData "Subject:" & MailSubject & vbLf &
vbCrLf       'Soggetto della mail
 
                Debug.Print "Subject:" & MailSubject
 
                'Add atacchments
                strMessage = MailTesto & vbCrLf & vbCrLf &
m_strEncodedFiles   'Messaggio mail con attsch
 
                m_strEncodedFiles = ""              'Libero la memoria
ormai inutile
                'Parse message to get lines (for VB6 only)
                varLines = Split(strMessage, vbCrLf)        'Spezzo il
messaggio nelle varie righe che lo formano
 
                strMessage = ""         'Pulizia memoria
 
                For Each varLine In varLines                'Invio tutte
le parti del messaggio
                    Winsock1.SendData CStr(varLine) & vbLf  'Invio riga
messaggio
 
                    Debug.Print CStr(varLine)
                Next
 
                Winsock1.SendData "." & vbCrLf      'invio simbilo di
messaggio completato (DOT SIMBOL)
 
                Debug.Print "."
 
            Case MAIL_DOT           'Uscita invio messaggio
            '------------
 
                ProgressInvio = "Quit"
                m_State = MAIL_QUIT     'Uscita trassmisione
 
                Winsock1.SendData "QUIT" & vbCrLf       'Fine
trasmisione
 
                Debug.Print "QUIT"
 
            Case MAIL_QUIT      'Uscita invio
            '-------------
 
                Winsock1.Close      'Chiusura connessione
 
        End Select
 
    Else
 
        'If we are here server replied with
        'unacceptable respose code therefore we need
        'close connection and inform user about problem
 
        Winsock1.Close      'Chiusura connessione
 
        If Not m_State = MAIL_QUIT Then     'Invio fallito
            ProgressInvio = "02 SMTP Error: " & strServerResponse
        Else            'Invio riuscito
            ProgressInvio = "01 Message sent successfuly."
        End If
 
    End If
 
    Exit Sub
 
Errore_Invio:
'------------
    ProgressInvio = "02 - Errore " & Err.Number & " - " &
Err.Description
 
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As
String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As
String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'*****************************************************************************************************************************************************************************************************
 
    ProgressInvio = "02 Winsock Error number " & Number & " - " &
Description
End Sub
Private Function UUEncodeFile(strFilePath As String) As String
'************************************************************
'codifica file per spedizione
'StrFilpath : percorso e nome file attach
Dim intFile         As Integer      'file handler - numero del file
Dim lFileSize       As Long         'size of the file - dimensione del
file
Dim strFileName     As String       'name of the file - nome del file
Dim strFileData     As String       'file data chunk - Stringa per la
lettura del file
Dim lEncodedLines   As Long         'number of encoded lines - numero di
linee della codifica
Dim strTempLine     As String       'temporary string - stringa di
appoggio
Dim i               As Long         'loop counter - contatore
Dim j               As Integer      'loop counter - contatore
Dim strResult       As String       'Decodifica del file
 
    On Local Error GoTo Errore_Decodifica
 
    'Nome file
    strFileName = Mid$(strFilePath, InStrRev(strFilePath, "\") + 1)
 
    'Insert first marker: "begin 664 ..."
    'Nome codifica dati, e nome file + file linea
    strResult = "begin 664 " + strFileName + vbLf
 
    'Dimensione del file
    lFileSize = FileLen(strFilePath)
    lEncodedLines = lFileSize \ 45 + 1      'Il file di spedizione deve
contenere righe di 45 caratteri
 
    'Prepare buffer to retrieve data from
    'the file by 45 symbols chunks
    strFileData = Space(45)                 'stringa di lettura del file
da spedire
 
    intFile = FreeFile
 
    Open strFilePath For Binary As intFile          'Lettura file attach
        For i = 1 To lEncodedLines                  'Genero le righe del
file di spedizione
            'Read file data by 45-bytes cnunks
 
            If i = lEncodedLines Then
                'Last line of encoded data often is not
                'equal to 45, therefore we need to change
                'size of the buffer
                strFileData = Space(lFileSize Mod 45)       'Ridemsiono
la stringa con la lunghezza degli ultimi byte da leggere
            End If
 
            'Retrieve data chunk from file to the buffer
            Get intFile, , strFileData                              '45
byte che formano la riga
 
            'Add first symbol to encoded string that informs
            'about quantity of symbols in encoded string.
            'More often "M" symbol is used.
            strTempLine = Chr(Len(strFileData) + 32)        'Indica da
quanti caratteri č formata la stringa
                                                            'Stringa di
salvataggio conversione
 
            If i = lEncodedLines And (Len(strFileData) Mod 3) Then
                'If the last line is processed and length of
                'source data is not a number divisible by 3, add one or
two
                'blankspace symbols
                strFileData = strFileData + Space(3 - (Len(strFileData)
Mod 3))     'NEll'ultima riga il numero di byte deve essere divisibile
per 3, vista la decodifica
            End If
 
            For j = 1 To Len(strFileData) Step 3        'Conversione
stringa letta
                'Breake each 3 (8-bits) bytes to 4 (6-bits) bytes
 
                '1 byte
                strTempLine = strTempLine + Chr(Asc(Mid(strFileData, j,
1)) \ 4 + 32)
                '2 byte
                strTempLine = strTempLine + Chr((Asc(Mid(strFileData, j,
1)) Mod 4) * 16 _
                               + Asc(Mid(strFileData, j + 1, 1)) \ 16 +
32)
                '3 byte
                strTempLine = strTempLine + Chr((Asc(Mid(strFileData, j
+ 1, 1)) Mod 16) * 4 _
                               + Asc(Mid(strFileData, j + 2, 1)) \ 64 +
32)
                '4 byte
                strTempLine = strTempLine + Chr(Asc(Mid(strFileData, j +
2, 1)) Mod 64 + 32)
            Next j
            'trasforma " " in "`"
            strTempLine = Replace(strTempLine, " ", "`")
            'Aggiungo la stringa trasformata alla stringa di invio
            strResult = strResult + strTempLine + vbLf         
'aggiungo nche il fine linea
            'reset line buffer
            strTempLine = ""        'Cancellazione stringa temporanea
per la conversione
        Next i
    Close intFile
    'Fine stringa di invio
    strResult = strResult & "`" & vbLf + "end" + vbLf       'Dati di
chiusura della stringa di spedizione
    'Stringa di invio finale
    UUEncodeFile = strResult
 
    Exit Function
 
Errore_Decodifica:
'-----------------
 
    ProgressInvio = "02 - Errore " & Err.Number & " - " &
Err.Description
 
End Function

| Studiati la RFC riguardante SMTP e poi studiati Winsock. Se vuoi altre
| informazioni scrivimi in e-mail.
ehmmmm RFC? Cioč?

Nel 99 ho usato un semplice tool freeware che puoi chiamare
da shell.
Da VB creavo un semplice file script con i parametri, gli
allegati, ecc.., poi chiamavo l'eseguibile esterno e tutto
andava benissimo. Dopo l'invio, si legge nel log (.txt) il
risultato dell'invio.
Si chiamava EMWAC, ma non ricordo da dove si scarica.
Ciao
Alberto
* Sent from AltaVista 
http://www.altavista.com
 Where you can also find related Web Pages, Images, Audios, Videos, News, and Shopping.  Smart is Beautiful

Ho scritto una bella cavolata.....
Il tool non è Emwac (che è invece un mail server...), bensì
BLAT.


 una applicazione in visual basic. Mi potete aiutare?


il codice che mi hai dato è molto interessante e funziona. Ho però questo
problema: il server di posta in uscita mi spedisce il seguente errore:
    553 Authentication is required to send mail as 
steo...@virgilio.it
Mi puoi aiutare?

 ha scritto nel messaggio
news:8oilup$1vq$1...@nslave2.tin.it...


ritiro tutto quello che ho detto, sbagliavo indirizzo.
Ho però un'altra domanda: non riesco a mettere l'attachment, invece che
"encodarlo" viene inserito nel testo del messaggio. Come devo fare?
"hey" <h...@hey.hey> ha scritto nel messaggio
news:8oj8vp$4q8m$1...@stargate1.inet.it...


Penso di aver trovato il problema:
la dichiarazione dell'att. inizia con
    begin 664 etc.
    ......
    end
Ho provato a cambiare questa frase e continua a prenderlo come una parte del
testo e non come att o come errore di sintassi. Secondo me questa
inestazione è sbagliata, qualcuno sa come si scrive?

 "encodarlo" viene inserito nel testo del messaggio. Come devo fare?
Non so cosa dirti, sinceramente io uso questo codice (ho fatto un
cut&paste spudorato) e finora non mi ha dato problemi. Il file viene
ricevuto come allegato in modo corretto.
Se non riesci a risolvere fammi sapere che ti invio la form che
utilizzo, con un esempio funzionante
Ciao
	  :-) Hd (-:
-^- Verso l'infinito e oltre -^-

 utilizzo, con un esempio funzionante
puoi spedirlo anche a me ? indirizzo qui sotto.
grazie mille e ciao, a.
--
andrea....@tin.it

Ho l'impressione che il server di posta non riconosca l'uuencode, comunque
se vuoi spedirmi il form mi fai un grande piacere, cosě almeno mi rendo
conto di quanto sono addormentato.
Il mio indirizzo e-mail č: 
steo...@virgilio.it