Форум: "Начинающим";
Текущий архив: 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.001 c