Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

Как правильно приаттачить файлы для отправки через 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
2-1155026404
c10wn
2006-08-08 12:40
2006.08.27
поиск с помощью inputbox


2-1154828672
grisme
2006-08-06 05:44
2006.08.27
FloatToStr


2-1154630337
Exit
2006-08-03 22:38
2006.08.27
Whois


2-1154609678
webpauk
2006-08-03 16:54
2006.08.27
TreeView select item


15-1154372410
Gydvin
2006-07-31 23:00
2006.08.27
Зацените компонент





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский