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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.002 c
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
Оценка работы


11-1267119380
RusSun
2010-02-25 20:36
2019.01.20
компиляция копии... -> access violation


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский