bonjour,

Je sais que le sujet à déjà été traité mais je ne m'en sors pas.
J'utilise D2009Pro.

Pour envoyer un mail à plusieurs destinataires ainsi qu'a plusieurs destinataires en copie, j'utilise "ToDesc: array of TMapiRecipDesc;" ainsi que l'unité sendmail suivante :

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit uAutoSend;
 
interface
 
Uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls, MAPI, Buttons, Dialogs,StrUtils;
 
Type
  TMapiFiles = Array Of TMapiFileDesc;
  TFilePath = Array[0..MAX_PATH] Of AnsiChar;
  PFilePath = ^TFilePath;
  TFileName = Array[0..MAX_PATH] Of AnsiChar;
  PFileName = ^TFileName;
  MapiInfos = Packed Record
    ToAddress : String;
    Subject : String;
    Body : String;
    AttachedFiles : TStrings;
  End;
 
 
Procedure sendMail2(Infos : MapiInfos; liste, listeCc : tstrings);
 
implementation
 
uses Principale;
 
Procedure sendMail2(Infos : MapiInfos; liste, listeCc : tstrings);
// Construction du mail
Var
  Files: TMapiFiles;
  MapiMessage: TMapiMessage;
  ToDesc: array of TMapiRecipDesc;
  MError: Cardinal;
  I: Integer;
  Flags: Cardinal;
  bou,bou1 : integer;
  S: AnsiString;
Begin
  ZeroMemory(@Files, SizeOf(Files));
  ZeroMemory(@ToDesc, SizeOf(ToDesc));
  SetLength(ToDesc,liste.Count+listeCc.Count);
 
 
  If Infos.AttachedFiles <> nil Then
  Begin
    SetLength(Files, Infos.AttachedFiles.count);  // la taille est alloué une seule fois
    For I := 0 To Infos.AttachedFiles.count-1 do
    Begin
      Files[I].ulReserved := 0;
      Files[I].flFlags := MAPI_OLE_STATIC;
      Files[I].nPosition := Length(Infos.Body) - 1;
      S := AnsiString(Infos.AttachedFiles[I]);
      Files[I].lpszPathName := StrNew(PAnsiChar(S));
      S := AnsiString(ExtractFileName(Infos.AttachedFiles[I]));
      Files[I].lpszFileName := StrNew(PAnsiChar(S));
      Files[I].lpFileType := Nil;
    End;
  End;
 
for bou := 0 to liste.Count-1 do
begin
  fc_principale.ListBox2.Items.Add(inttostr(bou) + '->' + Liste[Bou] + ' : Too');
  With ToDesc[bou] Do
  Begin
    ulReserved := 0;
    ulRecipClass := MAPI_TO;
    lpszName := PAnsiChar(AnsiString(Liste[Bou]));
    lpszAddress := Nil;
    ulEIDSize := 0;
    lpEntryID := Nil;
  End;
end;
 
for bou1 := liste.Count to (liste.Count+listeCc.Count)-1 do
begin
  fc_principale.ListBox2.Items.Add(inttostr(bou1) + '->' + listeCc[Bou1-liste.Count] + ' : Cc');
  With ToDesc[bou1] Do
  Begin
    ulReserved := 0;
    ulRecipClass := MAPI_CC;
    lpszName := PAnsiChar(AnsiString(listeCc[Bou1-liste.Count]));
    lpszAddress := Nil;
    ulEIDSize := 0;
    lpEntryID := Nil;
  End;
end;
 
  With MapiMessage Do
  Begin
    ulReserved := 0;
    lpszSubject := PAnsiChar(AnsiString(Infos.Subject));
    lpszMessageType := Nil;
    lpszDateReceived := Nil;
    lpszConversationID := Nil;
    flFlags := MAPI_SENT;
    lpOriginator := Nil;
 
   If Trim(liste[0]) <> '' Then
    Begin
      nRecipCount := liste.Count+listecc.Count;
      lpRecips := @ToDesc[0];
 
      Flags := 0;
    End
    Else
    Begin
      nRecipCount := 0;
      lpRecips := Nil;
      Flags := MAPI_DIALOG;
    End;
 
 
 
    nFileCount := High(Files) + 1;
    lpFiles := Pointer(Files);
    lpszNoteText := PAnsiChar(AnsiString(Infos.Body));
  End;
  MError := MapiSendMail(0, Application.Handle, MapiMessage, Flags, 0);
  //libération de la memoire
  for I := 0 to High(Files) do
  begin
    StrDispose(Files[I].lpszPathName);
    StrDispose(Files[I].lpszFileName);
  end;
  If MError <> 0 Then  MessageDlg('Le message n''a pas été envoyé', mtError, [mbOK], 0);
End;
 
end.
pour créer les listes de destinataires, je fais ceci :
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
for bou := 0 to liste.Count-1 do
begin
  fc_principale.ListBox2.Items.Add(inttostr(bou) + '->' + Liste[Bou] + ' : Too');
  With ToDesc[bou] Do
  Begin
    ulReserved := 0;
    ulRecipClass := MAPI_TO;
    lpszName := PAnsiChar(AnsiString(Liste[Bou]));
    lpszAddress := Nil;
    ulEIDSize := 0;
    lpEntryID := Nil;
  End;
end;
 
for bou1 := liste.Count to (liste.Count+listeCc.Count)-1 do
begin
  fc_principale.ListBox2.Items.Add(inttostr(bou1) + '->' + listeCc[Bou1-liste.Count] + ' : Cc');
  With ToDesc[bou1] Do
  Begin
    ulReserved := 0;
    ulRecipClass := MAPI_CC;
    lpszName := PAnsiChar(AnsiString(listeCc[Bou1-liste.Count]));
    lpszAddress := Nil;
    ulEIDSize := 0;
    lpEntryID := Nil;
  End;
end;
Ca fonctionne si je mets 1 destinataire et 1 destinataire en copie.

En augmentant le nombre, tout se mélange !

Pouvez vous m'aider à identifier le probleme ?

Merci beaucoup, Cyrille.