delphi3000.com - the free delphi knowledge platform
delphi3000.com - the free delphi knowledge platform
Have a look at your member-status

connecting people's knowledge


  - Recent ArticlesRSS feed for Recent Articles on delphi3000.com
  - List of All Articles
  - Top Viewed Articles
  - Articles (+Attachem.)
  - Articles Of Interest
  - Categories
  - Top Uploader
  - Search
  - Index

  - My Home
  - Submit an Article
  - My Articles
  - My Personal Data
  - My Bookmarks
  - Activities
  - Login/Logout

  - Sign Up
  - Why Sign Up
  - Newsletter

  - Press
  - Advertise

  - Contact
  - Feedback



Community
Borland
ClubeDelphi
Dr. Bob
UK-BUG
Delphi Meetings
Planeta Delphi








Share this article with friendsShare this article with friends
Rate this articleRate this article - to keep the quality of delphi3000.com !
Comment this article or read through previous comments (88)


How to send email using the MAPIComponent available for this articleFormat this article printer-friendly!Bookmark function is only available for registered users!
Product:
Delphi 4.x (or higher)
Category:
Internet / Web
Skill Level:
Scoring:
Last Update:
02/10/2009
Search Keys:
delphi delphi3000 article borland vcl code-snippet MAPI EMAIL OUTLOOK MapiMessage MapiSendMail
Times Scored:
55
Visits:
58303
Uploader: Sven Lohmann
Company: IfaD GmbH
Reference: N/A
Component Download: http://rapidshare.com/files/196135697/mapicontrol.zip
 
Question/Problem/Abstract:
You have several options to process an email, one is a "ShellExecute", another could be an OLE server like in Delphi 5.
But there is also a MAPI unit to do this job.
Answer:



unit MapiControl;

interface
{
Changelog:
13.04.2001 Fixed memory Leak and String problem in adresses (Sendmail - method)
31.08.2000 Some Changes on the TStrings Objects, added SetXXAdr-Methods
}
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  { Introducing a new Type of Event to get the Errorcode }
  TMapiErrEvent = procedure(Sender: TObject; ErrCode: Integer) of object;

  TMapiControl = class(TComponent)
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  private
    { Private-Deklarationen }
    FSubject: string;
    FMailtext: string;
    FFromName: string;
    FFromAdress: string;
    FTOAdr: TStrings;
    FCCAdr: TStrings;
    FBCCAdr: TStrings;
    FAttachedFileName: TStrings;
    FDisplayFileName: TStrings;
    FShowDialog: Boolean;
    FUseAppHandle: Boolean;
    { Error Events: }
    FOnUserAbort: TNotifyEvent;
    FOnMapiError: TMapiErrEvent;
    FOnSuccess: TNotifyEvent;
    { + Changes by Eugene Mayevski [mailto:Mayevski@eldos.org]}
    procedure SetToAddr(newValue: TStrings);
    procedure SetCCAddr(newValue: TStrings);
    procedure SetBCCAddr(newValue: TStrings);
    procedure SetAttachedFileName(newValue: TStrings);
    { + Changes }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    ApplicationHandle: THandle;
    procedure Sendmail();
    procedure Reset();
  published
    { Published-Deklarationen }
    property Subject: string read FSubject write FSubject;
    property Body: string read FMailText write FMailText;
    property FromName: string read FFromName write FFromName;
    property FromAdress: string read FFromAdress write FFromAdress;
    property Recipients: TStrings read FTOAdr write SetTOAddr;
    property CopyTo: TStrings read FCCAdr write SetCCAddr;
    property BlindCopyTo: TStrings read FBCCAdr write SetBCCAddr;
    property AttachedFiles: TStrings read FAttachedFileName write SetAttachedFileName;
    property DisplayFileName: TStrings read FDisplayFileName;
    property ShowDialog: Boolean read FShowDialog write FShowDialog;
    property UseAppHandle: Boolean read FUseAppHandle write FUseAppHandle;

    { Events: }
    property OnUserAbort: TNotifyEvent read FOnUserAbort write FOnUserAbort;
    property OnMapiError: TMapiErrEvent read FOnMapiError write FOnMapiError;
    property OnSuccess: TNotifyEvent read FOnSuccess write FOnSuccess;
  end;

procedure Register;

implementation

uses Mapi;

{ Register the component: }

procedure Register;
begin
  RegisterComponents('expectIT', [TMapiControl]);
end;

{ TMapiControl }

constructor TMapiControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FOnUserAbort := nil;
  FOnMapiError := nil;
  FOnSuccess := nil;
  FSubject := '';
  FMailtext := '';
  FFromName := '';
  FFromAdress := '';
  FTOAdr := TStringList.Create;
  FCCAdr := TStringList.Create;
  FBCCAdr := TStringList.Create;
  FAttachedFileName := TStringList.Create;
  FDisplayFileName := TStringList.Create;
  FShowDialog := False;
  ApplicationHandle := Application.Handle;
end;

{ + Changes by Eugene Mayevski [mailto:Mayevski@eldos.org]}

procedure TMapiControl.SetToAddr(newValue: TStrings);
begin
  FToAdr.Assign(newValue);
end;

procedure TMapiControl.SetCCAddr(newValue: TStrings);
begin
  FCCAdr.Assign(newValue);
end;

procedure TMapiControl.SetBCCAddr(newValue: TStrings);
begin
  FBCCAdr.Assign(newValue);
end;

procedure TMapiControl.SetAttachedFileName(newValue: TStrings);
begin
  FAttachedFileName.Assign(newValue);
end;
{ + Changes }

destructor TMapiControl.Destroy;
begin
  FTOAdr.Free;
  FCCAdr.Free;
  FBCCAdr.Free;
  FAttachedFileName.Free;
  FDisplayFileName.Free;
  inherited destroy;
end;

{ Reset the fields for re-use}

procedure TMapiControl.Reset;
begin
  FSubject := '';
  FMailtext := '';
  FFromName := '';
  FFromAdress := '';
  FTOAdr.Clear;
  FCCAdr.Clear;
  FBCCAdr.Clear;
  FAttachedFileName.Clear;
  FDisplayFileName.Clear;
end;

{ Send the Mail via the API, this procedure composes and sends
  the Email }

