2010-04-22 11 views
1

J'utilise la fonction de messagerie suivante avec Eudora. Pour une raison quelconque, le nom du fichier joint est renommé pour être autre chose. Comment puis-je m'assurer que le nom du fichier joint reste intact?Pourquoi SendMailMAPI renomme-t-il les pièces jointes en fichiers plus courts?

function SendMailMAPI(const Subject, Body, FileName, SenderName, SenderEMail, 
        RecepientName, RecepientEMail: String) : Integer; 
var 
    message: TMapiMessage; 
    lpSender, 
    lpRecepient: TMapiRecipDesc; 
    FileAttach: TMapiFileDesc; 
    SM: TFNMapiSendMail; 
    MAPIModule: HModule; 
begin 
    FillChar(message, SizeOf(message), 0); 
    with message do 
    begin 
    if (Subject<>'') then 
    begin 
     lpszSubject := PChar(Subject) 
    end; 
    if (Body<>'') then 
    begin 
     lpszNoteText := PChar(Body) 
    end; 
    if (SenderEMail<>'') then 
    begin 
     lpSender.ulRecipClass := MAPI_ORIG; 
     if (SenderName='') then 
     begin 
     lpSender.lpszName := PChar(SenderEMail) 
     end 
     else 
     begin 
     lpSender.lpszName := PChar(SenderName) 
     end; 
     lpSender.lpszAddress := PChar('SMTP:'+SenderEMail); 
     lpSender.ulReserved := 0; 
     lpSender.ulEIDSize := 0; 
     lpSender.lpEntryID := nil; 
     lpOriginator := @lpSender; 
    end; 
    if (RecepientEMail<>'') then 
    begin 
     lpRecepient.ulRecipClass := MAPI_TO; 
     if (RecepientName='') then 
     begin 
     lpRecepient.lpszName := PChar(RecepientEMail) 
     end 
     else 
     begin 
     lpRecepient.lpszName := PChar(RecepientName) 
     end; 
     lpRecepient.lpszAddress := PChar('SMTP:'+RecepientEMail); 
     lpRecepient.ulReserved := 0; 
     lpRecepient.ulEIDSize := 0; 
     lpRecepient.lpEntryID := nil; 
     nRecipCount := 1; 
     lpRecips := @lpRecepient; 
    end 
    else 
    begin 
     lpRecips := nil 
    end; 
    if (FileName='') then 
    begin 
     nFileCount := 0; 
     lpFiles := nil; 
    end 
    else 
    begin 
     FillChar(FileAttach, SizeOf(FileAttach), 0); 
     FileAttach.nPosition := Cardinal($FFFFFFFF); 
     FileAttach.lpszPathName := PChar(FileName); 
     nFileCount := 1; 
     lpFiles := @FileAttach; 
    end; 
    end; 
    MAPIModule := LoadLibrary(PChar(MAPIDLL)); 
    if MAPIModule=0 then 
    begin 
    Result := -1 
    end 
    else 
    begin 
    try 
     @SM := GetProcAddress(MAPIModule, 'MAPISendMail'); 
     if @SM<>nil then 
     begin 
     Result := SM(0, Application.Handle, message, MAPI_DIALOG or 
        MAPI_LOGON_UI, 0); 
     end 
     else 
     begin 
     Result := 1 
     end; 

    finally 
     FreeLibrary(MAPIModule); 
    end; 
    end; 
    if Result<>0 then 
    begin 
    MessageDlg('Error sending mail ('+IntToStr(Result)+').', mtError, [mbOk], 
       0) 
    end; 
+0

Quels sont exactement les noms de fichiers "avant" et "après"? Ce serait utile de savoir. – mj2008

Répondre

1

Vous devez définir FileAttach.lpszFileName au nom que vous voulez que votre destinataire pour voir. Si vous ne faites pas cela une pièce jointe comme "C: \ Document et paramètres \ MonUtilisateur \ Paramètres locaux \ Temp \ Hello.pdf" ressemblera à "C__DOCUME ~ 1_MyUser_LOCALS ~ 1_Temp_Hello.pdf" au destinataire (cette est probablement différent par e-mailclient).

donc mis en FileAttach.lpszPathName pour contenir uniquement le nom du fichier:

begin 
    FillChar(FileAttach, SizeOf(FileAttach), 0); 
    FileAttach.nPosition := Cardinal($FFFFFFFF); 
    FileAttach.lpszPathName := PChar(FileName); 
    FileAttach.lpszFileName := PChar(ExtractFileName(FileName)); //add this 
    nFileCount := 1; 
    lpFiles := @FileAttach; 
end; 

Le destinataire va maintenant voir une pièce jointe avec le nom "hello.pdf" au lieu de « C__DOCUME ~ ~ 1_MyUser_LOCALS 1_Temp_Hello.pdf ".

+0

Merci cela n'a rien changé, pourrait-il y avoir une limitation d'EUDORA utilisé? il donne des noms aléatoires courts .. – Tom

+1

Tom, pour déterminer si c'est la faute d'Eudora, envoyez votre e-mail à un autre client. A-t-il toujours les mêmes noms de pièces jointes? J'utiliserais Wireshark pour confirmer le contenu exact que votre programme envoie au serveur SMTP. Si Wireshark affiche les noms de fichiers corrects et que plusieurs clients différents reçoivent les mauvais noms de fichiers, il ne reste plus que les serveurs SMTP, POP ou IMAP qui modifient les noms à mi-flux ou un proxy d'analyse de virus sur le client. –

+0

L'exemple de The_Fox attribue un pointeur temporaire à la valeur lpszFileName. Au moment où MAPI voit la valeur, le pointeur ne sera plus valide. Affectez d'abord le résultat de ExtractFileName() à une variable String, puis PChar() lors de l'affectation de lpszFileName. –