Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка почты через MAPI 
V
    Опции темы
Sponger
Дата 25.4.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 14.2.2006

Репутация: нет
Всего: нет



Отправляю почту через 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;
  

Это сообщение отредактировал(а) Sponger - 25.4.2006, 12:18
PM MAIL   Вверх
Snowy
Дата 25.4.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Вероятно так:
Код
Result := MapiSendMail(MAPI_Session, Handle, MapiMessage, 0, 0);
 
PM MAIL   Вверх
Sponger
Дата 25.4.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 14.2.2006

Репутация: нет
Всего: нет



Спасибо это работает.
А где указать что-бы не спрашивал про почтовый ящик? 
PM MAIL   Вверх
Snowy
Дата 25.4.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Код
dwRet := MapiLogon(Handle, '',    '', MAPI_NEW_SESSION, 0, @MAPI_Session);
 
PM MAIL   Вверх
Sponger
Дата 25.4.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 14.2.2006

Репутация: нет
Всего: нет



Нет я так пробовал, это не работает.

Если стоит Outlook то всеравно выдается сообщение : программа пытается отправить от вашего имени сообщение ... и надо нажать кнопку отправить, а если почтовик по умолчанию Bat! то и вовсе ошибку. 
PM MAIL   Вверх
Snowy
Дата 25.4.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



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

dwRet := MAPILogonEx(Handle, nil, nil, MAPI_NEW_SESSION of MAPI_USE_DEFAULT, 0, @MAPI_Session);
Сам не проверял, но код должен открывать сессию с дефолтным профилем. 
 
PM MAIL   Вверх
Sponger
Дата 26.4.2006, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 14.2.2006

Репутация: нет
Всего: нет



Спасибо. 

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

А через бат надо указывать имя профиля (обязательно) и пароль если есть 
PM MAIL   Вверх
Hacker
Дата 15.5.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Вопрос в тему: Воспользовался кодом из первого поста(ничего не менял). Возникла проблема: отправляет только через 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.

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

 
PM MAIL   Вверх
Snowy
Дата 15.5.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



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

 
PM MAIL   Вверх
Hacker
Дата 15.5.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Мне не надо чтобы прога сама отправляла письмо и этих данных у меня нету, нужно просто чтобы открыла дефолтовый почтовик (BAT) с подготовленным письмом... 
PM MAIL   Вверх
Snowy
Дата 15.5.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Это старый код. Не очень корректный.
Попробуй этот: http://forum.vingrad.ru/index.php?showtopi...st&p=643498 
PM MAIL   Вверх
Hacker
Дата 15.5.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Тоже самое,

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

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

 
PM MAIL   Вверх
Hacker
Дата 15.5.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Цитата(Snowy @ 25.4.2006,  14:37)
Код

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


А как использовать эту функцию? У меня в Mapi.pas она не прописана... 
PM MAIL   Вверх
Snowy
Дата 15.5.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Взято с сайта поддержки TheBat:

Цитата

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, так что будет ждать пояснений.
 
PM MAIL   Вверх
Hacker
Дата 15.5.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Спасибо. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.