procedure TMapiControl.Sendmail;
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
  Sender: TMapiRecipDesc;
  PRecip, Recipients: PMapiRecipDesc;
  PFiles, Attachments: PMapiFileDesc;
  i: Integer;
  AppHandle: THandle;
begin
  { First we store the Application Handle, if not
    the Component might fail to send the Email or
    your calling Program gets locked up. }
  AppHandle := Application.Handle;

  { Initialize the Attachment Pointer, to keep Delphi quiet }
  PFiles := nil;

  { We need all recipients to alloc the memory }
  MapiMessage.nRecipCount := FTOAdr.Count + FCCAdr.Count + FBCCAdr.Count;
  GetMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc));

  try
    with MapiMessage do
      begin
        ulReserved := 0;
        { Setting the Subject: }
        lpszSubject := PChar(Self.FSubject);

        { ... the Body: }
        lpszNoteText := PChar(FMailText);

        lpszMessageType := nil;
        lpszDateReceived := nil;
        lpszConversationID := nil;
        flFlags := 0;

        { and the sender: (MAPI_ORIG) }
        Sender.ulReserved := 0;
        Sender.ulRecipClass := MAPI_ORIG;
        Sender.lpszName := PChar(FromName);
        Sender.lpszAddress := PChar(FromAdress);
        Sender.ulEIDSize := 0;
        Sender.lpEntryID := nil;
        lpOriginator := @Sender;

        PRecip := Recipients;

        { We have multiple recipients: (MAPI_TO)
          and setting up each: }
        if nRecipCount  0 then
          begin
            for i := 1 to FTOAdr.Count do
              begin
                PRecip^.ulReserved := 0;
                PRecip^.ulRecipClass := MAPI_TO;
                { lpszName should carry the Name like in the
                  contacts or the adress book, I will take the
                  email adress to keep it short: }
                PRecip^.lpszName := PChar(FTOAdr.Strings[i - 1]);
                { If you use this component with Outlook97 or 2000
                  and not some of Express versions you will have to set
                  'SMTP:' in front of each (email-) adress. Otherwise
                  Outlook/Mapi will try to handle the Email on itself.
                  Sounds strange, just erease the 'SMTP:', compile, compose
                  a mail and take a look at the resulting email adresses
                  (right click).
                }
                { + Changes by Andreas Hoerig [mailto:andreas.hoerig@sillner.com] }
                PRecip^.lpszAddress := StrNew(PChar('SMTP:' + FTOAdr.Strings[i - 1]));
                { + Changes  }
                PRecip^.ulEIDSize := 0;
                PRecip^.lpEntryID := nil;
                Inc(PRecip);
              end;

            { Same with the carbon copy recipients: (CC, MAPI_CC) }
            for i := 1 to FCCAdr.Count do
              begin
                PRecip^.ulReserved := 0;
                PRecip^.ulRecipClass := MAPI_CC;
                PRecip^.lpszName := PChar(FCCAdr.Strings[i - 1]);
                { + Changes by Andreas Hoerig [mailto:andreas.hoerig@sillner.com] }
                PRecip^.lpszAddress := StrNew(PChar('SMTP:' + FCCAdr.Strings[i - 1]));
                { + Changes  }
                PRecip^.ulEIDSize := 0;
                PRecip^.lpEntryID := nil;
                Inc(PRecip);
              end;

            { ... and the blind copy recipients: (BCC, MAPI_BCC) }
            for i := 1 to FBCCAdr.Count do
              begin
                PRecip^.ulReserved := 0;
                PRecip^.ulRecipClass := MAPI_BCC;
                PRecip^.lpszName := PChar(FBCCAdr.Strings[i - 1]);
                { + Changes by Andreas Hoerig [mailto:andreas.hoerig@sillner.com] }
                PRecip^.lpszAddress := StrNew(PChar('SMTP:' + FBCCAdr.Strings[i - 1]));
                { + Changes  }
                PRecip^.ulEIDSize := 0;
                PRecip^.lpEntryID := nil;
                Inc(PRecip);
              end;
          end;
        lpRecips := Recipients;

        { Now we process the attachments: }
        nFileCount := FAttachedFileName.Count;
        if nFileCount  0 then
          begin
            GetMem(Attachments, nFileCount * sizeof(TMapiFileDesc));
            PFiles := Attachments;

            { Fist setting up the display names (without path): }
            FDisplayFileName.Clear;
            for i := 1 to FAttachedFileName.Count do
              FDisplayFileName.Add(ExtractFileName(FAttachedFileName[i - 1]));

            if nFileCount  0 then
              begin
                { Now we pass the attached file (their paths) to the
                  structure: }
                for i := 1 to FAttachedFileName.Count do
                  begin
                    { Setting the complete Path }
                    Attachments^.lpszPathName := PChar(FAttachedFileName.Strings[i - 1]);
                    { ... and the displayname: }
                    Attachments^.lpszFileName := PChar(FDisplayFileName.Strings[i - 1]);
                    Attachments^.ulReserved := 0;
                    Attachments^.flFlags := 0;
                    { Position has to be -1, please see the WinApi Help
                      for details. }
                    Attachments^.nPosition := Cardinal(-1);
                    Attachments^.lpFileType := nil;
                    Inc(Attachments);
                  end;
              end;
            lpFiles := PFiles;
          end
        else
          begin
            nFileCount := 0;
            lpFiles := nil;
          end;
      end;

    { Send the Mail, silent or verbose:
      Verbose means in Express a Mail is composed and shown as setup.
      In non-Express versions we show the Login-Dialog for a new
      session and after we have choosen the profile to use, the
      composed email is shown before sending

      Silent does currently not work for non-Express version. We have
      no Session, no Login Dialog so the system refuses to compose a
      new email. In Express Versions the email is sent in the
      background.

      Please Note: It seems that your success on the delivery depends
      on a combination of MAPI-Flags (MAPI_DIALOG, MAPI_LOGON_UI, ...)
      and your used OS and Office Version. I am currently using
      Win2K SP1 and Office 2K SP2 with no problems at all.
      If you experience problems on another versions, please try
      a different combination of flags for each purpose (Dialog or not).
      I would be glad to setup a table with working flags on
      each OS/Office combination, just drop me a line.

      Possible combinations are also (with Dialog):
      1. MAPI_DIALOG or MAPI_LOGON_UI MAPI_NEW_SESSION or MAPI_USE_DEFAULT
      2. MAPI_SIMPLE_DEFAULT

      See MAPI.PAS or MAPI.H (SDK) for more...
     }
    if FShowDialog then
      MError := MapiSendMail(0, AppHandle, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0)
    else
      MError := MapiSendMail(0, AppHandle, MapiMessage, 0, 0);

    { Now we have to process the error messages. There are some
      defined in the MAPI unit please take a look at the unit to get
      familiar with it.
      I decided to handle USER_ABORT and SUCCESS as special and leave
      the rest to fire the "new" error event defined at the top (as
      generic error)

      Not treated as special (constants from mapi.pas):

      MAPI_E_FAILURE = 2;
      MAPI_E_LOGON_FAILURE = 3;
      MAPI_E_LOGIN_FAILURE = MAPI_E_LOGON_FAILURE;
      MAPI_E_DISK_FULL = 4;
      MAPI_E_INSUFFICIENT_MEMORY = 5;
      MAPI_E_ACCESS_DENIED = 6;
      MAPI_E_TOO_MANY_SESSIONS = 8;
      MAPI_E_TOO_MANY_FILES = 9;
      MAPI_E_TOO_MANY_RECIPIENTS = 10;
      MAPI_E_ATTACHMENT_NOT_FOUND = 11;
      MAPI_E_ATTACHMENT_OPEN_FAILURE = 12;
      MAPI_E_ATTACHMENT_WRITE_FAILURE = 13;
      MAPI_E_UNKNOWN_RECIPIENT = 14;
      MAPI_E_BAD_RECIPTYPE = 15;
      MAPI_E_NO_MESSAGES = 16;
      MAPI_E_INVALID_MESSAGE = 17;
      MAPI_E_TEXT_TOO_LARGE = 18;
      MAPI_E_INVALID_SESSION = 19;
      MAPI_E_TYPE_NOT_SUPPORTED = 20;
      MAPI_E_AMBIGUOUS_RECIPIENT = 21;
      MAPI_E_AMBIG_RECIP = MAPI_E_AMBIGUOUS_RECIPIENT;
      MAPI_E_MESSAGE_IN_USE = 22;
      MAPI_E_NETWORK_FAILURE = 23;
      MAPI_E_INVALID_EDITFIELDS = 24;
      MAPI_E_INVALID_RECIPS = 25;
      MAPI_E_NOT_SUPPORTED = 26;
    }

    case MError of
      MAPI_E_USER_ABORT:
        begin
          if Assigned(FOnUserAbort) then
            FOnUserAbort(Self);
        end;
      SUCCESS_SUCCESS:
        begin
          if Assigned(FOnSuccess) then
            FOnSuccess(Self);
        end
      else
        begin
          if Assigned(FOnMapiError) then
            FOnMapiError(Self, MError);
        end;

    end;
  finally
    { Finally we do the cleanups, the message should be on its way }
    { + Changes by Andreas Hoerig [mailto:andreas.hoerig@sillner.com] }
    PRecip := Recipients;
    for i := 1 to MapiMessage.nRecipCount do
      begin
        StrDispose(PRecip^.lpszAddress);
        Inc(PRecip)
      end;
    { + Changes }
    FreeMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc));
    { + Changes due to Ken Halliwell [mailto:kjhalliwell@aol.com] }
    if Assigned(PFiles) then
      FreeMem(PFiles, MapiMessage.nFileCount * sizeof(TMapiFileDesc));
    { + Changes }
  end;
