Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно приаттачить файлы для отправки через mapi? [WinXP]


Aleksandr. ©   (2006-04-10 16:00:00) 

Функция, отправляющая письмо:

function InternalSendMail(aHandle : HWND; const aFrom, aTo, aSubject, aBody, aFileNames : string;
                         aFlags : integer) : integer;
var
 MapiMessage         : TMapiMessage;
 Sender              : TMapiRecipDesc;
 PRecip, Recipients  : PMapiRecipDesc;
 PFiles, Attachments : PMapiFileDesc;
 i                   : Integer;
 s                   : string;
begin
 s:=ANSIReplaceText(aTo,',',';');
 MapiMessage.nRecipCount:=GetParamCount(s,';');
 GetMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc));
 try
   with MapiMessage do begin
     ulReserved := 0;
     lpszSubject := PChar(aSubject);
     lpszNoteText := PChar(aBody);
     lpszMessageType := nil;
     lpszDateReceived := nil;
     lpszConversationID := nil;
     flFlags := 0;
     Sender.ulReserved := 0;
     Sender.ulRecipClass := MAPI_ORIG;
     Sender.lpszName := PChar(aFrom);
     Sender.lpszAddress := PChar(aFrom);
     Sender.ulEIDSize := 0;
     Sender.lpEntryID := nil;
     lpOriginator := @Sender;
     PRecip := Recipients;
     {$Region 'Первого запихиваем в кому'}
     if nRecipCount > 0 then begin
       PRecip^.ulReserved := 0;
       PRecip^.ulRecipClass := MAPI_TO;
       PRecip^.lpszName := PChar(GetPAram(1,s, ';'));
       PRecip^.lpszAddress := PChar('SMTP:' + GetPAram(1, s,';'));
       PRecip^.ulEIDSize := 0;
       PRecip^.lpEntryID := nil;
       Inc(PRecip)
     end;
     {$EndRegion}
     {$Region 'Остальных в bcc'}
     for i := 2 to nRecipCount do begin
       PRecip^.ulReserved := 0;
       PRecip^.ulRecipClass := MAPI_BCC;
       PRecip^.lpszName := PChar(GetParam(i,s, ';'));
       PRecip^.lpszAddress := PChar('SMTP:' +GetParam(i,s, ';'));
       PRecip^.ulEIDSize := 0;
       PRecip^.lpEntryID := nil;
       Inc(PRecip)
     end;
     {$EndRegion}
     lpRecips := Recipients;
     {$Region 'аттачим файлы'}
     if aFileNames<>'' then begin
       s:=ANSIReplaceText(aFileNames,',',';');
       nFileCount:=GetParamCount(s,';');
       GetMem(Attachments, MapiMessage.nFileCount * sizeof(TMapiFileDesc));
       PFiles := Attachments;
       if nFileCount > 0 then begin
         for i := 1 to GetParamCount(s,';') do begin
           Attachments^.lpszPathName := PChar(GetParam(i,s,';'));
           Attachments^.lpszFileName := PChar(ExtractFileName(GetParam(i,s,';')));
           Attachments^.ulReserved := 0;
           Attachments^.flFlags := 0;
           Attachments^.nPosition := Cardinal(-1);
           Attachments^.lpFileType := nil;
           Inc(Attachments)
         end
       end;
       lpFiles := PFiles
     end
     else begin
       nFileCount := 0;
       lpFiles := nil
     end
     {$EndRegion}
   end;
   Result:=MapiSendMail(0, aHandle, MapiMessage, aFlags, 0)
 finally
   FreeMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc))
 end
end;

GetParamCount и GetParam - возвращают число последовательностей текстов, разделенных указанным знаком, и саму последовательность соответственно.
Проблема в том, что при указании вложенных файлов в получившемся письме получается какой-то сдвиг по фазе - файлы в письмо вкладываются (размер корректно показывается), но их имена частично подменяются куском пути или пропадают два последних символа из расширения, что, соответственно, приводит к проблемам при открытии вложений получателем. В чем ошибка, никто с таким не сталкивался?


Aleksandr.   (2006-04-11 17:52:00) [1]

трабла утряслась. Всего-то надо было StrNew для PChar вызвать...


Dmitrij_K   (2006-04-11 15:33:00) [2]


> DSKalugin ©   (10.04.06 18:33) [1]
>
> полный путь к файлу должен быть в двойных кавычках, т.е.
>
> "C:\Documents and Settings\Dmitry\Рабочий стол\файл.ехе"
> иначе ExtractFileName() вернет Documents
> и тому подобное для путей с пробелами

Не обманывай людей!
Никаких двойных кавычек. ExtractFileName работает как надо


Aleksandr.   (2006-04-11 12:48:00) [3]

Кстати, о птичках. После взятия в двойные кавычки mapi вообще письмо не создает. Только активизирует почтовик.


Aleksandr.   (2006-04-11 12:20:00) [4]

Прикол. Включил я имя файла в кавычки, и теперь ExtractFileName возвращает из пути "C:\Documents and Settings\Administator\Рабочий стол\файл.ехе"имя файла файл.exe"! Кривая функция, однака...


DSKalugin   (2006-04-10 18:33:00) [5]

полный путь к файлу должен быть в двойных кавычках, т.е.
"C:\Documents and Settings\Dmitry\Рабочий стол\файл.ехе"
иначе ExtractFileName()вернет Documents
и тому подобное для путей с пробелами


Наверх

Титульная страница Поиск, карта сайта Написать письмо