IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

[BCB6]TIdSMTP - Erreur au second mail.


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 149
    Par défaut [BCB6]TIdSMTP - Erreur au second mail.
    Bonsoir tout le monde.
    J'ai un petit problème pour envoyer mes emails.
    En effet, lorsque j'envoie un email, tout s'exécute correctement puis au moment t'en relancé un autre, je suis confronté à cette erreur:

    Le projet Dapm.exe a provoqué une classe d'exeption EAccessViolation avec le message 'Violation d'accès à l'adresse 00401D66 dans le module 'Dapm.exe'. Lecture de l'adresse 00000000'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    J'ai pourtant réalisé la fonction suivante en m'appuyant sur les codes que j'ai pu trouvé sur le forum:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    //Fonction qui va envoyer un email.
    void __fastcall TForm1::EnvoieEmail(AnsiString SujetMail, AnsiString Textemail, char HostMail[50], char PortMail[50], char IdentifiantMail[50], char MdpMail[50], char EmeteurMail[50], char RecepteurMail[50])
    {
            //Si la connexion est ouverte, on ferme la connexion du composant.
            if(Form1->IdSMTP1->Connected()) { Form1->IdSMTP1->Disconnect(); }
     
            //Si la connexion est fermé.
            if(!Form1->IdSMTP1->Connected())
            {
                    //Déclaration aux composant des données de connexions.
                    Form1->IdSMTP1->Host = HostMail;
                    Form1->IdSMTP1->Port = atoi(PortMail);
                    Form1->IdSMTP1->UserId = IdentifiantMail;
                    Form1->IdSMTP1->Password = MdpMail;
     
                    //Si le nom d'utilisateur et le password ne sont pas valide.
                    if((Form1->IdSMTP1->UserId.Trim().Length() == 0) && (Form1->IdSMTP1->Password.Trim().Length() == 0))
                    {
                            //Utilisera pas l'authentification.
                            Form1->IdSMTP1->AuthenticationType = atNone;
                    }
                    else
                    {
                            //Utilisera l'authentification.
                            Form1->IdSMTP1->AuthenticationType = atLogin;
                    }
     
                    //Lance la connexion.
                    Form1->IdSMTP1->Connect();
            }
     
            //Si l'authentification est correct.
            if(Form1->IdSMTP1->Authenticate())
            {
                    //Charge dans le composant IdMessageMail les données nécéssaires.
                    Form1->IdMessageMail->From->Address = EmeteurMail;
                    Form1->IdMessageMail->From->Name = Form1->NomLogiciel + Form1->VersionLogiciel;
                    Form1->IdMessageMail->ReplyTo->EMailAddresses = EmeteurMail;
                    Form1->IdMessageMail->Recipients->Add();
                    Form1->IdMessageMail->Recipients->EMailAddresses = RecepteurMail;
                    Form1->IdMessageMail->Recipients = Form1->IdMessageMail->Recipients;
                    Form1->IdMessageMail->Subject = SujetMail;
                    Form1->IdMessageMail->Body->Add(Textemail);
                    Form1->IdSMTP1->Send(Form1->IdMessageMail);
                    Form1->IdMessageMail->Clear();
            }
            else
            {
                    //En cas déchec d'authentification.
                    ShowMessage("Erreur d'authentification!");
            }
     
            //Déconnecte le composant IdSMTP1.
            Form1->IdSMTP1->Disconnect();
     
            //Netoie les données du composant.
            Form1->IdSMTP1->Free();
     
            //Netoie les données de IdMessageMail.
            Form1->IdMessageMail->Free();
    }
    Je vous met aussi le code qui appel la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    //L'utilisateur effectue un jet de dès et envoie le résultat par email.
     
    void __fastcall TForm1::BitBtnAleaMailClick(TObject *Sender)
    {
            //Déclare une variable pour y placé le résultat aléatoire.
            int ValAlea;
     
            //Envoie pour calcul aléatoire le contenu de sélection de dès.
            //Minima 1 et maxima la valeur du ComboBoxDes.
            ValAlea = JetDeDes(1, StrToInt(ComboBoxDes->Text));
     
            //Affiche dans LblResultat le résultat seul du dès.
            LblResultat->Caption = "Résultat du jet: " + IntToStr(ValAlea);
     
            //Si le champ action est vide
            if(EditAction->Text.IsEmpty())
            {
                    //Affiche dans RichEditLog le résultat du dès sans le contenu de EditAction.
                    RichEditLog->Lines->Add("Vous avez sélectionné le dès " + ComboBoxDes->Text + ".");
                    RichEditLog->Lines->Add("Résultat: " + IntToStr(ValAlea));
                    RichEditLog->Lines->Add("");
            }
            else
            {
                    //Affiche dans RichEditLog le résultat du dès et de l'action avec le contenu de EditAction.
                    RichEditLog->Lines->Add("Vous avez sélectionné le dès " + ComboBoxDes->Text + ".");
                    RichEditLog->Lines->Add("Action: " + EditAction->Text + ".");
                    RichEditLog->Lines->Add("Résultat: " + IntToStr(ValAlea));
                    RichEditLog->Lines->Add("");
            }
     
    /*      ************************************************************************************
                    Initialisation des éléments nécéssaires à l'envoie d'email.
                    On utilisera IdSMTP -> Indy - Clients qui permet l'envoie d'email.
                    On utilisera IdMessage -> Indy - Divers qui permet l'écriture du message à envoyer.
     
                    /!\ Cette section est isolée et soumise à un maintient permanent du code.
            ************************************************************************************    */
     
            //Déclaration des variables nécéssaires à la récupération des données nécéssaires à l'envoie d'email.
            char MailHost[50], MailPort[50], MailIdentifiant[50], MailMdp[50], MailEmeteur[50], MailRecepteur[50];
            char CheminPreferenceIni[100];
     
            //Regarde dans Préférence.ini les données et les affectes aux variables.
            AnsiToChar(CheminPreferenceIni, DestPreferenceIni);
     
            GetPrivateProfileString("Mail", "Host", "@", MailHost, sizeof(MailHost), CheminPreferenceIni);
            GetPrivateProfileString("Mail", "Port", "@", MailPort, sizeof(MailPort), CheminPreferenceIni);
            GetPrivateProfileString("Mail", "Identifiant", "@", MailIdentifiant, sizeof(MailIdentifiant), CheminPreferenceIni);
            GetPrivateProfileString("Mail", "MotDePasse", "@", MailMdp, sizeof(MailMdp), CheminPreferenceIni);
            GetPrivateProfileString("Mail", "EmailEnvoie", "@", MailEmeteur, sizeof(MailEmeteur), CheminPreferenceIni);
            GetPrivateProfileString("Mail", "Emaildestinataire", "@", MailRecepteur, sizeof(MailRecepteur), CheminPreferenceIni);
     
            //On Crée le texte qui sera envoyer par email.
            AnsiString TexteMail, SujetMail;
     
            //Sujet du mail.
            SujetMail = NomLogiciel + " - Valeur aléatoire transmise par un joueur.";
     
            //Message de l'email.
            TexteMail = "Bonjour, \r";
            TexteMail += "Ceci est un email qui est envoyer automatiquement par le logiciel " + NomLogiciel + " version " + VersionLogiciel + ". \r";
            TexteMail += "Une personne à réaliser un jet de dès: \r\r";
     
            //Si le champ action est vide
            if(EditAction->Text.IsEmpty())
            {
                    //Affiche dans le mail le résultat du dès sans le contenu de EditAction.
                    TexteMail += "Sélection du dès " + ComboBoxDes->Text + ".\r";
                    TexteMail += "Résultat: " + IntToStr(ValAlea) + ".";
            }
            else
            {
                    //Affiche dans RichEditLog le résultat du dès et de l'action avec le contenu de EditAction.
                    TexteMail += "Sélection du dès " + ComboBoxDes->Text + ".\r";
                    TexteMail += "Action: " + EditAction->Text + ".";
                    TexteMail += "Résultat: " + IntToStr(ValAlea) + ".";
            }
     
            //On envoie vers la fonction l'autorisation de lavcer l'email.
            //EnvoieEmail(AnsiString SujetMail, AnsiString Textemail, char HostMail, char PortMail, char IdentifiantMail, char MdpMail, char EmeteurMail, char RecepteurMail)
            EnvoieEmail(SujetMail, TexteMail, MailHost, MailPort, MailIdentifiant, MailMdp, MailEmeteur, MailRecepteur);
    }
    //---------------------------------------------------------------------------
    Auriez vous une solution à me proposer pour rectifier ce problème s'il vous plait ?
    Je vous remercie par avance.
    Cordialement.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 149
    Par défaut
    Je reprend mon post car j'ai un nouvel élément de réponse.
    En effet, lors du plantage de mon application, je pointeur s'errête sur la ligne en rouge de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Fonction qui va envoyer un email.
    void __fastcall TForm1::EnvoieEmail(AnsiString SujetMail, AnsiString Textemail, char HostMail[50], char PortMail[50], char IdentifiantMail[50], char MdpMail[50], char EmeteurMail[50], char RecepteurMail[50])
    {
            //Si la connexion est ouverte, on ferme la connexion du composant.
            if(Form1->IdSMTP1->Connected()) { Form1->IdSMTP1->Disconnect(); }
    
            //Si la connexion est fermé.
            if(!Form1->IdSMTP1->Connected())
            {
    
            //La suite que je n'ai pas reproduit ici.
    Si je laisse ma souris sur l'erreur, j'obtiens un message me disant que je suis sur l'adresse 00000.
    Pourquoi ?
    J'espère trouvé une réponse car la je ne sait plus trop.
    Par hasard cela ne serais pas en fin de fonction les lignes suivante qui métrais le bazar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            //Déconnecte le composant IdSMTP1.
            Form1->IdSMTP1->Disconnect();
     
            //Netoie les données du composant.
            Form1->IdSMTP1->Free();
     
            //Netoie les données de IdMessageMail.
            Form1->IdMessageMail->Free();
    }
    Cordialement.

  3. #3
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    le disconnect ne peut pas mettre le composant à NULL, par contre les Free c'est possible, je ne connait pas ces fonctions, et je ne les ai pas trouvé dans l'aide pour savoir ce qu'elles faisaient

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 149
    Par défaut
    Ce que j'ai fait pour contourné le problème c'est de mettre en commentaire les deux lignes free().

    Dans ces cas la effectivement on peut enchainer les mails toutefois j'aimerais mieux comprendre pour quel raison elles ont été utilisé dans l'exemple fournit ici: http://www.developpez.net/forums/showthread.php?t=4112

    Si quelqu'un peut m'en dire plus cela serais un plus je pense pour la compréhension du code et éventuellement contourné l'erreur via un try / catch.
    Cordialement.

Discussions similaires

  1. [PHPMailer] Erreur envoi de mail
    Par TiNoUcHe dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 17/04/2008, 17h56
  2. Outils de reporting des erreurs systemes par mails multiplateformes ?
    Par akoustics dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 17/04/2007, 13h18
  3. [VB6]erreur d'envoie mail, pourquoi??
    Par riesseg dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/05/2006, 14h43
  4. [TIdSMTP] Envoi d'un mail avec authentification ?
    Par BACUS dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/06/2004, 16h18
  5. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo