unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls,
  MAPI, StdCtrls, Buttons; // Подключаем MAPI

type
  TFormMain = class(TForm)
    StatusBar1: TStatusBar;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    EditTo: TEdit;
    Label2: TLabel;
    MemoBody: TMemo;
    Label3: TLabel;
    EditSubject: TEdit;
    CheckBoxSend: TCheckBox;
    ListBoxFiles: TListBox;
    Label4: TLabel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    OpenDialog: TOpenDialog;
    ListBoxRecip: TListBox;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    procedure BitBtn1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure ListBoxRecipClick(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Procedure SendEMail;
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

procedure TFormMain.SendEMail;
type
  // Массив для хранения получателей
  TRecipDescArray = array [0..0] of TMapiRecipDesc;
  PRecipDescArray = ^TRecipDescArray;
  // Массив для хранения вложенных файлов
  TAttachAccessArray = array [0..0] of TMapiFileDesc;         // вложенные файлы
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;      // Структура содержит информацию о посылаемом или
                                  // принимаемом сообщении.

  Receip     : PRecipDescArray;    // Указатель на массив получателей.
  ReceipCount: Integer;            // Кол-во получателей

  Attachments: PAttachAccessArray; // Указатель на массив вложений
  AttachCount: Integer;            // Кол-во вложений

  Flag       : Integer;
  I          : Integer;
  RecipName,FileName   : String;

  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  //Открываем сессию Simple MAPI
  dwRet := MapiLogon(Application.Handle,PChar(''),PChar(''),
                             MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@MAPI_Session);

  // Если процесс установки почтовой сессии завершился неудачей
  if (dwRet <> SUCCESS_SUCCESS) then
  begin
      ShowMessage('Не могу установить почтовую сессию !');
  end
  else
  begin
     ReceipCount := ListBoxRecip.Items.Count;
     if ReceipCount > 0 then
     begin
       // Выделяем область памяти для массива структуры TMapiRecipDesc
       GetMem(Receip, SizeOf(TMapiRecipDesc) * ReceipCount);
       For I := 0  to ReceipCount-1 do
       begin
          // Заполняем поле "Получатель"
          RecipName := ListBoxRecip.Items.Strings[I];
          Receip[I].ulReserved   := 0;
          IF I = 0 then
             Receip[I].ulRecipClass := MAPI_TO   // Основной получатель
          else
             Receip[I].ulRecipClass := MAPI_CC;  // Копии

          Receip[I].lpszName     := StrNew(PChar(RecipName));
          Receip[I].lpszAddress  := StrNew(PChar('SMTP:' + RecipName));
          Receip[I].ulEIDSize := 0;
       end;
       MapiMessage.nRecipCount := ReceipCount; // Кол-во получателей - один
       MapiMessage.lpRecips := @Receip^; // связываем получателей с сообщением
     end
     else
     begin
        ShowMessage('Не введены получатели сообщения !');
        // Завершаем сессию
        MapiLogOff(MAPI_Session, Application.Handle, 0, 0);
        Exit;
     end;

     // Кол-во вложенных файлов
     AttachCount := ListBoxFiles.Items.Count;
     if AttachCount > 0 then
     begin
       // Выделяем область памяти для массива структуры TMapiFileDesc
       GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);
       for I := 0 to AttachCount - 1 do
       begin
           FileName := ListBoxFiles.Items.Strings[I];
           Attachments[I].ulReserved := 0;
           Attachments[I].flFlags := 0;
           Attachments[I].nPosition := ULONG($FFFFFFFF);
           // Полное имя файла
           Attachments[I].lpszPathName := StrNew(PChar(FileName));
           // Имя файла для отображение
           Attachments[I].lpszFileName := StrNew(PChar(ExtractFileName(FileName)));
           Attachments[I].lpFileType := nil;
       end;
       MapiMessage.nFileCount := AttachCount;
       MapiMessage.lpFiles := @Attachments^;
     end
     Else
     begin
       MapiMessage.nFileCount := 0;
       MapiMessage.lpFiles := nil;
     end;

     // Заполняем поле "Тема сообщения"
     if EditSubject.Text <> '' then
        MapiMessage.lpszSubject := StrNew(PChar(EditSubject.Text));

     // Заполняем сам текст сообщения
     if MemoBody.Text <> '' then
        MapiMessage.lpszNoteText := StrNew(PChar(MemoBody.Text));

      WndList := DisableTaskWindows(0);
      try
        IF CheckBoxSend.Checked then
           Flag := 0
        else
           Flag := MAPI_DIALOG; // Показывать стандартное окно почтовика
           MapiSendMail(MAPI_Session, Application.Handle,MapiMessage, Flag, 0);
      finally
        EnableTaskWindows( WndList );
      end;

      // Очищаем выделенную память
      // Массивы
      for I := 0 to ReceipCount - 1 do
      begin
          StrDispose(Receip[I].lpszName);
          StrDispose(Receip[I].lpszAddress);
      end;
      for I := 0 to AttachCount - 1 do
      begin
          StrDispose(Attachments[I].lpszPathName);
          StrDispose(Attachments[I].lpszFileName);
      end;
      // Переменные
      if Assigned(MapiMessage.lpszSubject) then
         StrDispose(MapiMessage.lpszSubject);
      if Assigned(MapiMessage.lpszNoteText) then
         StrDispose(MapiMessage.lpszNoteText);
      // Завершаем сессию
      MapiLogOff(MAPI_Session, Application.Handle, 0, 0);
  end;
