Ik heb dit wel eens gemaakt, maar heb een andere oplossing gekozen.
Ik heb gebruik gemaakt van het COM object van MAPI.
In het onderstaande stuk code wordt er een verbinding gemaakt met de exchange server.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| function TMarbelMAPI.Connect: boolean;
begin
mConnected := false;
try
// Is de sessie al connected log dan af
if mConnected then
mMapiSession.Logoff;
// Roep coinitialize aan om te zorgen dat het ole object geschikt wordt,
// voor multi threading.
CoInitializeEx (NIL, 2);
// Maak een nieuwe MapiSessie instantie
mMapiSession := CreateOleObject('Mapi.Session');
// Login en geruik de variabelen die uit de text box gehaald zijn
mMapiSession.Logon(mProfile, mPassword, True, True);
mConnected := True; // Zet connected op true
Connected;
except
on E:Exception do
begin
GenerateErrorEvent( 'Can not establish a connection (with: ' + mProfile + ', '
+ mPassword + ' as param): ' + E.Message , 43, 1);
mConnected := false;
end;
end;
Connect := mConnected;
end; |
Voor het gemaak geef ik je ook even de variabelen van mijn componentje.
{ Connection variables }
mConnected : boolean;
mConnectionString : string;
mFolder : TStringList;
mProfile : string; // Stores the profile name
mPassword : string;
mIsMail : boolean;
mMessage : TMailMessage;
{ Ole en folder stores }
mMapiFolder : variant;
mMapiSession : variant;
mMapiSubFolder : variant;
mSubFolder : string;
{ ReScanFolder flags }
mFolderChanged : boolean;
mUseBackupSubFolder : boolean;
mSetSubFolder : boolean;
{ Custom Events }
fConnected : TNotifyEvent;
fOnError : TErrorMsg;
Alle functies voor het COM object staan in de MSDN.
MAPI reference op de MSDN
Zoeken op MAPI op de MSDN
In dit voorbeeld maak ik gebruik van late binding, het is beter om gebruik te maken van early binding, dit kun je bereiken door de Type Library te importen in je project (dit zit onder het menu project) Delphi maakt dan een .pas file van het com object zodat je ook tijdens het ontwerpen type information hebt. (m.a.w. code completion werkt)
Tot slot nog even de code om een bericht te verzenden
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| function TMarbelMAPI.SendMail(mailMessage: TMailMessage): boolean;
var
MapiTempMessage : variant;
MapiTempRecipiant : variant;
begin
if not mConnected then
begin
if not Connect then
begin
GenerateErrorEvent('Can not send mail, because i can not establish a connection.',32,1);
Result := false;
exit;
end;
end;
try
MapiTempMessage := mMapiSession.Outbox.Messages.Add;
except
on E:Exception do
begin
GenerateErrorEvent('Can not create a new message: ' + E.Message, 33,1);
Result := false;
exit;
end;
end;
try
MapiTempMessage.Subject := mailMessage.mSubject;
MapiTempMessage.Text := mailMessage.mMessageText;
except
on E:Exception do
begin
GenerateErrorEvent('Can not fill the message: ' + E.Message, 34,2);
end;
end;
try
MapiTempRecipiant := MapiTempMessage.Recipients.Add;
MapiTempRecipiant.Name := mailMessage.mRecipientAddress;
MapiTempRecipiant.Resolve;
except
on E:Exception do
begin
GenerateErrorEvent('Can not apply the recipient: ' + E.Message, 35, 2);
end;
end;
try
MapiTempMessage.Update;
MapiTempMessage.Send;
except
on E:Exception do
begin
GenerateErrorEvent('Can not send the message: ' + E.Message, 36,1);
Result := false;
Exit;
end;
end;
Result := true;
end; |
Op deze manier heb je dus geen openstaande outlook nodig. Je gaat namelijk rechtstreeks gebruik maken van het mapi object.