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

Вниз

MS Outlook и MAPI   Найти похожие ветки 

 
ford ©   (2016-10-20 09:59) [0]

Доброго времени суток!
Необходимо сделать автоматическое формирование текста письма на клиентской машине. Нашел на просторах интернета функцию использующую mapi. В целом работает, но есть "ньюанс" :)
Для TheBat, все отлично! Для Outlook не получается установить адрес отправителя.
В отлуке прописанно несколько адресов с которых он собирает почту, прописан адрес по умолчанию. При работе функции, устанавливаю адрес отправителя, но оутлук его игнорирует, оставляет пустое поле "от кого", а при отправке пытается отправить через последний адрес из списка, игнорируя установленный по умолчанию адрес.

function SendEmail(const FromAddress, RecipName, RecipAddress,
Subject,text, Attachment: string): Boolean;
var
 MapiMessage: TMapiMessage;
 MapiFileDesc: TMapiFileDesc;
 MapiRecipDesc,MapiSender: TMapiRecipDesc;
 i: integer;
 s: string;
 Session:THandle;
begin

i:=MapiLogOn(0,PChar(FromAddress),nil, MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@Session);
With MapiSender do
 Begin
   ulRecipClass  :=  MAPI_ORIG;
   lpszAddress  :=  PChar(FromAddress);
 End;
 with MapiRecipDesc do
 begin
   ulReserved:= 0;
   ulRecipClass:= MAPI_TO;
   lpszName:= PChar(RecipName);
   lpszAddress:= PChar(RecipAddress);
   ulEIDSize:= 0;
   lpEntryID:= nil;
 end;

 with MapiFileDesc do
 begin
   ulReserved:= 0;
   flFlags:= 0;
   nPosition:= 0;
   lpszPathName:= PChar(Attachment);
   lpszFileName:= nil;
   lpFileType:= nil;
 end;

 with MapiMessage do
 begin
   ulReserved := 0;
   lpszSubject := PChar(Subject);//nil;
   lpszNoteText := PChar(Text);
   lpszMessageType := nil;
   lpszDateReceived := nil;
   lpszConversationID := nil;
   flFlags := 0;
   lpOriginator := nil;
   nRecipCount := 1;
   lpRecips := @MapiRecipDesc;
   lpOriginator := @MapiSender;
   if length(Attachment) > 0 then
   begin
     nFileCount:= 1;
     lpFiles := @MapiFileDesc;
   end
   else
   begin
     nFileCount:= 0;
     lpFiles:= nil;
   end;
 end;

 Result:= MapiSendMail(Session, 0, MapiMessage, MAPI_DIALOG
 {or MAPI_LOGON_UI or MAPI_NEW_SESSION}, 0) = SUCCESS_SUCCESS;
 MapiLogOff(Session, 0, 0, 0);
end;


Т.е. для Бат, параметр FromAddress, работает, для отулка нет.
По совету "друзей" из майкрософта, настроил "аккаунт" (как я понял это типа общий идентификатор для списка адресов прописанных  в оутлуке), и в праметре FromAddress, передавал имя аккаунта, результат тотже - оутлук создает письмо, без указания поля "от кого", ну и в последствии не может отправить письмо, причем даже если ему указать руками адрес в этом письме, он всеравно пытается отправить его через последний адрес из своего списка, не важно какой адрес стоит по умолчанию.
Проверил настройки оутлука (опять-таки по совету "друзей" из мелкомягких) путем создания письма из проводника по выбору контекстного меню "отправить" - так работает, создается письмо с установленным адресом по умолчанию.

Может кто сталкивался, помогите, подскажите как через mapi сообщить отлуку, какой адрес надо использовать для отправки?
Использовать OLE не удобно, т.к. у разных клиентов стоят разные почтовые программы.


 
ford ©   (2016-10-20 15:56) [1]