end;

procedure TFormMain.BitBtn1Click(Sender: TObject);
begin
 SendEMail;
end;


procedure TFormMain.SpeedButton1Click(Sender: TObject);
var
 I : Integer;
begin
 IF OpenDialog.Execute then
 begin
    For I:= 0 to OpenDialog.Files.Count-1 do
        ListBoxFiles.Items.Add(OpenDialog.Files.Strings[I]);

 end;
end;

procedure TFormMain.SpeedButton2Click(Sender: TObject);
begin
 ListBoxFiles.DeleteSelected;
end;

procedure TFormMain.SpeedButton3Click(Sender: TObject);
begin
 ListBoxRecip.Items.Add(EditTo.Text);
end;

procedure TFormMain.SpeedButton4Click(Sender: TObject);
begin
 ListBoxRecip.DeleteSelected;
end;

procedure TFormMain.ListBoxRecipClick(Sender: TObject);
begin
 EditTo.Text := ListBoxRecip.Items.Strings[ListBoxRecip.ItemIndex];
end;

// ВЗЯТЬ ИЗ АДРЕСНОЙ КНИГИ
procedure TFormMain.SpeedButton5Click(Sender: TObject);
var
  dwRet       : Cardinal;
  MAPI_Session: Cardinal;
  I           : Integer;
  lpRecip     : TMapiRecipDesc;
  intRecips   : ULONG;
  lpRecips    : PMapiRecipDesc;
begin
  //Открываем сессию Simple MAPI
  dwRet := MapiLogon(Application.Handle,PChar(''),PChar(''),
                             MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@MAPI_Session);

  // Если процесс установки почтовой сессии завершился неудачей
  if (dwRet <> SUCCESS_SUCCESS) then
  begin
      ShowMessage('Не могу установить почтовую сессию !');
      SysErrorMessage(dwRet);
  end
  else
  begin
      IF MAPIAddress(MAPI_Session, 0, 'Выбрать пользователей', 1, '', 0,
                          lpRecip, 0, 0, @intRecips, lpRecips) = SUCCESS_SUCCESS
      Then
      begin
         // Добавляем контакты из адресной книги
         For I := 0 to IntRecips-1 do
             ListBoxRecip.Items.Add(PMapiRecipDesc(PChar(lpRecips) +
                                    I * SizeOf(TMapiRecipDesc))^.lpszAddress);

         // Очищаем буфер получателей
         MAPIFreeBuffer(lpRecips);
      end;
      // Завершаем сессию
      MapiLogOff(MAPI_Session, Application.Handle, 0, 0);
  end;
end;

// РЕДАКТИРОВАТЬ АДРЕСНУЮ КНИГУ
procedure TFormMain.SpeedButton6Click(Sender: TObject);
var
  dwRet       : Cardinal;
  MAPI_Session: Cardinal;
  lpRecip     : TMapiRecipDesc;
  intRecips   : ULONG;
  lpRecips    : PMapiRecipDesc;
begin
  //Открываем сессию Simple MAPI
  dwRet := MapiLogon(Application.Handle,PChar(''),PChar(''),
                             MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@MAPI_Session);

  // Если процесс установки почтовой сессии завершился неудачей
  if (dwRet <> SUCCESS_SUCCESS) then
  begin
      ShowMessage('Не могу установить почтовую сессию !');
      SysErrorMessage(dwRet);
  end
  else
  begin
      IF MAPIAddress(MAPI_Session, 0, 'Редактирование адресной книги', 0, '', 0,
                          lpRecip, 0, 0, @intRecips, lpRecips) = SUCCESS_SUCCESS
      Then
         // Завершаем сессию
         MapiLogOff(MAPI_Session, Application.Handle, 0, 0);
  end;
end;

end.
