unit umain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
mapi;
type
Tfmain =
class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
fmain: Tfmain;
implementation
{$R *.dfm}
function SendEMailMapi(
Handle:THandle; Mail:TStrings; showdialog:boolean):Cardinal;
const MapiRecipClassStrings :
array[1..3]
of String =('
to','
cc','
bcc');
var MapiMessage: TMapiMessage;
Receip :
array of TMapiRecipDesc;
i,j, mc,
ReceipCount : integer;
MAPI_Session : Cardinal;
WndList : Pointer;
MapiRecipClassCounter :
array[1..3]
of Integer;
function GetMailValue (AMapiRecipClass,
Index : Integer) :
string;
begin
result:=Mail.Values[MapiRecipClassStrings[AMapiRecipClass]+IntToStr(
index)];
end;
begin
result:=MapiLogon(
Handle, PAnsiChar('
'), PAnsiChar('
'), MAPI_LOGON_UI
or MAPI_NEW_SESSION, 0, @MAPI_Session);
if ( result <> SUCCESS_SUCCESS)
then
MessageBox(
Handle, PChar(format('
Fehler beim Versuch eMails zu versenden'+#13+'
Fehlercode :<%d>',[Result])), PChar('
Error'), MB_ICONERROR
or MB_OK)
else begin
for MC:=MAPI_TO
to MAPI_BCC
do begin
MapiRecipClassCounter[MC]:=0;
for j:= 0
to MaxInt
do begin
// Empfänger zählen
if GetMailValue(MC,j) = '
'
then break;
Inc(MapiRecipClassCounter[MC]);
end;
end;
ReceipCount:=MapiRecipClassCounter[MAPI_TO]+
MapiRecipClassCounter[MAPI_CC]+
MapiRecipClassCounter[MAPI_BCC];
// Gesamtempfängerzahl errechnen
SetLength(Receip,ReceipCount);
// Empfängerarray dimensionieren
i:=0;
if ReceipCount>0
then begin
for MC:=MAPI_TO
to MAPI_BCC
do
if MapiRecipClassCounter[MC]>0
then
for j:=0
to MapiRecipClassCounter[MC]-1
do begin
Receip[i].ulReserved:= 0;
Receip[i].ulRecipClass:= MC;
Receip[i].lpszName:= StrNew(PAnsiChar(AnsiString(GetMailValue(MC,j))));
Receip[i].lpszAddress:= StrNew(PAnsiChar(AnsiString('
SMTP:' + GetMailValue(MC,j))));
Receip[i].lpEntryID:=nil;
Receip[i].ulEIDSize:= 0;
inc(i);
end;
end;
MapiMessage.nRecipCount := ReceipCount;
// Empfängeranzahl in Message setzen
MapiMessage.lpRecips := Pointer(Receip);
// Pointer auf Empfängerarray übergeben
if Mail.Values['
subject'] <>'
'
then MapiMessage.lpszSubject:= PAnsiChar(AnsiString(Mail.Values['
subject']));
if Mail.Values['
body'] <>'
'
then MapiMessage.lpszNoteText:= PAnsiChar(AnsiString(Mail.Values['
body']));
WndList:= DisableTaskWindows(0);
// "semimodal" machen
try
if ShowDialog
then begin
Result:= MapiSendMail(MAPI_Session,
Handle, MapiMessage, MAPI_DIALOG, 0);
// senden der Mail
end else begin
// Funktioniert aus Sicherheitsrichtlinien nicht mehr mit jedem Emailprogramm
Result:= MapiSendMail(MAPI_Session,
Handle, MapiMessage, 0, 0);
// senden der Mail
end;
if result <> 0
then begin
Case result
of
MAPI_E_AMBIGUOUS_RECIPIENT:
MessageDlg('
Empfänger nicht eindeutig. (Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);
MAPI_E_ATTACHMENT_NOT_FOUND:
MessageDlg('
Datei zum Anhängen nicht gefunden',mterror,[mbok],0);
MAPI_E_ATTACHMENT_OPEN_FAILURE:
MessageDlg('
Datei zum Anhängen konnte nicht geöffnet werden.',mterror,[mbok],0);
MAPI_E_BAD_RECIPTYPE:
MessageDlg('
Empfängertyp nicht MAPI_TO, MAPI_CC oder MAPI_BCC.',mterror,[mbok],0);
MAPI_E_FAILURE:
MessageDlg('
Unbekannter Fehler.',mterror,[mbok],0);
MAPI_E_INSUFFICIENT_MEMORY:
MessageDlg('
Nicht genug Speicher.',mterror,[mbok],0);
MAPI_E_LOGIN_FAILURE:
MessageDlg('
Benutzerlogin fehlgeschlagen.',mterror,[mbok],0);
MAPI_E_TEXT_TOO_LARGE:
MessageDlg('
Text zu groß.',mterror,[mbok],0);
MAPI_E_TOO_MANY_FILES:
MessageDlg('
Zu viele Dateienanhänge.',mterror,[mbok],0);
MAPI_E_TOO_MANY_RECIPIENTS:
MessageDlg('
Zu viele Empfänger angegeben.',mterror,[mbok],0);
MAPI_E_UNKNOWN_RECIPIENT: MessageDlg('
Empfänger nicht in Adressbuch gefunden. '+
'
(Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);
MAPI_E_USER_ABORT:
MessageDlg('
Benutzer hat Senden abgebrochen oder MAPI nicht installiert.',mterror,[mbok],0);
else
MessageBox(
Handle, PChar(format('
Fehler beim Versuch eMails zu versenden'+#13+'
Fehlercode :<%d>',[Result])),
PChar('
Error'),
MB_ICONERROR
or MB_OK);
end;
end;
finally
// aufräumen
EnableTaskWindows(WndList);
for i:=0
to ReceipCount-1
do begin
StrDispose(Receip[i].lpszName);
StrDispose(Receip[i].lpszAddress);
end;
Finalize(Receip);
end;
MapiLogOff(MAPI_Session,
Handle, 0, 0);
end;
end;
procedure SendEmail(
const Subject, Body, SenderName, SenderEMail,Recipientsemail:
string; CCEmail,FileNamelist:
string;typ : Cardinal;showdialog:boolean);
var mail : TStringList;
begin
mail:= TStringList.Create;
try
mail.values['
to0'] := Recipientsemail;
mail.values['
subject'] := PChar(Subject);
mail.values['
body'] := PChar(Body);
SendEMailMapi(Application.Handle, mail, showdialog);
finally
mail.Free;
end;
end;
procedure Tfmain.Button1Click(Sender: TObject);
begin
SendEmail('
Test per Mapi', '
Dies ist ein Mapi Test', '
Mapi Tester','
mapitester@mapitest.de','
empfaenger@irgendwas.de','
','
',MAPI_CC,true);
end;
end.