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

Composants VCL Delphi Discussion :

Envoi d'un mail avec plusieurs pièces jointes


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Par défaut Envoi d'un mail avec plusieurs pièces jointes
    Bonjour à tous,

    A l'aide du code ci-dessous (issu du forum) je souhaiterai joindre au mail plusieurs fichiers.
    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
    procedure TfrmMain.btnSendClick(Sender: TObject); 
    Var MAPIMessage: TMAPIMessage; 
        MAPIFile     : TMAPIFileDesc; 
        MAPIRecip    : TMAPIRecipDesc; 
        MAPIRecips   : Array[0..1]Of TMAPIRecipDesc; 
        i            : Integer; 
        Name, tmp    : String; 
    begin 
     
    //------------------------ Définition de MAPIFile -----------------------\\ 
       MAPIFile.ulReserved   := 0; 
       MAPIFile.flFlags      := 0; 
       MAPIFile.nPosition    := 0; 
       MAPIFile.lpszPathName := PChar(edFile.Text);                 //Chemin complet du fichier à joinde 
       MAPIFile.lpszFileName := PChar(ExtractFileName(edFile.Text));//Nom "interne" du fichier joint 
       MAPIFile.lpFileType   := nil;                                //nil : le type de fichier sera déterminé par le système 
    //-----------------------------------------------------------------------\\ 
     
    //--------------- Récupération du pseudo du destinataire ----------------\\ 
      tmp := edAdr.Text; 
      For i := 1 To Length(tmp) Do 
      Begin 
        If tmp[i] = '@' Then Break 
        Else Name := Name + tmp[i]; 
      end; 
    //-----------------------------------------------------------------------\\ 
     
    //----------------------- Définition de MAPIRecip -----------------------\\ 
       MAPIRecip.ulReserved   := 0; 
       MAPIRecip.ulRecipClass := MAPI_TO;           //Destinataire principal; MAPI_CC et MAPI_BCC pour des copies/copies cachées 
       MAPIRecip.lpszName     := PChar(Name);       //Nom du destinataire 
       MAPIRecip.lpszAddress  := PChar(edAdr.Text); //et son adresse 
       MAPIRecip.ulEIDSize    := 0; 
       MAPIRecip.lpEntryID    := nil; 
    //-----------------------------------------------------------------------\\ 
     
    MAPIRecips[0] := MAPIRecip; //MAPISendMail prend un tableau de MAPIRecipDesc en paramètre 
     
    //---------------------- Définition de MAPIMessage ----------------------\\ 
      With MAPIMessage Do 
      Begin 
        ulReserved         := 0; 
        lpszSubject        := PChar(edSjt.Text);         //Sujet du message 
        lpszNoteText       := PChar(memTexte.Lines.Text);//Texte du message 
        lpszMessageType    := nil;                       //nil lors d'un envoi 
        lpszDateReceived   := nil; 
        lpszConversationID := nil; 
        flFlags            := 0; 
        lpOriginator       := nil;                       //Pointeur éventuel vers une description de l'expéditeur 
        nRecipCount        := 1;                         //Nombre de destinataires 
        lpRecips           := @MAPIRecips[0];            //On passe l'adresse du premier élément du tableau de destinataires 
        nFileCount         := 1;                         //Nombre de fichiers joints 
        lpFiles            := @MAPIFile;                 //Pointeur vers la description du fichier joint 
      end; 
    //-----------------------------------------------------------------------\\ 
     
     
    //------------------------ Appel de MAPISendMail ------------------------\\ 
     If MAPISendMail(0, 0, MAPIMessage, MAPI_NEW_SESSION or 
                     MAPI_DIALOG, 0) <> SUCCESS_SUCCESS Then 
     ShowMessage('Une erreur est apparue lors de l''envoi du message') 
     Else ShowMessage('Envoi effectué !'); 
    //-----------------------------------------------------------------------\\ 
     
    end;
    Comment puis-je faire ?

    Merci d'avance pour vos réponses,
    Wilco

  2. #2
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Il faut faire d'une part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAPIFile     : array[ 0..MAXFILE] of TMAPIFileDesc;
    ensuite

    Ensuite, il y a un bug dans ce code, les chaines représentants les noms de fichiers ne sont pas allouées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MAPIFile[ x ].lpszPathName := StrNew(   PChar(edFile.Text)   ); 
    MAPIFile[ x ].lpszFileName := StrNew(   PChar(ExtractFileName(edFile.Text))   );
    Ce bug on ne s'en apercoit que lorsque il y a plusieurs fichiers joints, car dans le cas d'un fichier unique, la mémoire non allouée n'est pas utilisée et donc le bug passe à l'as

    Ensuite pour les attacher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with MapiMessage do
      begin
      nFileCount := LFichiers.Count;
      lpFiles := @( MAPIFile[ 0 ] );
      end;
    Ne pas oublier de désallouer les 2 chaines précédentes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StrDispose( MAPIFile[ x ].lpszPathName );
    StrDispose( MAPIFile[ x ].lpszFileName );
    Bon courage !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Par défaut Merci
    Merci Tic tac Toe pour ces bonnes infos.

    J'essaie d'appliquer ta méthode et j'ai modifi mon code comme suit :
    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
            nFileCount         := NumberOfFiles;                         //Nombre de fichiers joints
     
            for i:= 0 to NumberOfFiles -1
            Do Begin
               MAPIFile[ i ].ulReserved   := 0;
               MAPIFile[ i ].flFlags      := 0;
               MAPIFile[ i ].nPosition    := 0;
               MAPIFile[ i ].lpFileType   := nil;                                              //nil : le type de fichier sera déterminé par le système
     
               MAPIFile[ i ].lpszPathName := StrNew(   PChar(AttachedFiles[i+1])   );
               MAPIFile[ i ].lpszFileName := StrNew(   PChar(ExtractFileName(AttachedFiles[i+1]))   );
               end;
            //-----------------------------------------------------------------------\\
     
            lpFiles            := @( MAPIFile[ 0 ] );                 //Pointeur vers la description du fichier joint
            end;
     
     
         //------------------------ Appel de MAPISendMail ------------------------\\
        MAPI_DIALOG, 0) <> SUCCESS_SUCCESS)
         If (MAPISendMail(0, 0, MAPIMessage, MAPI_NEW_SESSION, 1 ) <> SUCCESS_SUCCESS)
            Then ShowMessage('Une erreur est apparue lors de l''envoi du message')
            Else ShowMessage('Fichier(s) envoyé(s) par mail à ' + mailTO.Text);
         //-----------------------------------------------------------------------\\
     
         For i:= 0 to NumberOfFiles - 1
         Do Begin
            StrDispose( MAPIFile[ i ].lpszPathName );
            StrDispose( MAPIFile[ i ].lpszFileName );
            end;
    Hélas, j'ai toujours une erreur lors de l'envoi du message. Cependant, outlook Expresse m'affiche une fenêtre me demandant confirmation pour envoyer ce message à partir d'une application externe. (sera t-il possible de ne pas faire apparaître cette fenêtre ?)

    Le mail n'arrive pas à destination.

    Wilco

  4. #4
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    dans mon code qui fonctionne j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nPosition := $FFFFFFFF;
    Je ne sais pas si ca résoudra ton problème.

    Pour ma part j'envoie avec Outlook (pas express), et je me connecte à la messagerie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SProfil := 'Outlook';
     MapiLogon( 0, PChar( SProfil ), nil, MAPI_LOGON_UI or API_NEW_SESSION, 0, @MailHandle );
    et j'utilise MailHandle dans mon envoie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MapiSendMail( MailHandle, Application.Handle, MAPIMessageMAPI_DIALOG , 0 );
    et derriere je me logout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MapiLogOff( MailHandle, 0, 0, 0 );
    En espérant que cela t'aide
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

Discussions similaires

  1. mail avec plusieurs pièces jointes dans les tâches planifiées
    Par gretch dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 01/08/2014, 13h27
  2. envoi d'E-mail avec une pièce jointe
    Par adil54 dans le forum Langage
    Réponses: 4
    Dernier message: 11/07/2012, 13h58
  3. Réponses: 4
    Dernier message: 09/06/2010, 17h44
  4. Envoi d'e-mails avec plusieurs pièces jointes
    Par xnomad dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 16/07/2007, 15h02
  5. Réponses: 6
    Dernier message: 14/11/2006, 10h35

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