basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008
-
13 janv. 2008 à 15:43
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
15 janv. 2008 à 05:52
Bonjour,
je viens de recuperer un code de vbfrance qui permet d'envoyer des emails grace à winsok et qui marche avec quelques smtp uniquement, j'ai cherché à joindre une pièce jointe et j'ai adapté un code de vbfrance aussi mais il n y a aucune pièce jointe lors de la réception de l'email, voici le code avec le module de jointure:
Code:
Dim Etape As Integer
Dim Erreur As Boolean
Private Sub Command1_Click()
piece_jointe.Show
End Sub
Private Sub Command2_Click()
Dim Ret
Dim temp As Retour
Erreur = False
MousePointer = fmMousePointerAppStarting
temp = Vérification_Champs
If temp.valeur = False Then 'Erreur
Ret = MsgBox(temp.libelle, vbCritical, "Erreur")
MousePointer = fmMousePointerDefault
Else 'On met en forme les données
Etape = 0
If Not W.State = 0 Then W.Close
DoEvents
'prepare les fichiers joints'
For i = 0 To piece_jointe.lstAttachments.ListCount - 1
piece_jointe.lstAttachments.ListIndex = i
m_strEncodedFiles = m_strEncodedFiles & _
UUEncodeFile(piece_jointe.lstAttachments.Text) & vbCrLf
Next i
W.RemoteHost = Text_Serveur.Text
W.Connect
End If
End Sub
Private Sub ferm_Click()
Unload Me
End Sub
Private Sub Form_Load()
Join.Visible = False
Label2.Visible = False
W.RemotePort = 25
'W.LocalPort = 1003
W.LocalPort = 0
Bar.max = 60
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Form1.Command14.Visible = True Then
Form1.Command14.Visible = False
Form1.Command12.Visible = True
'Form1.Command12.Value = True
Form1.raff_aff.Enabled = False
Form1.acti_aff.Enabled = True
Form1.Adodc1.Visible = True
Form1.DataGrid1.Visible = True
Unload Me
Else
Unload Me
End If
End Sub
Private Sub W_DataArrival(ByVal bytesTotal As Long)
Dim Temp_Recep, Temp_Envoi As String
Dim Ret
W.GetData Temp_Recep, vbString
Select Case Etape
Case 0
If Recup(Temp_Recep, 220) Then
'''''''''''' Recup du nom du serveur pour la commande "HELO {Nom du serveur}"
Temp_Envoi = "HELO " & Text_Serveur
Envoyer (Temp_Envoi)
Else
MsgBox ("Problème lors de la Connexion" & vbCrLf & Temp_Recep)
MousePointer = fmMousePointerDefault
End If
Case 1 'On est connecté et on a envoyer "HELO {Nom du serveur}"
If Recup(Temp_Recep, 250) Then
'''''''''''' Le Helo est bien pris en compte et on peux commencer à envoyer...
Temp_Envoi = "MAIL FROM: " & "<" & Text_Mail_Emet & ">"
Envoyer (Temp_Envoi)
Else
'''''''''''' Le HELO est rejeté
MsgBox ("Problème lors de la réponse au HELO" & vbCrLf & Temp_Recep)
MousePointer = fmMousePointerDefault
End If
Case 2
If Recup(Temp_Recep, 250) Then
'''''''''''' Le MAIL FROM: est accepté
Temp_Envoi = "RCPT TO: " & "<" & Text_Mail_Dest & ">"
Envoyer (Temp_Envoi)
Else
'''''''''''' Le MAIL FROM: n'est pas accepté
MsgBox ("Problème lors de la réponse au MAIL FROM" & vbCrLf & Temp_Recep)
MousePointer = fmMousePointerDefault
End If
Case 3
If Recup(Temp_Recep, 250) Then
'''''''''''' Le RCPT est accepté, on a fait le plus dur ;)
Temp_Envoi = "DATA"
Envoyer (Temp_Envoi)
Else
'''''''''''' Le serveur n'est pas open relay ou alors le destinataire est inconnu
MsgBox ("Problème lors de la réponse au RCPT TO" & vbCrLf & Temp_Recep)
MousePointer = fmMousePointerDefault
End If
Case 4
If Recup(Temp_Recep, 354) Then
Temp_Envoi = ""
'''''''''''' Remplir les champs correspondant à l'emetteur If Not Text_Nom_Emet "" Or Not Text_Mail_Emet "" Then
Temp_Envoi = "From: " If Not Text_Nom_Emet "" Then Temp_Envoi Temp_Envoi & Chr(34) & Text_Nom_Emet & Chr(34) & " " If Not Text_Mail_Emet "" Then Temp_Envoi Temp_Envoi & "<" & Text_Mail_Emet & ">"
Temp_Envoi = Temp_Envoi & vbCrLf
End If
''''''''''' Remplir les champs correspondant au destinataire
Temp_Envoi = Temp_Envoi & "To: " If Not Text_Nom_Dest "" Then Temp_Envoi Temp_Envoi & Chr(34) & Text_Nom_Dest & Chr(34) & " "
Temp_Envoi = Temp_Envoi & "<" & Text_Mail_Dest & ">" & vbCrLf
''''''''''' Ajouter le sujet du mail
Temp_Envoi = Temp_Envoi & "Subject: " & Text_Sujet & vbCrLf & vbCrLf '2 sauts de lignes pour dire que l'on passe au corps du msg
''''''''''' Ajouter le corps du message
Temp_Envoi = Temp_Envoi & Text_Msg & vbCrLf & "."
''''''''''' Ajouter les pièces jointes du message
Temp_Envoi = Temp_Envoi & m_strEncodedFiles & vbCrLf & "."
''''''''''' On Envoie tout
Envoyer (Temp_Envoi)
Else
MsgBox ("Problème lors de la réponse au DATA" & vbCrLf & Temp_Recep)
MousePointer = fmMousePointerDefault
End If
Case 5
If Not Recup(Temp_Recep, 250) Then
''''''' Si pb lors de la fin du message
MsgBox ("Problème lors de la fin du corps du message" & vbCrLf & Temp_Recep)
MousePointer = fmMousePointerDefault
Else
''''''' Le message a bien été envoyé ;) C po cool ca?
End If
Envoyer ("QUIT")
Case 6
If Recup(Temp_Recep, 221) Then
If Not Erreur Then Ret = MsgBox("Le message est bien envoyé" & vbCrLf & "avec réussite." & vbCrLf & "E-mail @nonyme ;)", vbInformation, "Fin")
Else
MsgBox ("Problème lors de la déconnexion du serveur" & vbCrLf & Temp_Recep)
End If
Etape = -1
W.Close
MousePointer = fmMousePointerDefault
End Select
Etape = Etape + 1
End Sub
Private Sub W_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)
MsgBox (Description)
If W.State = 7 Then
''''''' Pour pas avoir le message MErci pour ce gentil prog....
Erreur = True
Envoyer ("quit")
DoEvents
Etape = 6
Else
W.Close
End If
MousePointer = fmMousePointerDefault
End Sub
Public Function Envoyer(temp As String)
Dim i, max, max_bar, comp_bar, delta_bar
''''''''''' on envoi les lettres une à une et en mm temps on fait progresser la barre1
max = Len(temp)
Bar.Value = Etape * 10
delta_bar = 10 / Len(temp)
For i = 1 To max Step 1
W.SendData (Mid(temp, i, 1))
Bar.Value = Bar.Value + delta_bar
Next i
W.SendData (vbCrLf)
End Function
Public Function UUEncodeFile(strFilePath As String) As String
Dim intFile As Integer 'file handler
Dim intTempFile As Integer 'temp file
Dim lFileSize As Long 'size of the file
Dim strFileName As String 'name of the file
Dim strFileData As String 'file data chunk
Dim lEncodedLines As Long 'number of encoded lines
Dim strTempLine As String 'temporary string
Dim i As Long 'loop counter
Dim j As Integer 'loop counter
Dim strResult As String
'
'Get file name
strFileName = Mid$(strFilePath, InStrRev(strFilePath, "") + 1)
'
'Insert first marker: "begin 664 ..."
strResult = "begin 664 " + strFileName + vbLf
'
'Get file size
lFileSize = FileLen(strFilePath)
lEncodedLines = lFileSize \ 45 + 1
'
'Prepare buffer to retrieve data from
'the file by 45 symbols chunks
strFileData = Space(45)
'
intFile = FreeFile
'
Open strFilePath For Binary As intFile
For i = 1 To lEncodedLines
'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)
End If
'Retrieve data chunk from file to the buffer
Get intFile, , strFileData
'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)
'
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))
End If
For j = 1 To Len(strFileData) Step 3
'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
'replace " " with "`"
strTempLine = Replace(strTempLine, " ", "`")
'add encoded line to result buffer
strResult = strResult + strTempLine + vbLf
'reset line buffer
strTempLine = ""
Next i
Close intFile
'add the end marker
strResult = strResult & "`" & vbLf + "end" + vbLf
'asign return value
UUEncodeFile = strResult
End Function
Le savoir est la lumière de nous tous, partageons le!
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 15 janv. 2008 à 05:52
Salut
A priori, si la technique d'envoi de fichier est bonne (je ne connais pas la structure d'un mail avec pj), ça devrait fonctionné, je n'ai rien vu d'abhérent.
On n'a pas la fonction Recup, mais je suppose qu'elle fonctionne.
Le problème est-il dans l'émission ?
As-tu suivi pas à pas (avec F9/F8) un envoi ?
Est-ce que tes étapes avancent normalement ?
Juste un truc bien lourd pour pas grand chose : La fonction Envoyer qui peut se simplifier, inutile de vouloir expédier caractère par caractère (je ne pense pas que celà ait une influence)
Public Function Envoyer(temp As String)
Dim i, <strike>max</strike>, <strike>max_bar</strike>, <strike>comp_bar</strike>, <strike>delta_bar</strike>
''''''''''' on envoi les lettres une à une et en mm temps on fait progresser la barre1
Bar.Value = Etape * 10
Bar.Value = Bar.Value + (10 / Len(temp))
W.SendData temp & vbCrLf
End Function
D'autre part, fait attention de ne pas trop envoyer de vbCrLf car dans certains protocoles, un double vbCrLf signifie la fin d'envoi.
Côté réception, essaye de voir et d'identifier ce que tu reçois (*) et voir quelles sont les infos qui sont passées et celles qui ont été perdues.
(*) Dans Outlook, il faut demander à :
- clic-droit "afficher la source" dans le corps du mail si le mail est en html
- clic-droit "Options" sur l'entête du mail dans la boite de réception s'il est au format texte
Dernier conseils :
- Utilise "Option Explicit" = déclaration obligatoire des variables : C'est chiant de déclarer chaque variable, mais ça fait gagner du temps en debug et ça permet d'être rigoureux
- Lance ton appli avec Ctrl-F5 et pas F5 seul afin de découvrir les erreurs avant de tomber dessus
- Utilise la palette d'outils de MzTools (dispo ici) qui te permettra, par exemple, de lister toutes les variables qui ne servent à rien (et qui encombrent le code)
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)