Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Как правильно приаттачить файлы для отправки через mapi?   Найти похожие ветки 

 
Aleksandr.   (2006-04-10 16:00) [0]

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

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


 
DSKalugin ©   (2006-04-10 18:33) [1]

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


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

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


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

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


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.032 c
4-1146849360
Teddy24
2006-05-05 21:16
2006.08.27
Как средствами API поключить сетевой диск?


9-1133797183
Профан Профаныч
2005-12-05 18:39
2006.08.27
Загрузка md2 моделй.


3-1150731490
rar
2006-06-19 19:38
2006.08.27
Хранимая процеддура


2-1155048317
Ega23
2006-08-08 18:45
2006.08.27
TBitmap to TIcon


15-1154493115
Ega23
2006-08-02 08:31
2006.08.27
С Днём рождения! 2 августа