Envoi d'un email, application se fige pendant quelques instants [Résolu]

Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 30 déc. 2016 à 11:32 - Dernière réponse : Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention
- 3 janv. 2017 à 09:45
Bonjour,
dans mon application j'ai ajouté une partie qui me permet d'envoyer un message électronique avec une pièce jointe (taille maximale 15 Mo), dans cette partie il y a aucun problème tout fonction à la perfection, sauf qu'il y a une chose qui me dérange
quand j'envoi un message, l'application se fige pendant quelques instants (en fonction de la taille de la pièce jointe), voici le code que j'utilise :
Imports System.Net.Mail
Public Class Form1
Dim Compte As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ComboBox1.Text = "Gmail" Then 'le type de votre compte
Compte = "smtp.gmail.com"
End If
If ComboBox1.Text = "Hotmail" Then 'le type de votre compte
Compte = "smtp.live.com"
End If
If ComboBox1.Text = "Yahoo" Then 'le type de votre compte
Compte = "smtp.mail.yahoo.fr"
End If
Dim Mail As New MailMessage()
Dim Smtp As New SmtpClient(Compte)
If Not TextBoxFichier.Text = "" Then 'Chemin d'accès de la pièce jointe
Mail.Attachments.Add(New Attachment(TextBoxFichier.Text))
End If
Mail.From = New MailAddress(TextBoxEmail.Text) 'Votre email
Mail.To.Add(TextBoxEmailDestinateur.Text) 'email de celui a qui le message électronique sera envoyé
Mail.Subject = (TextBoxSujet.Text) 'Objet du message
Mail.Body = (TextBoxMessages.Text) 'Texte du message
Smtp.Port = ("587")
Smtp.Credentials = New System.Net.NetworkCredential(TextBoxEmail.Text, TextBoxMotdepasse.Text)
Smtp.EnableSsl = True
Try
Smtp.Send(Mail)
MessageBox.Show("Votre email a bien été envoyé", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show("le message n'a pas été envoyé veuillez réessayer plus tard", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End Sub
End Class

j'ai essayé d'utiliser un
BackgroundWorker 
comme je l'ai utilisé dans un de mes anciens postes
http://codes-sources.commentcamarche.net/forum/affich-10070913-message-anime-pendant-qu-on-compte-le-nombre-de-fichier#23
Imports System.Net.Mail
Public Class Form1
Dim Compte As String
Dim Résultat As Boolean = False
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
If ComboBox1.Text = "Gmail" Then 'le type de votre compte
Compte = "smtp.gmail.com"
End If
If ComboBox1.Text = "Hotmail" Then 'le type de votre compte
Compte = "smtp.live.com"
End If
If ComboBox1.Text = "Yahoo" Then 'le type de votre compte
Compte = "smtp.mail.yahoo.fr"
End If
Dim Mail As New MailMessage()
Dim Smtp As New SmtpClient(Compte)
If Not TextBoxFichier.Text = "" Then 'Chemin d'accès de la pièce jointe
Mail.Attachments.Add(New Attachment(TextBoxFichier.Text))
End If
Mail.From = New MailAddress(TextBoxEmail.Text) 'Votre email
Mail.To.Add(TextBoxEmailDestinateur.Text) 'email de celui a qui le message électronique sera envoyé
Mail.Subject = (TextBoxSujet.Text) 'Objet du message
Mail.Body = (TextBoxMessages.Text) 'Texte du message
Smtp.Port = ("587")
Smtp.Credentials = New System.Net.NetworkCredential(TextBoxEmail.Text, TextBoxMotdepasse.Text)
Smtp.EnableSsl = True
Try
Smtp.Send(Mail)
Résultat = True
Catch ex As Exception
Résultat = False
End Try
End Sub
End Class
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
If Résultat = True Then
MessageBox.Show("Votre email a bien été envoyé", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("le message n'a pas été envoyé veuillez réessayer plus tard", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub

mais cela ne fonctionne pas (l'email n'est pas envoyer) et j'arrive pas à trouver dans quelle partie se situe le problème
je sollicite votre aide pour comprendre et régler ce problème
merci pour votre aide
Afficher la suite 

Votre réponse

15 réponses

Whismeril 11558 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 26 mai 2018 Dernière intervention - Modifié par Whismeril le 30/12/2016 à 21:35
0
Merci
Bonsoir

le mail n'est pas envoyé ou Resultat ne vaut pas True?

Parce que quoiqu'il advienne, ici
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If Résultat = True Then
            MessageBox.Show("Votre email a bien été envoyé", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            MessageBox.Show("le message n'a pas été envoyé veuillez réessayer plus tard", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

il vaudra toujours False.

La portée d'une variable s'arrête "au premier End englobant".
Exemple
Class TrucMuche
    variable Machin

    Sub Toto
        Machin 'existe et est bien celui au dessus
   En Sub

   Sub Tata
      Machin 'est toujours le même
   End Sub

End Class

Machin 'n'existe pas

Class Bidouille
     variable Machin 'a le même nom mais ce n'est pas la même




Or dans ton code Resultat est déclaré dans la Sub abonnée à DoWork, donc c'est ce Resultat là qui est renseigné.

Quand tu arrives dans celle abonnée RunWorkCompleted,
  • soit tu n'as pas mis les options comme on te l'a déjà conseillé (Strict On, Explict, ect...) et VB se dit "tiens, une variable que je ne connais pas, alors j'en crée une avec sa valeur par défaut -> False.
  • soit tu as bien mis ces options, mais tu as déclaré un second Resultat, dont la portée englobe cette sub, mais c'est l'autre qui est renseigné.


Exemple
Class TrucMuche
    variable Machin

    Sub Toto
        Machin 'existe et est bien celui au dessus
   En Sub

   Sub Tata
      variable Machin', même nom donc bloque la portée de  l'autre
      'ce Machin n'aura aucune influence sur l'autre.
   End Sub

End Class


Donc selon le cas,
  • mettre les options strict et explicit à On
  • ne déclarer qu'une seule variable par nom dans une même classe, et lui donner la portée utile.Quand j'étais petit, la mer Morte n'était que malade.

George Burns
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 31 déc. 2016 à 13:40
Bonjour Whismeril
Merci de m'avoir répondu
c'est vrai je n'ai pas utilisé
mais je croyais que si on déclare une variable en dehors d'un Sub (comme je l'ai fait) et qu'on change la valeur avec un Bouton par exemple alors la dernière valeur enregistré et celle qui a été modifié
Par exemple :
Dim Variable As Boolean = False
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Résultat =true
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Variable =true Then
MsgBox("La valeur est : True")
Else
MsgBox("La valeur est : False")
End Sub


le message qui va être affiché est
"La valeur est : True"
peut-être que je n'ai pas bien compris
Whismeril 11558 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 26 mai 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 31 déc. 2016 à 13:48
Ceci devrait fonctionner, mais tes deux codes ne sont pas dans la même classe, voir mon premier exemple et le développement de VB95.

Par contre là encore tu utilises un accent, et ça c'est interdit.
Il y a beaucoup de choses conseillées, d'autres déconseillées, mais les accents c'est interdit.
Commenter la réponse de Whismeril
vb95 1568 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention - 31 déc. 2016 à 00:57
0
Merci
bonsoir Karin.code

bonnes fêtes tout d'abord
Ensuite plusieurs points
1) Pourquoi les 2 Sub du BackGroundWorker ne sont pas dans la même class

Imports System.Net.Mail
Public Class Form1
Dim Compte As String
Dim Résultat As Boolean = False

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
If ComboBox1.Text = "Gmail" Then 'le type de votre compte
Compte = "smtp.gmail.com"
End If
If ComboBox1.Text = "Hotmail" Then 'le type de votre compte
' etc ...................
End Sub
'End Class ' à enlever

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
If Résultat = True Then
MessageBox.Show("Votre email a bien été envoyé", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("le message n'a pas été envoyé veuillez réessayer plus tard", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub

End Class


2)

If ComboBox1.Text = "Gmail" Then 'le type de votre compte
Compte = "smtp.gmail.com"

tu utilises 3 fois Combobox1.Text
Crées une variable String puis sers en toi

dim FournisseurMessagerie as string = ComboBox1.Text
If FournisseurMessagerie = "Gmail" Then 'le type de votre compte
Compte = "smtp.gmail.com"
' etc ........

Les contrôles ne servent qu'à l'affichage de données ! Créer les variables adéquates pour insérer dans le code leurs valeurs

3) Regarde dans le cours VB Net que l'on t'a suggéré à plusieurs reprises ! Tu verras à la rubrique sur les BackGroundWorker que l'on peut récupérer avec e.error dans BackgroundWorker1_RunWorkerCompleted le fait que le tâche en BackGround se soit déroulée correctement ou non ! De ce fait la variable Resultat devient inutile

4) Tout n'est pas forcement à mettre dans le BackGround !
L'envoi du mail ne concerne réellement que l'instruction

Dim Mail As New MailMessage()
Dim Smtp As New SmtpClient(Compte)
''If Not TextBoxFichier.Text = "" Then 'Chemin d'accès de la pièce jointe
' à supprimer la ligne en vert au dessus ( faire le test avant le BackGrounWorker;DoWork
Mail.Attachments.Add(New Attachment(TextBoxFichier.Text))
End If
Mail.From = New MailAddress(TextBoxEmail.Text) 'Votre email
Mail.To.Add(TextBoxEmailDestinateur.Text) 'email de celui a qui le message électronique sera envoyé
Mail.Subject = (TextBoxSujet.Text) 'Objet du message
Mail.Body = (TextBoxMessages.Text) 'Texte du message
Smtp.Port = ("587")
Smtp.Credentials = New System.Net.NetworkCredential(TextBoxEmail.Text, TextBoxMotdepasse.Text)
Smtp.EnableSsl = True
Try
Smtp.Send(Mail) ' l'envoi du mail est ici
Catch ex As Exception
End Try


5) Sers toi de With ........End With

Smtp.Port = ("587")
Smtp.Credentials = New System.Net.NetworkCredential(TextBoxEmail.Text, TextBoxMotdepasse.Text)
Smtp.EnableSsl = True


With Smtp
.Port = ("587")
.Credentials = New System.Net.NetworkCredential(TextBoxEmail.Text, TextBoxMotdepasse.Text)
.EnableSsl = True
End With

Tu n'écris qu'une fois le mot Smtp

bonne programmation et bon réveillon
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > Whismeril 11558 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 26 mai 2018 Dernière intervention - 3 janv. 2017 à 09:44
Bonjour Whismeril
maintenant que tu le dis, les sites envoie des mails de confirmation pour savoir si l'email existe ou non, si il n'existe pas ils te disent que l'email n'est pas valide
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1568 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention - 3 janv. 2017 à 09:43
Bonjour Vb95,
c'est vrai si l'email n'est pas valide alors le mail ne sera pas envoyé et un message s'affiche me disant :
Erreur durant l'envoi du mail
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 31 déc. 2016 à 13:41
Bonjour VB95
Merci de m'avoir répondu
Bonnes fêtes à toi aussi
Pourquoi les 2 Sub du BackGroundWorker ne sont pas dans la même class
c'est vrai j'ai fait une fois quand j'ai copié le code partie par partie
tu utilises 3 fois Combobox1.Text
Crées une variable String puis sers en toi

tu me l'as dit tellement de fois désolé, je vais faire attention dès maintenant
je crois avoir corrigé les erreurs que tu a mentionné mais j'ai toujours une erreur qui s'affiche
"L'hôte SMTP n'a pas été spécifié."
Dim FournisseurMessagerie As String = Form1.ComboBox1.Text
Dim Mail As New MailMessage()
Dim Smtp As New SmtpClient(Compte)
Dim Compte As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If FournisseurMessagerie = "Gmail" Then
Compte = "smtp.gmail.com"
End If
If FournisseurMessagerie = "Hotmail" Then
Compte = "smtp.live.com"
End If
If FournisseurMessagerie = "Yahoo" Then
Compte = "smtp.mail.yahoo.fr"
End If
If Not My.Settings.Fichier1 = "" Then
Mail.Attachments.Add(New Attachment(My.Settings.Fichier1))
End If
With Mail
.From = New MailAddress(My.Settings.Email)
.To.Add(My.Settings.Destinateur)
.Subject = (My.Settings.Sujet)
.Body = (My.Settings.Messages)
End With
With Smtp
.Port = ("587")
.Credentials = New System.Net.NetworkCredential(My.Settings.Email, My.Settings.MotdePasse)
.EnableSsl = True
End With
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Smtp.Send(Mail)
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MessageBox.Show("Votre email a bien été envoyé", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
vb95 1568 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 31 déc. 2016 à 14:10
Bonjour Whismeril et Karin.code

Toujours aussi pro et pertinent dans tes conseils Whismeril ! Bravo et bon réveillon

Karin.code : tu définis la valeur de Smtp
Dim Smtp As New SmtpClient(Compte)
avant d'avoir donné une valeur adéquate à la variable compte
De plus tu te sers de la variable compte avant de l'avoir dimensionnée avec Dim

Dim Smtp As New SmtpClient(Compte)
Dim Compte As String


Gères aussi l'erreur pendant le background

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
If (e.Error Is Nothing) = True Then
MessageBox.Show("Votre email a bien été envoyé", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("Erruer durant l'envoi du mail", "Information", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End if
End Sub

Sur ce bon réveillon aussi à toi
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1568 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention - 31 déc. 2016 à 15:08
Salut vb95
merci maintenant ça fonctionne très bien
juste une dernière question c'est hors sujet, est-ce que il y a une méthode pour vérifier si un email est valide ou non, je veux dire par là vérifier si l'email existe et son mot de passe et juste, j'ai trouvé que ce Code :
Public Function ValidationEmail(ByVal AddressEmail) As Boolean
Dim VEmail As New Regex("([\w-+]+(?:\.[\w-+]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7})")
If VEmail.IsMatch(AddressEmail) Then
Return True
Else
Return False
End If
End Function

mais il ne vérifie que si l'email ne contient pas des caractères non autorisé
Commenter la réponse de vb95
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 3 janv. 2017 à 09:45
0
Merci
Bonjour Vb95 et Whismeril
Merci pour vos conseils et votre aide
Commenter la réponse de Karin.code

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.