end;

{
  Please treat this as free. If you improve the component
  I would be glad to get a copy.
}

end.





Please rate this article!
Skill level:
BeginnerExpert

Useful:
No!Very!

Overall rating:
PoorExcellent



Comments to this article
Write a new comment
can u help me out of this
    praveen kumar (Oct 13 2007 10:16AM)

how do i  get major,minor version of vb6.0 which is a .vba file using delphi .

The version number of VB6.0 is In Right click on vb project--> make --> Verion ....

I am able to get versioninfo of .dll files . But not .vba file .If u know send me the code snippet to this mail id : praveen.smyl@gmail.com

Regards,
praveen
Respond

I would appreciate if you could help me out with this problem
    praveen kumar (Oct 13 2007 10:11AM)

how do i  get major,minor version of vb6.0 which is a .vba file using delphi .

The version number of VB6.0 is In Right click on vb project--> make --> Verion ....

I am able to get versioninfo of .dll files . But not .vba file .If u know send me the code snippet to this mail id : praveen.smyl@gmail.com

Regards,
praveen
Respond

Application Handle
    Daniel Albuschat (Jun 13 2005 10:19AM)

Hello Sven,

   in the source, there is the following comment:

"First we store the Application Handle, if not the Component might fail to send the Email or     your calling Program gets locked up."

I am actually not using your component, since I had written my own function for sending mails when I found it already, but I'm experiencing exactly this "lock-up" problem. Sometimes (sporadically) my application just will sit there and do nothing after calling MapiSendMail.
But this only seems to happen when attaching files.

What exactly do you know about this issue?
Respond

Got 'Warning ! Silent mail is about to be sent'
    Arti Choke (Jul 1 2004 12:11AM)

( using IncrediMail / Win98 / Delphi 5 )
Is there something bad / and or missing in the test code below ?

Note that it works fine, mail is sent successfully
(but in silent mode)
Great component !

//-----------------------------
procedure TForm1.Button1Click(Sender: TObject);
var S1,S0,R:string;
Mailer:TMapiControl;  // Just for testing component
begin
// THIS ALWAYS SEND  a  SILENT MAIL !!
// So got a warning !
//  I don't know HOW to avoid this !

// IS code below correct ?

  S0:='C:\WINDOWS\Bureau\F1.jpg';
  S1:='C:\WINDOWS\Bureau\F2.jpg';
  R :='Arti@tudobem.us';

  Mailer:= TMapiControl.Create(nil);

  Mailer.Recipients.Clear;
  Mailer.AttachedFiles.Clear;

  Mailer.FromAdress:='webmaster@tudobem.us';
  Mailer.FromName:='Pizic';

  Mailer.Recipients.Add( R);

  Mailer.Subject:='Testing mapi sendmail using component MapiControl.pas';

  Mailer.AttachedFiles.Add (S0);
  Mailer.AttachedFiles.Add (S1);
  Mailer.Body:=' testing mail component' ;
  Mailer.ShowDialog:=true;

  Mailer.Sendmail ;
  Mailer.Free;

