Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отослать письмо с аттачем через MAPI

Delphi , Интернет и Сети , E-mail

Отослать письмо с аттачем через MAPI

- ИТ обеспечение.
- Это Пупкин из отдела продаж. Я получил от вас письмо, что нужно выключать компьютер на ночь.
- Правильно. Вы умеете это делать?
- А вы думаете, я идиот?!!! Только мне, к сожалению, нельзя этого делать. Мне ночью отправляют очень много важных писем, и я тогда их не получу...


uses 
  Mapi; 

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; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  mail: TStringList; 
begin 
  mail := TStringList.Create; 
  try 
    mail.values['to'] := 'Receiver-Email@test.xyz'; 
    mail.values['subject'] := 'Hello'; 
    mail.values['body'] := 'blah'; 
    mail.values['body'] := 'blah'; 
    mail.values['attachment0'] := 'C:\Test.txt'; 
    // mail.values['attachment1']:='C:\Test2.txt'; 
    sendEMail(Application.Handle, mail); 
  finally 
    mail.Free; 
  end; 
end;

Here's the translation of the content into Russian:

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

  1. Функция SendEMail:

    • Она принимает два параметра: Handle, который является handle к приложению, и Mail, которая - объект TStringList, содержащий детали электронной почты.
    • Она логинится в MAPI с помощью функции MapiLogon и проверяет, была ли логина успешной. Если нет, она отображает сообщение об ошибке.
    • Она создает объект TMapiMessage, чтобы хранить детали электронной почты, и инициализирует его свойства, такие как получатель, тема, текст и вложения.
    • Она проходит по списку вложений в объекте Mail и добавляет каждое вложение к объекту TMapiMessage.
    • Она отправляет электронную почту с помощью функции MapiSendMail и отображает сообщение об ошибке, если произошла ошибка при отправке.
  2. Процедура Button1Click:

    • Она создает новый объект TStringList, называемый mail.
    • Она задает различные свойства объекта mail, такие как получатель, тема, текст и вложение.
    • Она вызывает функцию SendEMail, чтобы отправить электронную почту.

Некоторые предложения по улучшению: 1. Обработка ошибок: код только проверяет ошибки при логине в MAPI, но лучше было бы обработать ошибки более широко по всему программному коде. 2. Управление памятью: код использует ручное управление памятью с помощью GetMem и StrDispose, что может привести к утечкам памяти, если не используется правильно. Рекомендуется использовать встроенные функции Delphi для управления памятью, такие как AllocateMemory и Free. 3. Организация кода: функция SendEMail очень длинная и выполняет несколько задач, включая логин в MAPI, создание электронной почты и отправку электронной почты. Могло бы быть лучше разбить это на отдельные функции или процедуры. 4. Комментарии к коду: нет комментариев к коду, объясняющих, что каждый раздел делает. Добавление комментариев поможет другим (и вам) понять код.

Вот обновленная версия функции SendEMail, которая учитывает некоторые из этих предложений:

function SendEMail(Handle: THandle; Mail: TStringList): Cardinal;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
begin
   // Логин в MAPI
  dwRet := MapiLogon(Handle, '', '', MAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @MAPI_Session);
  if dwRet <> SUCCESS_SUCCESS then begin
    MessageBox(Handle, 'Ошибка при отправке электронной почты', 'Ошибка', MB_ICONERROR or MB_OK);
    Result := dwRet;
    Exit;
  end;

   // Создание электронной почты
  FillChar(MapiMessage, SizeOf(TMapiMessage), #0);
  Attachments := nil;
  FillChar(Receip, SizeOf(TMapiRecipDesc), #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 begin
    MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
  end;
  if Mail.Values['body'] <> '' then begin
    MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));
  end;

   // Отправка электронной почты
  Result := MapiSendMail(MAPI_Session, Handle, MapiMessage, MAPI_DIALOG, 0);

   // Очистка
  for i1 := 0 to AttachCount - 1 do begin
    StrDispose(Attachments[i1].lpszPathName);
    StrDispose(Attachments[i1].lpszFileName);
  end;

  if Assigned(MapiMessage.lpszSubject) then begin
    StrDispose(MapiMessage.lpszSubject);
  end;
  if Assigned(MapiMessage.lpszNoteText) then begin
    StrDispose(MapiMessage.lpszNoteText);
  end;
  if Assigned(Receip.lpszAddress) then begin
    StrDispose(Receip.lpszAddress);
  end;
  if Assigned(Receip.lpszName) then begin
    StrDispose(Receip.lpszName);
  end;

   // Логофф MAPI
  MapiLogOff(MAPI_Session, Handle, 0, 0);
end;

Обратите внимание, что я добавил некоторые комментарии и обработку ошибок, но есть еще много места для улучшения.

Отправка электронной почты с вложением через MAPI: реализация алгоритма на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: E-mail ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 20:00:39/0.0043330192565918/0