CtexAndy
asked on
delphi 2010 and mapi auto send
Using the code below I can generate an email but I would like to send it without any human intervention does anybody know how please
unit PromptMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, shellapi, mapi;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function SendMailMAPI(const strSubject, strBody, strFileName, strSenderName, strSenderEMail,
strRecepientName, strRecepientEMail: ansiString) : Integer;
var
message: TMapiMessage; //changing string->ansiString, char to ansiChar pChar to pAnsiChar
lpSender,
lpRecepient: TMapiRecipDesc;
FileAttach: TMapiFileDesc;
SM: TFNMapiSendMail;
MAPIModule: HModule;
begin
FillChar(message, SizeOf(message), 0);
with message do
begin
if (strSubject<>'') then
begin
lpszSubject := pAnsiChar(strSubject)
end;
if (strBody<>'') then
begin
lpszNoteText := PAnsiChar(strBody)
end;
if (strSenderEMail<>'') then
begin
lpSender.ulRecipClass := MAPI_ORIG;
if (strSenderName='') then
begin
lpSender.lpszName := PAnsiChar(strSenderEMail)
end
else
begin
lpSender.lpszName := PAnsiChar(strSenderName)
end;
lpSender.lpszAddress := PAnsiChar('SMTP:'+strSende rEMail);
lpSender.ulReserved := 0;
lpSender.ulEIDSize := 0;
lpSender.lpEntryID := nil;
lpOriginator := @lpSender;
end;
if (strRecepientEMail<>'') then
begin
lpRecepient.ulRecipClass := MAPI_TO;
if (strRecepientName='') then
begin
lpRecepient.lpszName := PAnsiChar(strRecepientEMai l)
end
else
begin
lpRecepient.lpszName := PAnsiChar(strRecepientName )
end;
lpRecepient.lpszAddress := PAnsiChar('SMTP:'+strRecep ientEMail) ;
lpRecepient.ulReserved := 0;
lpRecepient.ulEIDSize := 0;
lpRecepient.lpEntryID := nil;
nRecipCount := 1;
lpRecips := @lpRecepient;
end
else
begin
lpRecips := nil
end;
if (strFileName='') then
begin
nFileCount := 0;
lpFiles := nil;
end
else
begin
FillChar(FileAttach, SizeOf(FileAttach), 0);
FileAttach.nPosition := Cardinal($FFFFFFFF);
FileAttach.lpszPathName := PAnsiChar(strFileName);
nFileCount := 1;
lpFiles := @FileAttach;
end;
end;
MAPIModule := LoadLibrary(pChar(MAPIDLL) );
if MAPIModule=0 then
begin
Result := -1
end
else
begin
try
@SM := GetProcAddress(MAPIModule, 'MAPISendMail');
if @SM<>nil then
begin
Result := SM(0, Application.Handle, message, MAPI_DIALOG or
MAPI_LOGON_UI, 0);
end
else
begin
Result := 1
end;
finally
FreeLibrary(MAPIModule);
end;
end;
if Result<>0 then
begin
MessageDlg('Error sending mail ('+IntToStr(Result)+').', mtError, [mbOk],
0)
end;
end;
////////////////////////// ////////// ////////// ////////// ////////// ////////// ////
procedure TForm1.Button1Click(Sender : TObject);
var
strFileName,
strBody,
strRecepientName,
strRecepientEMail,
strSenderName,
strSenderEMail,
strSubject : string;
begin
strRecepientName := 'Chris';
strRecepientEMail := 'email address';
strSenderName := 'name';
strSenderEMail := 'email address';
strSubject := 'message';
strBody := 'generated by me';
SendMailMAPI(strSubject,st rBody,strF ileName,st rSenderNam e,strSende rEMail,str RecepientN ame,strRec epientEMai l);
end;
end.
unit PromptMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, shellapi, mapi;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function SendMailMAPI(const strSubject, strBody, strFileName, strSenderName, strSenderEMail,
strRecepientName, strRecepientEMail: ansiString) : Integer;
var
message: TMapiMessage; //changing string->ansiString, char to ansiChar pChar to pAnsiChar
lpSender,
lpRecepient: TMapiRecipDesc;
FileAttach: TMapiFileDesc;
SM: TFNMapiSendMail;
MAPIModule: HModule;
begin
FillChar(message, SizeOf(message), 0);
with message do
begin
if (strSubject<>'') then
begin
lpszSubject := pAnsiChar(strSubject)
end;
if (strBody<>'') then
begin
lpszNoteText := PAnsiChar(strBody)
end;
if (strSenderEMail<>'') then
begin
lpSender.ulRecipClass := MAPI_ORIG;
if (strSenderName='') then
begin
lpSender.lpszName := PAnsiChar(strSenderEMail)
end
else
begin
lpSender.lpszName := PAnsiChar(strSenderName)
end;
lpSender.lpszAddress := PAnsiChar('SMTP:'+strSende
lpSender.ulReserved := 0;
lpSender.ulEIDSize := 0;
lpSender.lpEntryID := nil;
lpOriginator := @lpSender;
end;
if (strRecepientEMail<>'') then
begin
lpRecepient.ulRecipClass := MAPI_TO;
if (strRecepientName='') then
begin
lpRecepient.lpszName := PAnsiChar(strRecepientEMai
end
else
begin
lpRecepient.lpszName := PAnsiChar(strRecepientName
end;
lpRecepient.lpszAddress := PAnsiChar('SMTP:'+strRecep
lpRecepient.ulReserved := 0;
lpRecepient.ulEIDSize := 0;
lpRecepient.lpEntryID := nil;
nRecipCount := 1;
lpRecips := @lpRecepient;
end
else
begin
lpRecips := nil
end;
if (strFileName='') then
begin
nFileCount := 0;
lpFiles := nil;
end
else
begin
FillChar(FileAttach, SizeOf(FileAttach), 0);
FileAttach.nPosition := Cardinal($FFFFFFFF);
FileAttach.lpszPathName := PAnsiChar(strFileName);
nFileCount := 1;
lpFiles := @FileAttach;
end;
end;
MAPIModule := LoadLibrary(pChar(MAPIDLL)
if MAPIModule=0 then
begin
Result := -1
end
else
begin
try
@SM := GetProcAddress(MAPIModule,
if @SM<>nil then
begin
Result := SM(0, Application.Handle, message, MAPI_DIALOG or
MAPI_LOGON_UI, 0);
end
else
begin
Result := 1
end;
finally
FreeLibrary(MAPIModule);
end;
end;
if Result<>0 then
begin
MessageDlg('Error sending mail ('+IntToStr(Result)+').', mtError, [mbOk],
0)
end;
end;
//////////////////////////
procedure TForm1.Button1Click(Sender
var
strFileName,
strBody,
strRecepientName,
strRecepientEMail,
strSenderName,
strSenderEMail,
strSubject : string;
begin
strRecepientName := 'Chris';
strRecepientEMail := 'email address';
strSenderName := 'name';
strSenderEMail := 'email address';
strSubject := 'message';
strBody := 'generated by me';
SendMailMAPI(strSubject,st
end;
end.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
thanks ewangoya: top tip it works a treat using TIdSMTP. MAPI started outlook and required a send button press to work but this solution talks direct to the mail server.
But you can make it self click by calling Button1Click(self) from another method.