2010-04-22 2 views
1

Я использую следующую функцию электронной почты с Eudora. По какой-то причине имя файла вложения переименовывается как нечто другое. Как я могу убедиться, что имя файла вложения остается неповрежденным?Почему SendMailMAPI переименовывает вложения файлов в более короткие?

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

В чем именно имена файлов «before» и «after»? Это было бы полезно знать. – mj2008

ответ

1

Необходимо указать FileAttach.lpszFileName на имя, которое вы хотите видеть у получателя. Если вы не сделаете это вложение, например, «C: \ Document And Settings \ MyUser \ Local Settings \ Temp \ Hello.pdf» будет выглядеть как «C__DOCUME ~ 1_MyUser_LOCALS ~ 1_Temp_Hello.pdf» получателю (это вероятно, отличается для e-mailclient).

Так установить FileAttach.lpszPathName содержать только имя файла:

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; 

Получатель теперь будет видеть вложение с именем "Hello.pdf" вместо «C__DOCUME ~ 1_MyUser_LOCALS ~ 1_Temp_Hello.pdf ".

+0

Спасибо, это не повлияло ни на что, может ли это быть ограничением использования EUDORA? его давая короткие случайные имена. – Tom

+1

Том, чтобы определить, является ли это ошибкой Eudora, отправьте свое электронное письмо через другого клиента. Имеются ли у него одинаковые имена вложений? Я бы использовал Wireshark для подтверждения точного содержимого, которое ваша программа отправляет на SMTP-сервер. Если Wireshark показывает правильные имена файлов, а несколько разных клиентов получают неправильные имена файлов, вы остаетесь с серверами SMTP, POP или IMAP, которые изменяют имена средних потоков или, возможно, прокси-сервер для сканирования вирусов на клиенте. –

+0

В примере The_Fox назначается временный указатель на значение lpszFileName. Когда MAPI увидит значение, указатель больше не будет действителен. Сначала присвойте результат ExtractFileName() переменной String, затем PChar(), которая при назначении lpszFileName. –

Смежные вопросы