Перепробовал все, создал отдельный профайл, с одной учетной записью. Удалил из другого профайла все остальные учетки. Не хочет оутглюк ставить адрес отправителя хоть тресни :(
TheBat и Thunderbird, работают без вопросов и нареканий.

Неужели для отглюка придется использовать OLE? :(  жесть...


 
Rouse_ ©   (2016-10-20 16:17) [2]

Вот этот код никогда сбоя не давал, по исходнику сам разбререшся как правильно заполнять второй параметр функции

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
 TAttachAccessArray = array [0..0] of TMapiFileDesc;
 PAttachAccessArray = ^TAttachAccessArray;
var
 MapiMessage: TMapiMessage;
 Receip: array of TMapiRecipDesc;
 dwRet: Cardinal;
 MAPI_Session: Cardinal;
 WndList: Pointer;
 Attachment: TMapiFileDesc;
begin
 Result := 0;
 dwRet := MapiLogon(Handle, nil, nil, MAPI_NEW_SESSION or MAPI_LOGON_UI,
   0, @MAPI_Session);

 if (dwRet <> SUCCESS_SUCCESS) then
 begin
   CopyStringToClipboard(Mail.Text);
   MessageBox(Handle,
     PChar("Почтовый клиент, заданный по умолчанию, не обнаружен." + #13#10 +
       "Текст письма скопирован в буффер обмена. Вы можете отправить его " + #13#10 +
       "самостоятельно на адрес электронной почты: support@grandsmeta.ru"),
     PChar("Ошибка"),
     MB_ICONERROR or MB_OK);
 end
 else
 try
   FillChar(MapiMessage, SizeOf(MapiMessage), #0);

   FillChar(Receip, SizeOf(Receip), #0);

   if Mail.Values["to"] <> "" then
   begin
     SetLength(Receip, 1);
     Receip[0].ulReserved := 0;
     Receip[0].ulRecipClass := MAPI_TO;
     Receip[0].lpszName := PAnsiChar(AnsiString(Mail.Values["to"]));
     Receip[0].lpszAddress := PAnsiChar(AnsiString("SMTP:" + Mail.Values["to"]));
     Receip[0].ulEIDSize := 0;
     if Mail.Values["cc"] <> "" then
     begin
       SetLength(Receip, 2);
       Receip[1].ulReserved := 0;
       Receip[1].ulRecipClass := MAPI_CC;
       Receip[1].lpszName := PAnsiChar(AnsiString(Mail.Values["cc"]));
       Receip[1].lpszAddress := PAnsiChar(AnsiString("SMTP:" + Mail.Values["cc"]));
       Receip[1].ulEIDSize := 0;
       MapiMessage.nRecipCount := 2;
     end
     else
       MapiMessage.nRecipCount := 1;
     MapiMessage.lpRecips := @Receip[0];
   end;

   if Mail.Values["subject"] <> "" then
     MapiMessage.lpszSubject := PAnsiChar(AnsiString(Mail.Values["subject"]));
   if Mail.Values["body"] <> "" then
     MapiMessage.lpszNoteText := PAnsiChar(AnsiString(Mail.Values["body"]));

   if Mail.Values["attachment"] <> "" then
   begin
     ZeroMemory(@Attachment, SizeOf(TMapiFileDesc));
     Attachment.nPosition := DWORD(-1);
     Attachment.lpszPathName := PAnsiChar(AnsiString(Mail.Values["attachment"]));
     Attachment.lpszFileName := PAnsiChar(AnsiString(ExtractFileName(Mail.Values["attachment"])));
     MapiMessage.nFileCount := 1;
     MapiMessage.lpFiles := @Attachment;
   end;

   WndList := DisableTaskWindows(0);
   try
   Result := MapiSendMail(MAPI_Session, Handle,
     MapiMessage, MAPI_DIALOG, 0);
   finally
     EnableTaskWindows(WndList);
   end;
 finally
   MapiLogOff(MAPI_Session, Handle, 0, 0);
 end;
end;


 
ford ©   (2016-10-20 18:02) [3]

Спасибо, но этот исходник я видел уже.
В нем не устанавливается отправитель вообще.
В бате и в тандерберде у клиентов стоит несколько аккаунтов, т.е. указывать "от кого" - обязательно. В этом исходнике ХЗ от кого он будет отправлять.

Обнулять поле lpOriginator у MAPImessage я пробовал (т.е. не указывать его совсем), для оутглюка это не хляет, он не ставит отправителя совсем (как в прочем и когда указывешь), и не использует учетку установленную по умолчанию. Причем даже уже в открытом письме ему указываешь - "отправить через....", по барабану, он всеравно берет отправителя самую нижнюю в списке учетку. И шлет ей письмо о том что не может отправить письмо :)


 
Игорь Шевченко ©   (2016-10-20 18:21) [4]


> В бате и в тандерберде у клиентов стоит несколько аккаунтов,
>  т.е. указывать "от кого" - обязательно


И как ты собираешься узнавать, от какого надо отправлять ?


 
ford ©   (2016-10-24 09:04) [5]


>
> И как ты собираешься узнавать, от какого надо отправлять
> ?


Не поверишь, очень просто, вт так:


...
i:=MapiLogOn(0,PChar(FromAddress),nil, MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@Session);
With MapiSender do
Begin
  ulRecipClass  :=  MAPI_ORIG;
  lpszAddress  :=  PChar(FromAddress);
End;
..


для Бат и Тандерберда, все работает прекрасно, отправляет именно с того аккаунта и через тот аккаунт, который указал.
причем, если аккаунт называется например "Василий", а адрес выглядит как vasiliy@domen.com, то при указании в FromAddress имени аккаунта "Василий", Бат и Тандерберд прекрасно понимают что от них хотели и отправляют именно с аккаунта "Василий", и адрес отправителя идет vasiliy@domen.com
Т.е. ведут себя вполне предсказуемо и логично.
В отличии от оутглюка мелкомягкой сволочи :) Ему можно указать все что угодно (хоть цитату пушикна приведи), но он берет последнюю учетку из списка и использует его параметры для отправки, причем поле отправителя девственно пусто. Т.е. ему по барабану через какой аккаунт с ним соединились, и плевать на указание какую учетную запись надо использовать.


 
DVM ©   (2016-10-25 15:18) [6]

С Outlook надо работать через Extended MAPI, имхо. Там нет проблем с отправкой чего угодно в каком угодно виде, от любой учетной записи, в том числе от чужой (при наличии прав) Обычный MAPI имеет ограниченную совместимость с Outlook.



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

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

Наверх




Память: 0.5 MB
Время: 0.005 c
11-1267119380
RusSun
2010-02-25 20:36
2019.01.20
компиляция копии... -> access violation


15-1476300821
Eraser
2016-10-12 22:33
2019.01.20
DevExp VCL Developer Survey - FireMonkey Framework


2-1476946776
ford
2016-10-20 09:59
2019.01.20
MS Outlook и MAPI


15-1476299802
cryptologic
2016-10-12 22:16
2019.01.20
Оценка работы


4-1290838465
Alex_C
2010-11-27 09:14
2019.01.20
Win7 узнать что программа запущена от имени администратора