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

Web & réseau Delphi Discussion :

[D2009]Envoie e-mail, pièce jointe à la reception nom nommée et sans extension


Sujet :

Web & réseau Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut [D2009]Envoie e-mail, pièce jointe à la reception nom nommée et sans extension
    Bonjour,

    Je fais une mise à jour d'un ancien programme de Delphi 7 vers Delphi 2009, j'ai trouvé sur un forum la modification à faire entre TIdAttachment en D7 et TIdAttachmentFile en D2009. Cependant à l'arrivée, la pièce jointe à un nom qui ne correspond pas à celle d'origine (et qui doit surement dépendre de la boîte mail - sur yahoo la pièce jointe se nomme "Application001" et dans une autre boîte mail où je me connecte avec Thunderbird elle s'appelle "Partie 1.2"), et en plus elle n'a pas d'extension.

    Que faut-il modifier dans le code suivant, pour que ma pièce jointe arrive avec son nom et son extension d'origine? Merci.

    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
    Procedure TFormSendEMail.bbSendMailClick(Sender: TObject);
    var
      i: integer;
      IdMessage : TIdMessage;
      IdSMTP    : Tidsmtp;
    begin
      Screen.Cursor:= crHourGlass;
     
      //Création du message
      IdMessage:= TIdMessage.Create(nil);
      IdMessage.From.Address:= eSenderEmail.Text;               //Expéditeur
      IdMessage.Recipients.Add.Address:= cxRecipient.Text;      //Destinataire
     
      if cbSendCopy.Checked then                                //Envoie d'une copie à l'adresse de l'expéditeur
        IdMessage.Recipients.Add.Address:= eSenderEmail.Text;
     
      IdMessage.Subject:= eSubject.Text;                        //Sujet
      //IdMessage.ContentType:= 'multipart/alternative';
      IdMessage.ContentType:= 'text/plain';
      IdMessage.Body:= mMessage.Lines;                          //Message
     
      for i:= 0 to FAttachedFiles.Count - 1 do                  //Pièce jointe
      begin
        {$IFNDEF D7}
        TIdAttachmentFile.Create(IdMessage.MessageParts, FAttachedFiles[i]);
        {$ELSE}
        TIdAttachment.Create(IdMessage.MessageParts, FAttachedFiles[i]);                  //Delphi 7
        {$ENDIF}
      end;
     
      {$IFNDEF D7}
      if IdMessage.MessageParts.Count > 0 then IdMessage.ContentType:= 'multipart/mixed';
      for i:= 0 to IdMessage.MessageParts.Count - 1 do
        if IdMessage.MessageParts[i] is TIdAttachment  then
        begin
          TIdAttachment(IdMessage.MessageParts[i]).ContentDisposition:=
            'attachment; filename="' + TIdAttachment(IdMessage.MessageParts[i]).FileName + '"';
        end;
      {$ENDIF}
     
      //Configuration du serveur pour l'envoi
      IdSMTP:= TIdSMTP.Create(nil);
      with GlobalLicenseInformation do
      begin
        IdSMTP.Host:= MS_SmtpServer;
        IdSMTP.Port:= MS_PortNumber;
        if (MS_UseAuthentification) then
        begin
          IdSMTP.AuthType:= satDefault;
          IdSMTP.Username:= MS_UserLogin;
          IdSMTP.Password:= MS_UserPassword;
        end;
      end;
     
      //Envoi
      try
        try
          IdSMTP.Connect;
          if (GlobalLicenseInformation.MS_UseAuthentification) then IdSMTP.Authenticate;
          IdSMTP.Send(IdMessage);
        except
          on e: Exception do MessageDialog(e.Message, mtError, [mbOK], 0);
        end;
      finally
        IdSMTP.Disconnect;
        IdSMTP.Free;
        IdMessage.Free;
      end;
     
      Screen.Cursor:= crDefault;
    end;

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ma part je virerai tous le code ci-dessous qui me semble ne servir à rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      {$IFNDEF D7}
      if IdMessage.MessageParts.Count > 0 then IdMessage.ContentType:= 'multipart/mixed';
      for i:= 0 to IdMessage.MessageParts.Count - 1 do
        if IdMessage.MessageParts[i] is TIdAttachment  then
        begin
          TIdAttachment(IdMessage.MessageParts[i]).ContentDisposition:=
            'attachment; filename="' + TIdAttachment(IdMessage.MessageParts[i]).FileName + '"';
        end;
      {$ENDIF}
    Normalement juste la partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TIdAttachmentFile.Create(IdMessage.MessageParts, FAttachedFiles[i]);
    est suffisante

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut Déjà essayé
    Merci, mais j'ai déjà essayé (en fait c'est pour ça que j'ai rajouté cette partie de code qui malheureusement n'est pas plus efficace), en enlevant cette partie je reçois la pièce jointe dans le mail soit un truc illisible puisque mes pièces jointes sont des zip,
    This is a multi-part message in MIME format

    --xIYUz03UAZtBLeODASwhGvaO=_j1Or1OQg
    Content-Type: text/plain
    Content-Transfer-Encoding: 7bit
    Content-Disposition: inline


    Tapez ici le texte de votre message...

    --xIYUz03UAZtBLeODASwhGvaO=_j1Or1OQg
    Content-Type: application/octet-stream name="D35_60.Zip"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment
    filename="D35_60.Zip"

    UEsDBBQAAAAIAGteVj49Xv6CH8MEAJkIGgAKAAAARDM1XzYwLlpBRtR925LcRpLle5rhH/oHlB1+
    iduk4UFDST0aU0kySdtDDo0PNVJJKjOKpSVL293zx/sXezwCSCCQQCZTRfXYkkVWAumIi8c5xz0C
    kciXX3/z1deffvPd559++6rbffzm9vU/3t2/++T28fa/bt/dff5JH9x0+rt//HrXf/KPN7e/3H/f
    etc............
    Cependant j'ai bien compris vu l'en-tête du mail que là le problème est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IdMessage.ContentType:= 'text/plain';
    j'ai donc mis en commentaire toute la partie semblant inutile sauf la première ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if IdMessage.MessageParts.Count > 0 then IdMessage.ContentType:= 'multipart/mixed'
    et j'ai la même chose qu'avant, c'est à dire une pièce jointe dont le nom n'est pas celui d'origine et sans extension.
    J'ai aussi essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if IdMessage.MessageParts.Count > 0 then IdMessage.ContentType:= 'multipart/alternative';
    et dans ce cas je n'ai même pas la pièce jointe.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essaie çà

    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
     
      //IdMessage.ContentType:= 'multipart/alternative';
    //  IdMessage.ContentType:= 'text/plain';
      IdMessage.Body:=  mMessage.Lines;                          //Message
     
      TIdText(IdMessage.MessageParts).ContentType := 'multipart/mixed';
      With  TIdText.Create(IdMessage.MessageParts) do
      begin
        ContentType := 'text/plain';
        Body :=   IdMessage.Body;
      end;
     
      for i:= 0 to FAttachedFiles.Count - 1 do                  //Pièce jointe
      begin
        With TIdAttachmentFile.Create(IdMessage.MessageParts, FAttachedFiles[i]) do
        begin
          ContentType := 'multipart/mixed';
          FileIsTempFile := false;
          ExtraHeaders.Values['content-id'] := 'Ce que tu veux ici (En général le nom du fichier)';
          DisplayName := 'Idem';
        end;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Merci de ton aide,

    J'ai donc testé ta partie de code - en modifiant juste -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        ExtraHeaders.Values['content-id'] := ExtractFileName(FAttachedFiles[i]);
    DisplayName := ExtractFileName(FAttachedFiles[i]);
    et... je ne comprends pas, le mail arrive, marqué comme ayant une pièce jointe et quand je l'ouvre et bien il n'y a plus de pièce jointe.

    J'ai testé aussi en modifiant comme suit le ContentType de la pièce jointe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIdAttachmentFile(IdMessage.MessageParts[i]).ContentType:= GetMIMETypeFromFile(FAttachedFiles[i]);
    Dans ce cas la pièce jointe arrive et est bien typé en .zip, par contre je n'ai toujours pas le nom correct du fichier.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Encore merci pour ton aide.

    Après une soirée de recherche j'ai fini par trouvé des topics sur embarcadero qui spécifie qu'il y a des bugs dans les composant l'Indy livré par défaut avec le Rad Studio 2009.
    https://forums.embarcadero.com/threa...886&tstart=800
    https://forums.embarcadero.com/threa...threadID=21011
    https://forums.embarcadero.com/threa...976&tstart=449

    J'ai donc remplacé, pas sans maintes galères, les composant l'indy installé (version 10.1.1) par la dernière version 10.5.8 disponible ici
    http://indy.fulgan.com/ZIP/
    il faut prendre le fichier Indy10_4575.zip, et les explications pour l'installation
    http://www.indyproject.org/Sockets/D...lation.EN.aspx

    Attention pour ceux qui auraient le problème et voudraient mettre à jour leur composant Indy, faites ça à tête reposée car c'est très galère surtout la suppression de tout les fichiers de la version précédente qui sont répartis un peu partout dans les dossiers lib et bin de l'install du rad studio.

    Et donc depuis cette mise à jour, mon mail arrive correctement et les pièces jointes aussi.

    Au final tu avais raison, les lignes que tu proposais d'enlever sont effectivement inutile, j'ai juste conservé par rapport à mon code d'origine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if IdMessage.MessageParts.Count > 0 then IdMessage.ContentType:= 'multipart/mixed';
    dans le cas où il y a effectivement des pièces jointes

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

Discussions similaires

  1. [phpmailer] Envoi e-mail pièce jointe
    Par dvp_zero dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 06/04/2010, 19h24
  2. [Mail] envoi de mail : pièce jointe vide
    Par renaudjuif dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2008, 18h11
  3. [Mail] Pièces jointes dont le nom comportent un accent
    Par papawemba dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2008, 20h50
  4. [Mail] Envoi/Reception compte mail (pièce jointe)
    Par Curby dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2007, 20h54
  5. Réponses: 7
    Dernier message: 30/06/2006, 17h12

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