end;


Respond

e-mail reading confirmation + UseAppHandle + OnUserAbort
    Marcelo Lombi (Jun 6 2003 10:05PM)

i configured my e-mail client to request e-mail reading confirmation, and when sending throught Outlook, it works.

but, when sending throught MapiControls, does not work.

?

How can i use the event OnUserAbort?  when that happens????

and what is the meaning of the property UseAppHandle???


Respond

rachita here
Rachita (Nov 24 2004 11:16AM)

hi how r usfsd
sdfdfdgfd
dfgdfg

Respond

nothing
    mcbart (May 7 2003 6:39PM)

nothing at all. just borred.
Respond

SendMail in background vs. front
    Alexander Tokarev (Aug 16 2002 10:34AM)

Hello!
It's a very convenient component, but I have a problem when an application sequentially sends several messages via TMapiControl.Sendmail. My D5 application always blinks, getting a focus with every Sendmail call, i.e. moves to the front. But I need to execute it in background. I use WinNT 4, Outlook 2000 and Exchange Server 2000. What should I change?

Respond

from name and address
    Dave Beseke (Dec 7 2001 9:13PM)

I'm using Outlook 2000 on Windows 2000 server. I fill in the fromname and the fromaddress fields in the component, but it always shows the messages as coming from the default profile anyway. What am I doing wrong?
Respond

RE: from name and address
Sven Lohmann (Dec 8 2001 11:12AM)

Fromname and -address comes from the profile you are logged on.
You will have to extend the component to choose the profile by hand
before sending.

Respond

RE: RE: from name and address
Martin Busch (Jan 23 2002 10:35AM)

1. How can I extend the control to choose another profile before sending emails?

2. Is there a way to read out all profiles and select one to send?

(3. How can I send emails in richt text format?)

Thanks
Martin.
Respond

TEST
EBI SHAFEY (Aug 30 2003 2:19PM)

HOW CAN I MAKE A SHORTCUT IN DESKTOP AND START MENU
Respond

RE:what is the mapi?
ebi shafey (Sep 7 2003 2:21PM)

i have a problem with send a email with mapi
please say me about problem
Respond

RE: RE: It would be good.
zlst zlst (Mar 30 2004 10:35AM)

Delphi Bible includes a serials of application sources code that from general to advance applications,also contains some developers develop experiences and tips.

http://www.qwerks.com/product.asp?ProductID=6874
Respond

Outlook Express 5 problems?
    Liam (Sep 17 2001 2:43PM)

I'm having problems with both your component and direct MAPI calls, both installations are D6 Enterprise calling Outlook Express. On a windows 98 machine I have OE 5.00.2615.200, and on an NT4 box I have 5.00.2314.1300.

Calls to MAPISendMail on either machine are returning a USER_ABORT error message, despite the fact that I'm not even getting a chance to interact with the mail client, let alone actually taking it!

Any known problems, or thoughts as to how to rectify the situation would be greatly appreciated.

*
Respond

RE: Outlook Express 5 problems?
Jenich P. (Nov 9 2001 11:18AM)

I have this same problem with Win98 and OE5.
Respond

RE: Outlook Express 5 problems?
Stefano Vecchiato (Dec 5 2001 8:39AM)

I have seen in Mapi.pas the InitMapi procedure.
The procedure try to read, in the registry key HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows Messaging Subsystem', the string MAPI. This string must have a value of 1. If the string MAPI is not found or it has a value not equal to 1 the  LoadLibrary(PChar(MAPIDLL)) is not executed.
In a PC with Outlook 2000 the string MAPI is defined and equal to 1.
In a PC with Outlook Express there is no MAPI string. If you define it and set equal to 1 the send mail is corretly executed (I hope).
Else you can try to modify the source of MAPI.PAS

procedure InitMapi;
var
  OSVersionInfo: TOSVersionInfo;
  hkWMS: HKEY;
  MAPIValueSize: Longint;
  MAPIValueBuf: array[0..8] of char;
  rType: Longint;
begin
  if not MAPIChecked then
  begin
    MAPIChecked := True;
    MAPIModule := 0;

    OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
    GetVersionEx(OSVersionInfo);
    if (OSVersionInfo.dwMajorVersion > 3) or
      ((OSVersionInfo.dwMajorVersion = 3) and
       (OSVersionInfo.dwMinorVersion > 51)) then
    begin
      MAPIValueSize := sizeof(MAPIValueBuf);
      if RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows Messaging Subsystem',
        0, KEY_READ, hkWMS) <> ERROR_SUCCESS then Exit;
//      if RegQueryValueEx(hkWMS, 'MAPI', nil, @rType, @MAPIValueBuf,
        @MAPIValueSize) <> ERROR_SUCCESS then Exit;
      RegCloseKey(hkWMS);
//      if not ((MAPIValueBuf[0] = '1') and (MAPIValueBuf[1] = #0)) then Exit;
    end
    else if GetProfileInt('Mail', 'MAPI', 0) = 0 then Exit;

    MAPIModule := LoadLibrary(PChar(MAPIDLL));
  end;
end;


Respond

Body : Tstrings instead of string ?
    chris gheysen (Jul 25 2001 5:39PM)

This is a great component, however one thing confuses me.

I think the body should be of type Tstrings (like a memo-component) and not just string.

Am I wrong ?  Please give me your opinions.  What can I do to alter the code so that the contents of a Tmemo-component can be assigned to the body of the TMapicontrol ?

Thanks in advance,

Chris
Respond

RE: Body : Tstrings instead of string ?
Sven Lohmann (Aug 4 2001 10:16AM)

Of course, this is possible. Just treat every string as TString.Text and you will receive what you need.

Bye,
  Sven
Respond

Sign and encrypt
    Fatima Felaar (Jun 5 2001 7:30AM)

Is there any way that one can use MAPI with Outlook Express to sign and encrypt an email message?
Respond

RE: Sign and encrypt
Sven Lohmann (Jun 7 2001 2:32AM)

