Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Отправка почты через MAPI


Автор: Sponger 25.4.2006, 12:16
Отправляю почту через MAPI. 
Мне надо что-бы отправка была полностью автоматизирована, но получается только вызвать текущий почтовик и создать письмо, а нажимать кнопку отправка надо ручками, как сделать что-бы почта уходила автоматически.

PS Еще при создании письма почтовик справшивает через какую учетную запись отправлять письмо, а нужно что-бы была учетная запись по умолчанию

Код

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  dwRet := MapiLogon(Handle,
    PChar(''),
    PChar(''),
    MAPI_LOGON_UI or MAPI_NEW_SESSION,
    0, @MAPI_Session);

  if (dwRet <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,
      PChar('Error while trying to send email'),
      PChar('Error'),
      MB_ICONERROR or MB_OK);
  end
  else
  begin
    FillChar(MapiMessage, SizeOf(MapiMessage), #0);
    Attachments := nil;
    FillChar(Receip, SizeOf(Receip), #0);

    if Mail.Values['to'] <> '' then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := StrNew(PChar(Mail.Values['to']));
      Receip.lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['to']));
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;

    AttachCount := 0;

    for i1 := 0 to MaxInt do
    begin
      if Mail.Values['attachment' + IntToStr(i1)] = '' then
        break;
      Inc(AttachCount);
    end;

    if AttachCount > 0 then
    begin
      GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);

      for i1 := 0 to AttachCount - 1 do
      begin
        FileName := Mail.Values['attachment' + IntToStr(i1)];
        Attachments[i1].ulReserved := 0;
        Attachments[i1].flFlags := 0;
        Attachments[i1].nPosition := ULONG($FFFFFFFF);
        Attachments[i1].lpszPathName := StrNew(PChar(FileName));
        Attachments[i1].lpszFileName :=
          StrNew(PChar(ExtractFileName(FileName)));
        Attachments[i1].lpFileType := nil;
      end;
      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := @Attachments^;
    end;

    if Mail.Values['subject'] <> '' then
      MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
    if Mail.Values['body'] <> '' then
      MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));

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

    for i1 := 0 to AttachCount - 1 do
    begin
      StrDispose(Attachments[i1].lpszPathName);
      StrDispose(Attachments[i1].lpszFileName);
    end;

    if Assigned(MapiMessage.lpszSubject) then
      StrDispose(MapiMessage.lpszSubject);
    if Assigned(MapiMessage.lpszNoteText) then
      StrDispose(MapiMessage.lpszNoteText);
    if Assigned(Receip.lpszAddress) then
      StrDispose(Receip.lpszAddress);
    if Assigned(Receip.lpszName) then
      StrDispose(Receip.lpszName);
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;
  

Автор: Snowy 25.4.2006, 12:25
Вероятно так:
Код
Result := MapiSendMail(MAPI_Session, Handle, MapiMessage, 0, 0);
 

Автор: Sponger 25.4.2006, 12:44
Спасибо это работает.
А где указать что-бы не спрашивал про почтовый ящик? 

Автор: Snowy 25.4.2006, 13:14
Код
dwRet := MapiLogon(Handle, '',    '', MAPI_NEW_SESSION, 0, @MAPI_Session);
 

Автор: Sponger 25.4.2006, 14:05
Нет я так пробовал, это не работает.

Если стоит Outlook то всеравно выдается сообщение : программа пытается отправить от вашего имени сообщение ... и надо нажать кнопку отправить, а если почтовик по умолчанию Bat! то и вовсе ошибку. 

Автор: Snowy 25.4.2006, 14:37
Нужно во второй параметр передавать имя профиля (имя/адрес), в третий пароль (обычно пустой).
Если они не заданы, то придется все таки спрашивать у пользователя.
Вот могу предложить следующий код:
Код

dwRet := MAPILogonEx(Handle, nil, nil, MAPI_NEW_SESSION of MAPI_USE_DEFAULT, 0, @MAPI_Session);
Сам не проверял, но код должен открывать сессию с дефолтным профилем. 
 

Автор: Sponger 26.4.2006, 08:07
Спасибо. 

Если через Outlook отпраляется почта то запрос на подтверждение отключается в нем самом.

А через бат надо указывать имя профиля (обязательно) и пароль если есть 

Автор: Hacker 15.5.2006, 09:44
Вопрос в тему: Воспользовался кодом из первого поста(ничего не менял). Возникла проблема: отправляет только через Outlook Express, а если по дефолту стоИт The Bat! или в системе нет Express'а, а есть только Bat, то выдаёт ошибку "Error while trying to send email" 

