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

Delphi Discussion :

Extraire le fax d'un mail


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 45
    Par défaut Extraire le fax d'un mail
    Bonjour, je réalise une appli qui lorsque l'on y glisse un mail n'importe où dans sa fiche , enregistre ce mail en fichier eml dans un répertoire, ses pièces jointes comprises. le problème reste que je souhaite filtrer les fax reçus par mail vers un traitement spécial pour n'enregistrer que le fichier TIF associé au fax joint dans le mail. Je ne parviens pas à dissocier les fichiers TIF des fichiers joints en général, tous associés au même type de format presse papier. En effet, le cformat retourné est toujours le même nombre, quelquesoit la pièce jointe.
    Voici un code général dont je me suis inspiré pour récupérer le mail et son contenu droppé:
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
     
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComObj, ActiveX, ShlObj;
     
    type
      // Form that acts as IDropTarget
      TForm1         =  class(TForm, IDropTarget)
        procedure    FormCreate(Sender: TObject);
        procedure    FormClose(Sender: TObject; var Action: TCloseAction);
      private
         // Private declarations
         function    SaveAsStg(FileNameBase: String; dataObj: IDataObject; fmt: tagFORMATETC): Boolean;
         function    SaveAsStm(FileNameBase: String; dataObj: IDataObject; fmt: tagFORMATETC): Boolean;
         function    SaveAsMem(FileNameBase: String; dataObj: IDataObject; fmt: tagFORMATETC): Boolean;
      protected
         // Protected declarations
         function    DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
         function    DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; reintroduce; stdcall;
         function    DragLeave: HResult; stdcall;
         function    Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
      public
         // Public declarations
     
      end;
     
    // Acceptable format types
    const
      CF_Acceptable:          Array [0..1] of String =   ('RenPrivateMessages',
                                                          'Internet Message (rfc822/rfc1522)');
     
    // Predefined clipboard formats
    const
      CF_PredfinedFormats:    Array [1..15] of String =  ('Text',
                                                          'Bitmap',
                                                          'MetaFile',
                                                          'SYLK',
                                                          'DIF',
                                                          'TIFF',
                                                          'OemText',
                                                          'DIB',
                                                          'Palette',
                                                          'Pen Data',
                                                          'RIFF',
                                                          'Wave',
                                                          'Unicode Text',
                                                          'Enhanced Metafile',
                                                          'HDrop');
     
    var
      Form1:         TForm1;
     
    implementation
    {$R *.DFM}
     
    function TForm1.DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
    var  pEFETC:     IEnumFORMATETC;
         FmtETC:     tagFORMATETC;
         lpszFormat: Array [0..255] of Char;
         szFormat:   String;
         dwAllow:    Integer;
         dwfetch:    Integer;
         bAllow:     Boolean;
    begin
     
      // Clear the format string
      szFormat:='';
     
      // Determine if we want to support the drop of this type
      bAllow:=False;
      if (dataObj.EnumFormatEtc(DATADIR_GET, pEFETC) = S_OK) then
      begin
         // Start the fetch enumeration
         while (pEFETC.Next(1, FmtETC, @dwfetch) = S_OK) do
         begin
            // Attempt to get the clipboard format name
            if (FmtETC.cfFormat in [1..15]) then
               szFormat:=CF_PredfinedFormats[FmtETC.cfFormat]
            else if (GetClipboardFormatName(FmtETC.cfFormat, lpszFormat, SizeOf(lpszFormat)) > 0) then
               szFormat:=lpszFormat
            else
               szFormat:=IntToStr(FmtETC.cfFormat);
            // Compare formats
            for dwAllow:=0 to High(CF_Acceptable) do
            begin
               if (CompareText(CF_Acceptable[dwAllow], szFormat) = 0) then
               begin
                  bAllow:=True;
                  if bAllow then break;
               end;
            end;
            if bAllow then break;
         end;
         // Release the enumerator
         pEFETC:=nil;
      end;
     
      // Should we allow the enter?
      result:=NOERROR;
      if not(bAllow) then dwEffect:=DROPEFFECT_NONE;
     
    end;
     
    function TForm1.DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
    begin
     
      // Allow the drag over
      result:=NOERROR;
     
    end;
     
    function TForm1.DragLeave: HResult;
    begin
     
      // Allow the drag leave
      result:=NOERROR;
     
    end;
     
    function TForm1.SaveAsStg(FileNameBase: String; dataObj: IDataObject; fmt: tagFORMATETC): Boolean;
    var  medium:     TStgMedium;
         pvStg:      IStorage;
    begin
     
      // Set default result
      result:=False;
     
      // Set tymed
      fmt.tymed:=TYMED_ISTORAGE;
     
      // Get the data
      if (dataObj.GetData(fmt, medium) = S_OK) then
      begin
         // Create storage file
         if (StgCreateDocfile(PWideChar(WideString(FileNameBase+'.msg')),
            STGM_CREATE or STGM_READWRITE or STGM_SHARE_EXCLUSIVE , 0, pvStg) = S_OK) then
         begin
            // Copy from the dropped storage
            result:=(IStorage(medium.stg).CopyTo(0, nil, nil, pvStg) = S_OK);
            // Release the storage interface
            pvStg:=nil;
         end;
         // We are responsible for releasing the storage medium
         IStorage(medium.stg):=nil;
      end;
     
    end;
     
    function TForm1.SaveAsStm(FileNameBase: String; dataObj: IDataObject; fmt: tagFORMATETC): Boolean;
    var  msStream:   TMemoryStream;
         pvStm:      IStream;
         medium:     TStgMedium;
         stat:       TStatStg;
         dwSize:     Integer;
    begin
     
      // Set default result
      result:=False;
     
      // Set tymed
      fmt.tymed:=TYMED_ISTREAM;
     
      // Get the data
      if (dataObj.GetData(fmt, medium) = S_OK) then
      begin
         // Get the stream
         pvStm:=IStream(medium.stm);
         // Stat to get the size
         if (pvStm.Stat(stat, STATFLAG_NONAME) = S_OK) then
         begin
            // Create memory stream for output
            msStream:=TMemoryStream.Create;
            msStream.Size:=stat.cbSize;
            if (IStream(medium.stm).Read(msStream.Memory, stat.cbSize, @dwSize) = S_OK) then
            begin
               msStream.Size:=dwSize;
               msStream.Position:=0;
               msStream.SaveToFile(FileNameBase+'.eml');
               result:=True;
            end;
            msStream.Free;
         end;
         // Release the stream interface
         IStream(medium.stm):=nil;
      end;
     
    end;
     
    function TForm1.SaveAsMem(FileNameBase: String; dataObj: IDataObject; fmt: tagFORMATETC): Boolean;
    var  msStream:   TMemoryStream;
         medium:     TStgMedium;
         stat:       TStatStg;
         lpMem:      Pointer;
         dwSize:     Integer;
    begin
     
      // Set default result
      result:=False;
     
      // Set tymed
      fmt.tymed:=TYMED_HGLOBAL;
     
      // Get the data
      if (dataObj.GetData(fmt, medium) = S_OK) then
      begin
         // Get the memory and lock it
         lpMem:=GlobalLock(medium.hGlobal);
         // Create memory stream for output
         msStream:=TMemoryStream.Create;
         msStream.Write(lpMem^, GlobalSize(medium.hGlobal));
         msStream.SaveToFile(FileNameBase+'.eml');
         result:=True;
         msStream.Free;
         // Unlock and free the memory
         GlobalUnlock(medium.hGlobal);
         GlobalFree(medium.hGlobal);
      end;
     
    end;
     
    function TForm1.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
    var  pEFETC:     IEnumFORMATETC;
         FmtETC:     tagFORMATETC;
         msStream:   TMemoryStream;
         cfEml:      Integer;
         cfFile:     Integer;
         pvStg:      IStorage;
         medium:     TStgMedium;
         bHandle:    Boolean;
         dwFetch:    Integer;
         i64Size:    Int64;
         i64Move:    Int64;
    begin
     
      // Set result
      result:=NOERROR;
     
      // Enumerate until we get are able to save the contents
      bHandle:=False;
      cfFile:=RegisterClipboardFormat(CFSTR_FILECONTENTS);
      cfEml:=RegisterClipboardFormat('Internet Message (rfc822/rfc1522)');
      if (dataObj.EnumFormatEtc(DATADIR_GET, pEFETC) = S_OK) then
      begin
         // Start the fetch enumeration
         while (pEFETC.Next(1, FmtETC, @dwfetch) = S_OK) do
         begin
            // Check file contents
            if (FmtETC.cfFormat = cfFile) then
            begin
               // Try as storage first, then stream
               if ((FmtETC.cfFormat and TYMED_ISTORAGE) = TYMED_ISTORAGE) then
               begin
                  if SaveAsStg('Test', dataObj, FmtEtc) then break;
               end;
               if ((FmtETC.cfFormat and TYMED_ISTREAM) = TYMED_ISTREAM) then
               begin
                  if SaveAsStm('Test', dataObj, FmtEtc) then break;
               end;
            end
            // Check for eml
            else if (FmtETC.cfFormat = cfEml) then
            begin
               if SaveAsMem('Test', dataObj, FmtEtc) then break;
            end;
         end;
      end;
     
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     
      // Register the form as a drop target
      RegisterDragDrop(Handle, Self);
     
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     
      // Revoke the form as a drop target
      RevokeDragDrop(Handle);
     
    end;
     
    initialization
     
      // Initialize ole
      OleInitialize(nil);
     
    finalization
     
      // Uninitialize ole
      OleUninitialize;
     
    end.


    J'ai eu l'idée également de sauvegarder d'abord tout le mail puis de l'ouvrir en faisant l'extraction du TIF avant sa suppression. Traitement de bidouille je sais. Mais de toute façon, je n'ai pas trouvé le composant standard permettant de lire un fichier EML local (sans passer par un client server de mail). L'idée serait de partir d'un chargement dans un memorystream mais aprés je ne sais pas comment faire pour l'associer à par exemple un MailMessage me permettant de lire le EML. Avez-vous une idée sur soit la solution d'extraire le TIF d'un EML local, soit de directement détecté un TIF en pièce jointe du mail droppé? Merci.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    pas lu tout ton code...

    tu dois pouvoir utiliser un TIdMessage d'Indy : grâce à un LoadFromStream/File, puis tu cherches dans ses MessageParts celles qui sont des TIdAttachment (<=>PJ) et tu cherches l'extension tif dans leur nom
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 45
    Par défaut
    Merci, j'ai bien suivi le conseil^^ Alors, je fais tout d'abord un test pour sauvegarder toutes les pièces jointes du mail dans une procedure i dépendante, ce qui donne à peu prés 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
     
     procedure verifier(nomfichier: String);
     var
     i: integer;
     begin
      Form1.IdMessage1.Clear;
      Form1.IdMessage1.Body.LoadFromFile(nomfichier);
      for i:=0 to Pred(Form1.IdMessage1.MessageParts.Count) do
      begin
      if (Form1.IdMessage1.MessageParts.Items[i] is TIdAttachment) then
      begin
       ShowMessage(TIdAttachment(Form1.IdMessage1.MessageParts.Items[i]).FileName);
       TIdAttachment(Form1.IdMessage1.MessageParts.Items[i]).SaveToFile(chemin + TIdAttachment(Form1.IdMessage1.MessageParts.Items[i]).FileName);
       end;
      end;
     end;
    Le problème reste que çà ne passe pas dans la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (Form1.IdMessage1.MessageParts.Items[i] is TIdAttachment)
    dans le cas où justement le mail en entrée a des pièces jointes. Pourtant mon code semble bon. (le ShowMessage permet de vérifier le nom di fichier de la pièce jointe pour des tests)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 45
    Par défaut
    En fait, gros problème, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.IdMessage1.MessageParts.Count
    indique toujours 0. Je ne comprend pas car il peut m'afficher le boy.text sans problème qui revient à affichier ce que l'on voit lorsque l'on ouvre le eml avec notpad par exemple.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 45
    Par défaut
    peut etre que cela vient du simple fait que je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.IdMessage1.Body.LoadFromFile(nomfichier);
    et que normalement c'est sans doute directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.IdMessage1.LoadFromFile(nomfichier);
    car sans doute par body tout les attachement sont pris en texte et plus dans le format d'origine puisque le body est le crops du mail, rien d'autre.
    j'ai pu voir cette méthode directe dans certains exemples codes mais curieusement, la méthode loadfromfile en direct n'est pas reconnue par DELPHI. Chose que je ne parviens pas encore à résoudre.

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    ça marche chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.IdMessage1.LoadFromFile(nomfichier);
    mais il y a effectivement un pb de Count que j'ai résolu avec la procédure CountPart ou ProcessHeader

    et pour tester le type de partie, la syntaxe n'est pas bonne, même si je l'avais trouvée sur le net (autre version d'Indy ?)

    donc il faut tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if IdMessage1.MessageParts.Items[i]._une_prop_ = 'TIdAttachment' // propriété à retrouver !!!
    j'espère que tu vas arriver à faire fonctionner correctement les Indy, mais ça manque cruellement de simplicité, parfois !!!
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 45
    Par défaut
    Encore autre chose, lorsque, j''ouvre avec NotePad un eml droppé , je peut voir ceci lors du début d'un MessageParts de type pièce jointe :

    ------=_NextPart_001_006D_01C74908.F9C67F50
    Content-Type: image/jpeg;
    name="image001.jpg"
    Content-Transfer-Encoding: base64



    Cela signifie que les champs comme ContentType TransferEncoding sont bien renseignés, alors pourquoi cela ne se rempli pas lors du chargement dans le IdMessage. Mystère et boule de gomme, mais à titres indicatif, je pense que cela ne dépend pas du eml en entrée mais d'encore autre chose.
    Voici le début d'un MessagePart contenant le crops du mail :

    ------=_NextPart_002_006E_01C74908.F9C67F50
    Content-Type: text/html;
    charset="iso-8859-1"
    Content-Transfer-Encoding: quoted-printable


    Je vois pas la différence, il n'y a rien de plus ou de moins.

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    j'ai fait qq tests : bizarre !!!
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      NewMessage: TIdMessage;
      S: string;
      l: integer;
      Srce, Dest: PChar;
      F: TextFile;
      tsl1,tsl2: TStringList;
      i1,i2: integer;
    begin
      tsl1:=TStringList.Create;
      tsl1.LoadFromFile('c:\windows\bureau\test_original.txt');
      i1:=tsl1.Count;
      tsl2:=TStringList.Create;
      tsl2.LoadFromFile('c:\windows\bureau\test_droppe.txt');
      i2:=tsl2.Count;
      for i:=0 to Min(i1,i2)-1 do
      if tsl1[i]=tsl2[i]
      then begin
        Beep;
      end
      else begin
        Beep;
      end;
      AssignFile(F, 'c:\windows\bureau\test_original.txt');       //test_droppe.txt
      Append(F);
      WriteLn(F, '.');
      Flush(F);
      CloseFile(F);
      NewMessage:=TIdMessage.Create(nil);
      NewMessage.NoDecode:=False;
      NewMessage.LoadFromFile('c:\windows\bureau\test_original.txt');  // marche (original)
    //  NewMessage.LoadFromFile('c:\windows\bureau\testepourvoir.txt');  // testepourvoir.eml s'ouvre bien avec OE
      ShowMessage(StrPas(NewMessage.Body.GetText)); // on ne récupère pas bien le Body ???
      ShowMessage(IntToStr(NewMessage.MessageParts.Count));   // 2
      NewMessage.MessageParts.CountParts;
      ShowMessage(IntToStr(NewMessage.MessageParts.AttachmentCount));  // 1
      ShowMessage(NewMessage.MessageParts.Items[0].DisplayName); // TIdText
      ShowMessage(NewMessage.MessageParts.Items[1].DisplayName); // TIdAttachment
      S:=NewMessage.MessageParts.Items[1].StoredPathName;
      l:=pos(' ',S);
      Srce:=PChar(Copy(S, l+1, Length(S)-l));
      Dest:=PChar('c:\windows\bureau\test_1.jpg');  // nickel (très beau jpg !!!) : récupéré qd même avec testepourvoir...
      if not CopyFile(Srce, Dest, False)
      then Beep;
      NewMessage.SaveToFile('c:\windows\bureau\traite_original.txt');
      NewMessage.Free;
    end;
    les 2 fichiers sont identiques
    ils permettent tous les 2 de récupérer le jpg
    mais affichage défectueux du TIdText !!!

    message ouvert par Indy
    This is a multi-part message in MIME format.

    ------=_NextPart_000_1a48_2dbb_3fd2
    Content-Type: text/plain; charset=iso-8859-1; format=flowed

    truc pour tester

    ------=_NextPart_000_1a48_2dbb_3fd2
    Content-Type: image/pjpeg; name="truc.JPG"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="truc.JPG"

    /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL
    même message enregistré par Indy
    This is a multi-part message in MIME format

    --=_MoreStuf_2zzz1234sadvnqw3nerasdf
    Content-Type: text/plain
    Content-Transfer-Encoding: 7bit

    This is a multi-part message in MIME format.




    --=_MoreStuf_2zzz1234sadvnqw3nerasdf
    Content-Type: image/pjpeg; name="truc.JPG";
    name="truc.JPG"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="truc.JPG";
    filename="truc.JPG"

    /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
    il perd bien le message, mais pas la PJ ! il a un peu l'air de bégayer, d'ailleurs...
    il change les séparateurs de parties sans se tromper (j'ai eu des pbs d'erreurs qui venaient de là)


    nota: en mettant NoDecode à True, le texte du Body est bien rendu, et les séparateurs sont les originaux, mais il n'affecte pas les MessageParts puisqu'il ne décode pas...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Est ce que le problème ne viendrait pas du fait que tu as le mauvais format de message

    Ci dessous un code exemple de comment j'envoi un mail html avec pièce jointe.
    Tu devrais peut être récupérer les ContentType que j'utilise

    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
     
         With IdMessage1 do
              begin
                IdMessage1.Clear;
                IdMessage1.MessageParts.Clear;
                ContentType := 'multipart/mixed';
                Subject := EdtTitre.text;
                TIdText.Create(IdMessage1.MessageParts, lstMessage).ContentType := 'text/html';
    //            Body.Text := lstMessage.Text;
                From.Address := IdSMTP1.Username;
                Recipients.EMailAddresses := 'MonEmail@ttt.com';
                Sender.Text := 'Môa';
              end;
     
              //Ajout des pièces jointes
             for j := 0 to lstJoint.Count -1 do
                TIdAttachmentFile.Create(IdMessage1.MessageParts, lstJoint.Items.Strings[j]);
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 45
    Par défaut
    Bonjour!
    Peut être que le format du message a quelque peu changé aprés un Drop et çà je ne réussi toujours pas à résoudre le problème alors je dois jouer avec le Nodecode pour voir ou non respectivement pièces jointes et corps du mail.
    Alors pour ce qui est de l'extraction des pièces jointes, la solution est trouvée. Voilà comment j'ai fait:

    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
     
    procedure verifier(nomfichier: String);
     var
     k, l, n, i: integer;
     nomA: String;
     begin
      n:=0;
      Form1.IdMessage1.LoadFromFile(nomfichier);
      form1.IdMessage1.NoDecode := False;
      Form1.IdMessage1.ProcessHeaders;
      Form1.IdMessage1.MessageParts.CountParts;
      k := Form1.IdMessage1.MessageParts.Count;
      for i:=0 to k-1 do
      begin
       if Form1.IdMessage1.MessageParts.Items[i].DisplayName = 'TIdAttachment' then
       begin
       nomA := TIdAttachment(Form1.IdMessage1.MessageParts.Items[i]).FileName;
       if copy(nomA, Length(nomA) - 3, 4) = '.tif'  then
       begin
       TIdAttachment(Form1.IdMessage1.MessageParts.Items[i]).SaveToFile(chemin + 'FAX\' +  nuenr + ' - ' + dater + '.tif');
       n := n+1;
       end;
       end;
      end;
      Form1.IdMessage1.free;
      Form1.IdMessage1.Clear;
      if n > 0 then DeleteFile(nomfichier);
      if FileExists(nomfichier) then RenameFile(nomfichier , chemin + nuenr + '-' + dater + '-'  + Form1.IdMessage1.Subject + '.eml');
     end;
    En fait je ne sais pas pourquoi mais j'ai due mal compter les messageparts, maintenant les pièces jointes sont correctement reconnues et je peut extraire notemment les faxes (images de type tif) dans les pièces jointes. Donc problème résolu! Merci à vous deux pour votre aide et votre patience^^.

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Au lieu d'un découpage "bourrin du fichier"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if copy(nomA, Length(nomA) - 3, 4) = '.tif'  then
    tu pourrais utilise une fonction déjà faite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if UpperCase(ExtractFileExt(nomA)) = 'TIF' then
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/05/2011, 13h22
  2. [OL-2003] Extraire les informations d'un mail de type rendez-vous
    Par novice-vba-outlook dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 14/05/2010, 14h44
  3. [OL-2003] comment extraire des informations depuis des mails en HTML
    Par boulhous dans le forum Outlook
    Réponses: 0
    Dernier message: 16/02/2010, 16h47
  4. extraire fichier joint dans un mail
    Par ramsesthebest dans le forum Web
    Réponses: 5
    Dernier message: 20/12/2007, 14h52
  5. extraire sous Access une adresse mail
    Par elmoino dans le forum Access
    Réponses: 4
    Dernier message: 09/07/2007, 12h05

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