The only way so far is to encrypt the message text by your own programm and pass the encrypted/signed message to the messaging API as "Body". There is no extra interface in Simple MAPI.
Respond

RE: RE: Sign and encrypt
Fatima Felaar (Jul 17 2001 2:53AM)

Can you supply an example?
Respond

Attachments
    Felipe Sampaio (Jun 4 2001 1:43PM)

One question, please.

When I send mails to outlook with an EXE (a self-extract file) attached, there are no problems. But when I try to send to an Web-Mail (like Hotmail), then the attached file show ATTACH3 (with no extension). What's wrong?
Respond

RE: Attachments
Sven Lohmann (Jun 4 2001 2:09PM)

I already heard of this strange behaviour. I am using web.de for my private stuff - no problems. Is it possible that other extensions are show an just EXE extensions are blocked (I mean some strange anti-virus behaviour by hotmail) ?
Respond

RE: Attachments
Joe Lomas (Sep 9 2004 10:09PM)

I get the same results when sending .pdf or .xls files to Hotmail, but not to Yahoo mail. Some of my customer receive attach3 or no attachment at all. What causes this? How can it be fixed? I am using Exchange 5.5 server. This happens weather I use Outlook clients or OWA.
Respond

RE: Attachments
Gil Handy (Nov 24 2004 8:00PM)

The problem lies on the Exchange Server. I went into the "Internet Mail Service" and then into the "Advanced Options" on the "Internet Mail" tab. There should be an option that refers to sending items in Microsoft Rich Text Formatting. I believe it defaults to "always", but I changed that to "never" and now all attachments to outside recipients go through fine.
Respond

is there another way?
    Tobias Schneider (May 6 2001 1:57PM)

Hi Sven!

This component is a really good one.

Excuse me, but my English isn't very good, but there's a problem:

But I'm not sure, if I'm using it in the right way.
Everytime when I write such a thing like "MAPIControl1.Sendmail;"
Outlook Express is "fetching" (or "catching") the Mail. So my application is just sending the mail to Outlook Express.  So I ask you if this is intentional? I'm searching for a component or method to send mails without another application like Outlook Express.
(i just want to send the mail directly...)

Please help me!

(and excuse my bad English)
Respond

RE: is there another way?
Ian Spencer (May 8 2001 3:32PM)

Tobias

I think you should look at this one:
http://www.delphi3000.com/articles/article_1243.asp.

Regards
Ian Spencer.
Respond

RE: RE: is there another way?
KingNet KingNet (Jun 2 2001 1:45AM)

Yes, There is. You can use NMSMTP. This componenet is very easy to use and powerfull. It is not calling Outlook or another mail program, it is sending mails from your application...
Respond

RE: RE: is there another way?
KingNet KingNet (Jun 2 2001 1:46AM)

Yes, There is. You can use NMSMTP(In "FastNet" Directory). This componenet is very easy to use and powerfull. It is not calling Outlook or another mail program, it is sending mails from your application...
Respond

RE: RE: RE: is there another way?
Sven Lohmann (Jun 2 2001 4:27AM)

And there is another (not ActiveX). Use ICS or ICS2 from the following link. It is a great collection of Winsock Components and only requires a postcard to register. Here is the link:

http://users.swing.be/francois.piette/new-index.html

Kingnet you are at Microsoft ? Could you provide some more MAPI stuff to the community ? :-))

Regards,
  Sven
Respond

Compatibility with Groupwise
    Peter Crawford (Apr 29 2001 6:19PM)

What a wonderful component.

My employer uses Novell Groupwise version 5.5.3.1 and the component works OK !

Respond

Mapi and HTML / RTF
    Rod Bracher (Apr 26 2001 4:51AM)

I know there were some comments further down on this page about HTML/RTF, but nothing conclusive yet. Can anyone send a mail using HTML format via Mapi yet ??
Respond

RE: Mapi and HTML / RTF
Martin Barreda (Apr 30 2001 4:43PM)

I can't, but i need to, urgent!!!
I need to send an email which content is an html file, with background and images...

Respond

RE: RE: Mapi and HTML / RTF
Martin Busch (Jan 23 2002 10:38AM)

Me too !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Please help me!!!!!!!!!!!!!!!!!!!!!!!!
Respond

Outlook express 5.5 problem
    Moisés Corá (Apr 18 2001 2:50PM)

Worked fine for me in W95, W98, NT4 andW2K, but only with OE 5.0

My boss computer has the OE 5.5 and din't work. I'm trying to use a different set of sendmail flags, but nothing till now. Somebody can help me?
Respond

RE: Outlook express 5.5 problem
Moisés Corá (Apr 18 2001 3:30PM)

I belive that the combination NT4 + OE 5.5 is the problem. I tested with WME and W95 with OE 5.5 and it worked. Can my problem is a bad instalation? Sugestions for the flags??
Respond

Does not work on NT 4 workstation
    francis fan (Apr 2 2001 12:38AM)

It work fine on windows 2000 and NT Server but not on NT 4 workstation with sp5.
Always get Mapi_E_User_Abort, the dialog does not pop up.

Respond

RE: Does not work on NT 4 workstation
Thomas Devallé (Apr 25 2001 6:54AM)

Sure it works on NT 4 Workstation ! Try to install SP 6.0.
Respond

Delay transmission
    Peter Snooze (Mar 22 2001 2:53AM)

Hello,

this worked fine for me. Thanks a lot. But id there any way to delay transmission so that the e-mail is sent at a speciefied time?

Thanks - Peter
Respond

RE: Delay transmission
Sven Lohmann (Mar 24 2001 1:35AM)

There is a possibillity inside MAPI, I already had a close look at the whole API, but these structures and most of the procedures are not in the mapi-unit provided by Borland. If you do not want to wait until I have some time again, get yourself a copy of MSVC 6 and take a look at the mapi header files and the samples. There are huge possibillities to handle MAPI based messages but it really won't be easy.

Bye,
Sven
Respond

Just wanna say thanks!
    Sven Dawitz (Mar 19 2001 11:00AM)

That was just the component i was looking for - using mapi and popping the default mail program open!

Thanks for this easy to use component! (I really wonder, why there isnt a default MAPI component in delphi, but all the outlook active-x stuff ?)

btw: the only think, i would like to see, is attaching files directly, without saving them to disk - but i guess, mapi doesnt support that!
Respond

