- ИТ обеспечение.
- Это Пупкин из отдела продаж. Я получил от вас письмо, что нужно выключать компьютер на ночь.
- Правильно. Вы умеете это делать?
- А вы думаете, я идиот?!!! Только мне, к сожалению, нельзя этого делать. Мне ночью отправляют очень много важных писем, и я тогда их не получу...
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) thenbegin
MessageBox(Handle,
PChar('Error while trying to send email'),
PChar('Error'),
MB_ICONERROR or MB_OK);
endelsebegin
FillChar(MapiMessage, SizeOf(MapiMessage), #0);
Attachments := nil;
FillChar(Receip, SizeOf(Receip), #0);
if Mail.Values['to'] <> '' thenbegin
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 dobeginif Mail.Values['attachment' + IntToStr(i1)] = '' then
break;
Inc(AttachCount);
end;
if AttachCount > 0 thenbegin
GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);
for i1 := 0 to AttachCount - 1 dobegin
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 dobegin
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, использующий интерфейс программирования приложений для отправки электронной почты с вложениями. Вот разбивка на шаги, что каждый раздел делает:
Функция SendEMail:
Она принимает два параметра: Handle, который является handle к приложению, и Mail, которая - объект TStringList, содержащий детали электронной почты.
Она логинится в MAPI с помощью функции MapiLogon и проверяет, была ли логина успешной. Если нет, она отображает сообщение об ошибке.
Она создает объект TMapiMessage, чтобы хранить детали электронной почты, и инициализирует его свойства, такие как получатель, тема, текст и вложения.
Она проходит по списку вложений в объекте Mail и добавляет каждое вложение к объекту TMapiMessage.
Она отправляет электронную почту с помощью функции MapiSendMail и отображает сообщение об ошибке, если произошла ошибка при отправке.
Процедура Button1Click:
Она создает новый объект TStringList, называемый mail.
Она задает различные свойства объекта mail, такие как получатель, тема, текст и вложение.
Она вызывает функцию SendEMail, чтобы отправить электронную почту.
Некоторые предложения по улучшению:
1. Обработка ошибок: код только проверяет ошибки при логине в MAPI, но лучше было бы обработать ошибки более широко по всему программному коде.
2. Управление памятью: код использует ручное управление памятью с помощью GetMem и StrDispose, что может привести к утечкам памяти, если не используется правильно. Рекомендуется использовать встроенные функции Delphi для управления памятью, такие как AllocateMemory и Free.
3. Организация кода: функция SendEMail очень длинная и выполняет несколько задач, включая логин в MAPI, создание электронной почты и отправку электронной почты. Могло бы быть лучше разбить это на отдельные функции или процедуры.
4. Комментарии к коду: нет комментариев к коду, объясняющих, что каждый раздел делает. Добавление комментариев поможет другим (и вам) понять код.
Вот обновленная версия функции SendEMail, которая учитывает некоторые из этих предложений:
functionSendEMail(Handle:THandle;Mail:TStringList):Cardinal;varMapiMessage:TMapiMessage;Receip:TMapiRecipDesc;Attachments:PAttachAccessArray;AttachCount:Integer;i1:integer;FileName:string;dwRet:Cardinal;MAPI_Session:Cardinal;begin// Логин в MAPIdwRet:=MapiLogon(Handle,'','',MAPI_LOGON_UIorMAPI_NEW_SESSION,0,@MAPI_Session);ifdwRet<>SUCCESS_SUCCESSthenbeginMessageBox(Handle,'Ошибка при отправке электронной почты','Ошибка',MB_ICONERRORorMB_OK);Result:=dwRet;Exit;end;// Создание электронной почтыFillChar(MapiMessage,SizeOf(TMapiMessage),#0);Attachments:=nil;FillChar(Receip,SizeOf(TMapiRecipDesc),#0);ifMail.Values['to']<>''thenbeginReceip.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;fori1:=0toMaxIntdobeginifMail.Values['attachment'+IntToStr(i1)]=''thenbreak;Inc(AttachCount);end;ifAttachCount>0thenbeginGetMem(Attachments,SizeOf(TMapiFileDesc)*AttachCount);fori1:=0toAttachCount-1dobeginFileName:=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;// Установка свойств электронной почтыifMail.Values['subject']<>''thenbeginMapiMessage.lpszSubject:=StrNew(PChar(Mail.Values['subject']));end;ifMail.Values['body']<>''thenbeginMapiMessage.lpszNoteText:=StrNew(PChar(Mail.Values['body']));end;// Отправка электронной почтыResult:=MapiSendMail(MAPI_Session,Handle,MapiMessage,MAPI_DIALOG,0);// Очисткаfori1:=0toAttachCount-1dobeginStrDispose(Attachments[i1].lpszPathName);StrDispose(Attachments[i1].lpszFileName);end;ifAssigned(MapiMessage.lpszSubject)thenbeginStrDispose(MapiMessage.lpszSubject);end;ifAssigned(MapiMessage.lpszNoteText)thenbeginStrDispose(MapiMessage.lpszNoteText);end;ifAssigned(Receip.lpszAddress)thenbeginStrDispose(Receip.lpszAddress);end;ifAssigned(Receip.lpszName)thenbeginStrDispose(Receip.lpszName);end;// Логофф MAPIMapiLogOff(MAPI_Session,Handle,0,0);end;
Обратите внимание, что я добавил некоторые комментарии и обработку ошибок, но есть еще много места для улучшения.
Отправка электронной почты с вложением через MAPI: реализация алгоритма на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.