hvis du skal sende via outlook exp, kan du gøre som en browser går, hvis du går ind på en hjemme side og trykker på besked til webmaster eller sådan noget, så starter den din std. mail, med pre udfyldte felter, det samme kan du gøre med shellexecute kaldet fra delphi, når du trykker på en knap, shellexecute kan du søge hjælp til herinde, det er der masser af svar på, du skal så skrive mailto:xxxxxx der hvor man normalt skriver det filnavn man skal execute, så kører det.
{ 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);
{ 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)
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;
steen erik.... den lange kode er et component som du skal registrere for at installere den i din IDE. Hvis du ikke er klar over det... ikke for at blande mig "ss"
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.