Is it possible to pass a stream as an attachment?
    Ken Bell (Mar 16 2001 4:21AM)

Hi out there.

In the programm I´m developing is a report created as a stream. Users wish to send this report to somebody by email. Now i would like to know, if it is possible to pass a stream to MAPI. The Users don´t have the rights to create files...

thx Ken
Respond

RE: Is it possible to pass a stream as an attachment?
Sven Lohmann (Mar 16 2001 4:45AM)

I have no idea about Streams and MAPI, anyway: Save the stream as a file and attach it. Stream will surely not work, especially not using the component.

Bye,
  Sven
Respond

MAPI Component Memory Leak
    Ken Halliwell (Feb 27 2001 2:12PM)

Sven,

Memory allocated for Attachments is never freed.  This can be fixed by checking for allocated memory in the 'finally' statement, and, if allocated, then call FreeMem as shown below.

if Assigned(Attachments) then
    FreeMem(Attachments,MapiMessage.nFileCount * size (TMapiFileDesc));

For this to work, I modified the Atttachments handling as follows:

        //process attachments
        nFileCount := FAttachedFileName.Count;
        if nFileCount > 0 then begin
          GetMem(Attachments,nFileCount * sizeof(TMapiFileDesc));
          PAttach := Attachments;

          //setup the display names -- without path
          for i := 1 to FAttachedFileName.Count do begin
            FDisplayFileName.Add(ExtractFileName(FAttachedFileName[i - 1]));
          end;

          //pass attached file name and path to the Attachments structure
          for i := 1 to FAttachedFileName.Count do begin
            //Assign complete Path
            PAttach^.lpszPathName := PChar(FAttachedFileName.Strings[i - 1]);
            //Assign display name
            PAttach^.lpszFileName := PChar(FDisplayFileName.Strings[i - 1]);
            PAttach^.ulReserved := 0;
            PAttach^.flFlags := 0;
            //Position needs to be -1; see the WinApi Help for details
            PAttach^.nPosition := Cardinal(-1);
            PAttach^.lpFileType := nil;
            Inc(PAttach);
          end;
          lpFiles := Attachments;
        end;

Respond

RE: MAPI Component Memory Leak
Sven Lohmann (Jun 2 2001 4:29AM)

Thanks a lot, I already fixed the leak.
Respond

send with postoffice not in POP3
    LiTTLeJoE (Feb 12 2001 10:11PM)

i've try and i found a great think by using MAPIControl.
There's one question in my mind : how to send an email without SMTP but using postoffice (Internal email).

thank's for helping me.

LiTTLeJoE
Respond

RE: send with postoffice not in POP3
Sven Lohmann (Feb 13 2001 2:30AM)

You just have to adress the recepient by another way than SMTP: (in code). Or try a lookup of the recepient using the mapi functions (mentioned somewhere in the comments...)

Regards,
  Sven
Respond

RE: RE: send with postoffice not in POP3
Andy Vines (Feb 19 2001 5:52AM)

This is what I am trying to do as well, great component nice and simple. But I need to be able to send internal MS Mail messages.

Has anyone got any ideas how it can be done, tried without the SMTP bit and that just causes outlook to try to send a message straight away but still has SMTP.

What format doe MS mail use?

If I type in one of my MS Mail user names, the message is trying to be sent via smtp which is not right.

Andy VInes
Respond

RE: RE: RE: send with postoffice not in POP3
Steve Harris (Feb 27 2001 5:56PM)

Hi,

The answer to your problem is to re-configure the Exchnage client to use the MSMail service and not SMTP.  I think you'l find it in Tools -> Services.

Cheers - Steve
Respond

Nice Component
    Mitch Godfrey (Jan 22 2001 5:06PM)

I have been having trouble with a commercial component that works on some systems and not on others.
This one seems to work everywhere.
Thanks, its great!
Respond

Problem with more then one recpients
    Andreas Hoerig (Jan 15 2001 8:48AM)

If you have more then one recipient, then the component is using the pointer for the lpszaddress incorrectly.
The Problem is in the line, where the string 'SMTP:' and the mail-address are copyed in the lpszAddress, because the String 'SMTP:' has everytime the same memoryaddress.
I have fixed it with the StrNew function:

PRecip^.lpszAddress:=StrNew(PChar('SMTP:' + FTOAdr.Strings[i - 1]));

In the finally, i am disposing the memory of the allocated string with:

finally
    PRecip:=Recipients;
    for i:=1 to MapiMessage.nRecipCount do
    begin
      StrDispose(PRecip^.lpszAddress);
      inc(PRecip)
    end;
    FreeMem(Recipients, MapiMessage.nRecipCount * sizeof
                   (TMapiRecipDesc));
end;

Respond

MError always SUCCESS_SUCCESS
    Atle Timland (Jan 3 2001 6:02PM)

I hawe implemented your unit, and it's working great. except in one important matter.

It's imortant for me to check if the mail is realy sendt.

The MError:= MapiSendMail always give MError = 0 (SUCCESS_SUCCESS).
I have stopped the sending in several different ways, and i always get MError = 0.

Once i had a similar problem with windows messaging.
When the receiver of message was in an underlaying object, and not on the actual form. windows did not reach the retrieving function.
Could this be the case here also ?

I would appreciate any comments.

Timmi

Respond

RE: MError always SUCCESS_SUCCESS
Sven Lohmann (Jan 4 2001 1:38AM)

I received this as well on Windows9x and Windows NT with Outlook < 2000. Actually - under Win2K with Outlook 2K - the correct Error Code is returned.
Perhaps it is just another MAPI - Bug ?

Regards,
  Sven
Respond

Can I send mail without pop up logon dialog everytime ?
    Jimmy (Dec 15 2000 4:56AM)

    Thanks for this great component !!  It  saves  me  lots  of  time !!