После этой строки:
dwRet := MapiLogon(Handle,    
    PChar(''),    
    PChar(''),    
    MAPI_LOGON_UI or MAPI_NEW_SESSION,    
    0, @MAPI_Session);

в dwRet стоИт значение 2.

В чём может быть проблема?

 

Автор: Snowy 15.5.2006, 10:14
Цитата(Sponger @  26.4.2006,  08:07 Найти цитируемый пост)
через бат надо указывать имя профиля (обязательно) и пароль если есть 

 

Автор: Hacker 15.5.2006, 10:27
Мне не надо чтобы прога сама отправляла письмо и этих данных у меня нету, нужно просто чтобы открыла дефолтовый почтовик (BAT) с подготовленным письмом... 

Автор: Snowy 15.5.2006, 10:46
Это старый код. Не очень корректный.
Попробуй этот: http://forum.vingrad.ru/index.php?showtopic=83441&view=findpost&p=643498 

Автор: Hacker 15.5.2006, 11:01
Тоже самое,

result := MapiLogon(0,nil,nil, MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@Session);

после этой строки result <> SUCCESS_SUCCESS

 

Автор: Hacker 15.5.2006, 11:33
Цитата(Snowy @ 25.4.2006,  14:37)
Код

dwRet := MAPILogonEx(Handle, nil, nil, MAPI_NEW_SESSION of MAPI_USE_DEFAULT, 0, @MAPI_Session);


А как использовать эту функцию? У меня в Mapi.pas она не прописана... 

Автор: Snowy 15.5.2006, 12:11
Взято с http://www.nobat.ru/simplemapi.html#06:

Цитата

MAPILogon

Открытие сессии работы с почтовой системой. 
Если не использовать эту функцию и далее игнорировать параметр Session, то будет осуществляться работа с тем почтовым ящиком, для которого в TheBat! помечен крыжик "По умолчанию использовать этот ящик для mailto:". Если такого почтового ящика нет, то при попытке отослать или прочитать письмо, будет возвращено значение MAPI_E_LOGIN_FAILURE 

Если необходимо выбрать почтовый ящик в процессе работы, то стоит использовать MAPILogon. 

Пример:
HResult:=MapiLogon(0,'','',MAPI_NEW_SESSION OR MAPI_LOGON_UI,0,Session);
или
HResult:=MapiLogon(0,'M T U','111',MAPI_LOGON_UI,0,Session);
или
HResult:=MapiLogon(0,'Ситилайн','',0,0,Session);
Второй параметр это как раз имя нужного почтового ящика, третий параметр — пароль на почтовый ящик, если ящик запаролен. 
Если указан флаг MAPI_LOGON_UI, то будет вызвано окно выбора почтового ящика ("select account"). Правда если при наличие этого флага название ящика (и пароль, если надо) заданы корректно, то диалог выбора выводится не будет и сессия откроется для указанного акаунта.
Если название ящика не задано или задано неверно и флаг MAPI_LOGON_UI не установлен, то сессия откроется для того почтового ящика, который установлен "по умолчанию ... для mailto:" 

К сожалению в реализации этой функции есть некоторые странные моменты (при работе с запароленым ящиком), о которых сообщено в RITLabs, так что будет ждать пояснений.
 

Автор: Hacker 15.5.2006, 18:59
Спасибо. 

Автор: Hacker 17.5.2006, 13:46
Это опять я и опять у меня проблэм...

The Bat! версии 3.80.06...

При отправке вот этим способм  http://forum.vingrad.ru/index.php?showtopi...st&p=643498 - не заполняется поле "Кому"... независимо от отго, что туда вписАть... 

Автор: Coriolis 17.10.2007, 12:02
Во во. Та же фигня :(
Вот, например, багсендер в игре С.Т.А.Л.К.Е.Р.  с этим батом отрабатывает - там поле "кому" заполняется.
ЗЫ
Это в 3.60.07

А в 3.60.08 - вообще ни одно поле не заполняется. Ерундень какая-то.

Автор: maleziv 7.2.2012, 00:34
Цитата(Sponger @ 26.4.2006,  08:07)
Спасибо. 

Если через Outlook отпраляется почта то запрос на подтверждение отключается в нем самом.

А через бат надо указывать имя профиля (обязательно) и пароль если есть

Если через Outlook 2003 отпраляется почта то запрос на подтверждение не отключается в нем самом.
Сколько лазил в настройках так и не нашел где отключатся.

Подскажите плиз как отправить одно и тоже письмо нескольким адресатам в строчке:
mail.values['to'] :='[email protected], [email protected]'; таким образом не катит, похоже для  Outlook  необходимо специальное кодирование
адресатов перед отправкой.
Кто нашел как отключается  запрос на подверждние в Outlook 2003 (во вложении).

user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)