But, if  there  is  no MAPI session at present  when I use "sendmail" method , it pops up a logon  dialog , it`s O.K. .   While  it still  pops up dialog  if  I  use  "sendmail"  again . I  think  it  will  disturb users.
Can I  logon once ( if  there  is  no present session ) , and  keep  the  session  for  later  process ?
By the way , why  I  always  get  a  return value of  "MAPI_E_FAILURE"  after I call MAPILogon  ?
And  why  I  could  not  call  MAPILogonEx ?
Could  you  give  some  example ?
Thanks.

Respond

RE: Can I send mail without pop up logon dialog everytime ?
Sven Lohmann (Dec 15 2000 5:59AM)

At the end of the component source you will see the MapiSendMail call.
Here is a sugestion to create a shared session of the default profile (if you have set one!):

    if FShowDialog then
      // Old Line: MError := MapiSendMail(0, AppHandle, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI MAPI_NEW_SESSION or MAPI_USE_DEFAULT, 0)
      MError := MapiSendMail(0, AppHandle, MapiMessage, MAPI_SIMPLE_DEFAULT, 0)
    else
      MError := MapiSendMail(0, AppHandle, MapiMessage, 0, 0);

MAPI_SIMPLE_DEFAULT is defined as MAPI_LOGON_UI or MAPI_FORCE_DOWNLOAD or MAPI_ALLOW_OTHERS (see mapi.pas for details). If you need an explicit session you will nedd to write some code to logon to a session (MapiLogon -> mapi.pas) and provide the session identifier to MapiSendMail (first arguement).
Thats it.
Respond

RE: RE: Can I send mail without pop up logon dialog everytime ?
Jimmy (Dec 15 2000 6:16PM)

Thanks for your instruction .
I  have  tried  to  do  that  before  I  post  the  question .
But , I  always  fail  to  logon  a  MAPI session , the  following  source  code  is  how  I  use  MAPILogon  method :

procedure TFrmSend.BtnLogonClick(Sender: TObject);
var i : integer;
    ssRes : int64;
    MySession : PLHandle ;
begin
  MySession:=nil;
  ssRes:= MAPILogon( 0, nil , nil , MAPI_LOGON_UI , 0 , MySession );
...........
...........
end;

And , how  do  I  know  whether  there  is  an  MAPI  session  at present ?
Because , users  would  not  like  to  logon  if  the  Outlook  is  executing  now .

Thanks.
Respond

Can we Include HTML Code in the mail message like Outlooks OLE HtmlBody
    Johannes (Nov 29 2000 3:51AM)

Hi there,.
I want to know if we can Include HTMl Code in the message
like in Outlooks OLE object HTMLBody property ???

Is this possuble with the MAPI ?, This will be a Bonus,
AND

Can we have a way how we can DETECT all MAPI Complaint E-Mail
programs and the select one and say use that one.

this will be a major bonus @!!

Thanks in Advance and for contribution

Thanks
Johannes
Respond

RE: Can we Include HTML Code in the mail message like Outlooks OLE HtmlBody
Sven Lohmann (Dec 2 2000 3:38AM)

Hi Johannes,

I have seen a MAPI property/constant to tell MAPI of a RTF body. I could imagine a simillar way to define a HTML body. Perhaps it is
created from a file. I will take a look.

Your second question: This feature is supported by Windows out of
the registry. You will need to take a look at the registry where IE
looks for the list of programs to show in its options dialog. Then build a list, let the user choose, set the chosen app to the registry, handle email and restore the registry value afterwards. Thats is not a feature for a MAPI component.
Respond

Can we Include HTML Code in the mail message like Outlooks OLE HtmlBody ??
CHAYAH Imed (Feb 16 2001 11:22AM)

Hi there,.
I want to know if we can Include HTML Code in the message
like in Outlooks OLE object HTMLBody property ???

Thanks a lot ...

-- CHAYAH Imed --

Respond

RE: Can we Include HTML Code in the mail message like Outlooks OLE HtmlBody ??
Martin Barreda (Apr 30 2001 4:46PM)

Please if anyone knows that, i need it urgent!!!
Thanks you all
Respond

e-mail using MAPI
    Paul Davis (Nov 15 2000 8:57PM)

Thanks for this - I'll try it now - but (and this may seem a little ungrateful, for which I aplogise) could you please point me to where I can find out how to use the Outlook MailItem component on the servers page on Delphi 5 - I got the word application working (as per the manual) but the MailItem just says 'unregistered class when I try to use it, and I can find no more info anywhere! I have a need to e-mail to Outlook users from my Delphi Application, and also to add Outlook tasks for them. Any help,m gratfully appreciated.

Respond

RE: e-mail using MAPI
Sven Lohmann (Nov 16 2000 2:10AM)

No need to apologise, that is what is d3000 for:
Take a look at http://www.delphi3000.com/article.asp?id=1424.
Respond

great MAPI component!
    Todd Eischeid (Oct 26 2000 2:22PM)

I think this component is great. I thought I was going to have to weed through the MS MAPI SDK, but this saves me a TON of work by enabling me to do exactly what I want very easily:  send e-mails and attachments with MAPI, via a Delphi component.

Thanks for the component and Viva la Delphi!
Respond

Sending Rich text !!!
    Alexandre Brancante (Oct 26 2000 7:56AM)

Sven,

    Thanks for this article. I have a question. My e-mail application must have its message body in RTF(Rich Text Format) , do you know how can I do it using MAPI?
Respond

RE: Sending Rich text !!!
Sven Lohmann (Nov 16 2000 2:45AM)

I would try to assign the rich text to the body string and leave the handling to Outlook. Perhaps this works.
Respond

RE: Sending Rich text !!!
Patrick Charles (Feb 22 2001 1:42PM)

Hi,

did you get an answer that works on this one?  I would be interested too.
Thanks

Patrick
Respond

RE: RE: Sending Rich text !!!
Sven Lohmann (Feb 22 2001 2:45PM)

Sorry, I did not found any hint on RichText yet. I read MSDN and many other articles - no valuable hint at all. Anyone else, perhaps ?
Respond

Divide By Zero Problem under Win2000 Server
    Marc (Oct 26 2000 12:50AM)


Have installed and used this component without any problems under Windows 95,98 & NT
However when trying to send e-mail under Windows 2000 Server, a Divide by zero error message is returned.

Any suggestions???

Regards,
Marc
Respond

RE: Divide By Zero Problem under Win2000 Server
Sven Lohmann (Nov 16 2000 2:46AM)

Have you traced the exception ? Where does it raise ?
Respond

Problem with Recipient List
    Ron Malizia (Oct 18 2000 4:51PM)

Sven,

Thanks for the email component, it has saved me quite a bit of time verses attempting to make it myself.  

Question: the component appears to work perfectly until I attempt to send an email to more than one 'To' address or to more than one 'CC' address.  Within my app. I set ShowDialog to True so when the app attempts to send the email, outlook-2000's new email editor appears with my message, but within the 'To' field two duplicate addresses appear rather than the two desired address. the same holds for the 'CC' field.
I have tried to debug my app, and as far as i can tell, your component and my app is working fine...its once the MAPI unit takes over is where things appear to run a stray....

Any thoughts?

Also, in the beginning of your article, you mention using the 'ShellExcute' with a myster command to send an email...what command line/executable are you referring to?

Many thanks
Ron Malizia
Grays Harbor County
Respond

RE: Problem with Recipient List
supri (Oct 24 2000 3:13AM)

can you tell me how to use this unit
Respond

RE: RE: Problem with Recipient List
Sven Lohmann (Oct 25 2000 2:45PM)

Supri, simply copy the text to a unit, eg. myMapi.pas, add it to a package (eg. myMapiUnit.dpk) and (re-)install the package.
You will receive a component to drop on a form. I hope this helps.

Sven
Respond

RE: Problem with Recipient List
Sven Lohmann (Oct 25 2000 2:43PM)

Dear Ron,

I will have a look at it. The myster ShellExecute ist simply somthing like this: ShellExecute("mailto:me@localhost", ?, ?). Sometimes this short version is enough to send simple emails.
If I gather informations on the other questions I will contact you by email.

Sven
Respond

RE: Problem with Recipient List
Jason C. Lamb (Jan 11 2001 12:45PM)

I am also having the problem, when I specify the MapiControl1.FromName and FromAdress I get a duplicate in the TO: field. I am using Outlook 2K on Windows 2K Server.
Respond

Problems with TStrings properties
    Eugene Mayevski (Aug 28 2000 5:41PM)

Note for users:
when using the code, be sure to either make TStrings properties public and set your stringlists to these properties, or change TStrings to TStringList and do other changes to the code. The fix will be sent to the author.

Respond

RE: Problems with TStrings properties
Sven Lohmann (Aug 31 2000 10:17AM)

Fixed with your suggestions, thanks!
Respond

bug in article
    Mike Shkolnik (Aug 17 2000 4:01AM)

Sven,

in your article you used the SMTP as transport for messages but you must in recepient address to add the normal email and call the MapiResolveName for resolving of name. In this case you can send a message via any installed transport (SMTP, POP3 etc)

With best regards, Mike Shkolnik.
E-Mail: mshkolnik@rs-ukraine.kiev.ua
        mshkolnik@yahoo.com
WEB: http://www.scalabium.com
SMComponents Mailing list: http://www.onelist.com/subscribe/SMComponents

Respond

RE: bug in article
Sven Lohmann (Aug 31 2000 10:22AM)

Mike,
thanks for your comment, I would not treat this as a bug. I kept it simple, of course. Anyway: How about some improvements?
I will post it here to the community.

Best Regards,
  Sven
Respond

Sending email via MAPI
    Peter (Aug 8 2000 1:18PM)

Sven,
normally I used to send Email via then MAPI-interface but with an OLE/COM link with MS Outlook it`s much faster and easier to send mails. Did you kwow that speed advantedge ?
Kind regards, Peter
Respond

RE: Sending email via MAPI
Alessandro Maiani (Aug 9 2000 5:23AM)

Peter,
I need to send an e-mail using MAPI and I tried the component of Sven. I had some troubles. Now, I am in a little hurry. Could you please send me an example of how to use COM/OLE link with MS Outlook?
Thanx.
Alessandro
Respond

RE: RE: Sending email via MAPI
Sven Lohmann (Aug 10 2000 1:52AM)

Alessandro,
you wrote of problems you experienced with the component.
Please tell me some more details after your urgent work is done, I am
interested to improve the component and the article.
Regards,
  Sven


Respond

RE: Sending email via MAPI
Sven Lohmann (Aug 10 2000 1:49AM)

Peter,

of course I now of the speed advantage, anyway not everybody likes or uses OLE/COM. And if you need to control more of the MAPI operations then just send an email, the component will help.
Regards,
  Sven

Respond

RE: RE: Sending email via MAPI
PEPS ^^ (Sep 9 2000 10:57AM)

Dear Sven,

thanks for this interesting article.
Is it really faster sending mail using COM/OLE ? I would have guessed that the late-binding mechanism takes a lot of time ... Isn't MAPI more native ?

thanks
bernhard a.

Respond

RE: RE: RE: Sending email via MAPI
Sven Lohmann (Sep 20 2000 4:30AM)

Dear Bernhard,

that depends. Of course MAPI is more native on the other hand you will
have to handle more stuff yourself. Anyway, I was often told not to use "MS features" for security reasons so this component was born.
If I find some time I will try to benchmark the different methods to tell
Windows to "compose" an email and post it here :-).

Best Regards,
Sven
Respond

RE: Sending email via MAPI
j dong (Aug 3 2001 10:22PM)

Anybody knows how to send email without using Doc/View architecture in c++? For instance, I simply want to set a timer and send email to a person when the timer expires. I don't need those menus fancy stuff.

Many thanks,

Jianpeng
Respond

RE: Sending email via MAPI
Allan Morris (Oct 3 2000 2:36AM)

Peter,
Would you also be able to send me a copy of of the OLE/Com
based approach. Not that I have any problem with Sven's contribution
but I would like to see the coding for both options before I choose
which one I use.

With this you guys will have saved me heaps of time. Much appreciated
Allan

Respond

Add HTML Code to HTML Body
johannes (Nov 29 2000 4:00AM)

I tried to add a comment a while back
so here goes again :L)

Is it possible to add HTML Code to the body of the
message as the OLE object of Outlook with the HTMLBody
property ???.
ANd is it possible to get a list
of all MAPI Complain e-Mail progs and chose one to use ??

If so it is a bonus.
thanks in advace
Johannes
Respond














 
Sign up to consume product discounts for Bronze memberships !

read more


   


  Community Ad of
D. Souchard
 
   














 







     
  Copyright © 2000 - 2007 delphi3000.com - All rights reserved. Terms of use. || Privacy
delphi3000.com is a service by bluestep.com IT-Services GmbH (Vienna)