Solved

ShellExecute... to start my email-client...

Posted on 2000-02-16
2
409 Views
Last Modified: 2010-04-04
Hello !
With my code here i can start my email-client with the parameters 'subject' and 'mailto'.:
//------------------------------
procedure TForm5.Button2Click(Sender: TObject);
var
s : String;
e : String;

begin
e := 'Ingo.Schmoekel@t-online.de';
s := 'mailto:'+e+'?subject=Vielen Dank...!';
ShellExecute(hinstance,'open',PChar(s),nil,nil,SW_SHOWNORMAL);
end;
//--------------------------

Is it possible to send more parameters? ...I need 'Body or so' for the whole email-text and something for an attached file?!
Thank's a lot for a code-sample or even any tip!

Sincerly,
Ingo Schmökel



0
Comment
Question by:Schmoekel
2 Comments
 
LVL 12

Accepted Solution

by:
rwilson032697 earned 200 total points
ID: 2526374
You can add body text like this in a shell execute command:

s := 'mailto:'+e+'?subject=Vielen Dank...!?Body=Some text';

Unfortunately you can't use shellexecute to attach files to a mail message. Below are a couple examples using MAPI and the SakEmail component to compose and send mail using attachments.

The TNMSMTP component shipped with Delphi can also do this (though I do not have a code sample to hand).

uses mapi;

function SendEMail(Handle :THandle;Mail :TStrings) :Cardinal;
 type
   TAttachAccessArray    = array [0..0] of TMapiFileDesc;
   PAttachAccessArray    = ^TAttachAccessArray;
 var
   MapiMessage : TMapiMessage;
   Receip      : TMapiRecipDesc;
   Attachments : PAttachAccessArray;
   AttachCount : Integer;
   i1          : integer;
   FileName    : String;

 begin
   fillChar(MapiMessage,SizeOf(MapiMessage),#0);
   Attachments:=nil;
   fillChar(Receip,SizeOf(Receip),#0);
   if Mail.Values['to']<>'' then
   begin
     Receip.ulReserved:=0;
     Receip.ulRecipClass:=MAPI_TO;
     Receip.lpszName:=StrNew(PChar(Mail.Values['to']));
     Receip.lpszAddress:=StrNew(PChar('SMTP:' + Mail.Values['to']));
     Receip.ulEIDSize:=0;
     MapiMessage.nRecipCount := 1;
     MapiMessage.lpRecips    := @Receip;
   end;
   AttachCount:=0;
   for i1:=0 to MaxInt do
   begin
     if Mail.Values['attachment'+inttostr(i1)]='' then break;
     inc(AttachCount);
   end;
   if AttachCount>0 then
   begin
     GetMem(Attachments,SizeOf(TMapiFileDesc)*AttachCount);
     for i1:=0 to AttachCount-1 do
     begin
       FileName:=Mail.Values['attachment'+inttostr(i1)];
       Attachments[i1].ulReserved    := 0;
       Attachments[i1].flFlags       := 0;
       Attachments[i1].nPosition     := ULONG($FFFFFFFF);
       Attachments[i1].lpszPathName  := StrNew(PChar(FileName));
       Attachments[i1].lpszFileName  := StrNew(PChar(ExtractFileName(FileName
 )));
       Attachments[i1].lpFileType    := nil;
     end;
     MapiMessage.nFileCount:=AttachCount;
     MapiMessage.lpFiles:=@Attachments^;
   end;

   if Mail.Values['subject']<>'' then MapiMessage.lpszSubject
 :=StrNew(PChar(Mail.Values['subject']));
   if Mail.Values['body']<>''    then MapiMessage.lpszNoteText
 :=StrNew(PChar(Mail.Values['body']));

   Result :=MapiSendMail(0, Handle, MapiMessage,MAPI_DIALOG*Ord(Handle<>0)
 or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);

   for i1:=0 to AttachCount-1 do
   begin
     strDispose(Attachments[i1].lpszPathName);
     strDispose(Attachments[i1].lpszFileName);
   end;

   if assigned(MapiMessage.lpszSubject)  then
 strDispose(MapiMessage.lpszSubject);
   if assigned(MapiMessage.lpszNoteText) then
 strDispose(MapiMessage.lpszNoteText);
   if assigned(Receip.lpszAddress)       then
 strDispose(Receip.lpszAddress);
   if assigned(Receip.lpszName)          then
 strDispose(Receip.lpszName);
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
mail : tstringlist
begin
mail:=tstringlist.create;
mail.values['to']:='xyz@zz.com';
mail.values['subject']:='no subject';
mail.values['body']:='no subject';
mail.values['body']:='no subject';
mail.values['attachment0']:='c:\winnt\winnt256.bmp';
mail.values['attachment1']:='c:\winnt\winnt.bmp';
sendEMail(application.handle,mail);
mail.free;
end;

Or you can use something like the SakEmail component and send a mail like this:

procedure TSVOExceptForm.Button1Click(Sender: TObject);

begin
  SakSMTP1.host := 'smtp.trimble.co.nz';
   SakMsg1.CharSet := 'ISO-8859-1';    
   SakMsg1.TextEncoding := te8Bit;
       
SakMsg1.UserName := 'Fred';
   SakMsg1.From := '<Fred@fred.com'+'>';
   SakMsg1.SendTo := 'mary@fred.com';
   SakMsg1.Subject := 'Subject line';
   SakMsg1.Text.Assign(Memo2.Lines);
   SakMsg1.Text.append(' ');
   SakMsg1.Text.AddStrings(Memo1.lines);
   SakSMTP1.connect;
   if not SakSMTP1.SMTPError then
   begin
      SakSMTP1.SendTheMessage( SakMsg1);
      SakSMTP1.quit;
      ShowMessage('Message sent to '+ SakMsg1.SendTo);
   end;
end;

Cheers,

Raymond.
0
 
LVL 5

Expert Comment

by:TheNeil
ID: 2526384
I wouldn't use ShellExecute if I was you (too limited). The best way is to use the MAPI stuff or the SMTP component. Try the following (using MAPI)

uses mapi;

function SendEMail(Handle :THandle;Mail :TStrings):Cardinal;
type
  TAttachAccessArray = ARRAY [0..0] OF TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage : TMapiMessage;
  Receip      : TMapiRecipDesc;
  Attachments : PAttachAccessArray;
  AttachCount : Integer;
  i1          : Integer;
  FileName    : String;
begin
  fillChar(MapiMessage,SizeOf(MapiMessage),#0);
  Attachments:=nil;
  fillChar(Receip,SizeOf(Receip),#0);
  if Mail.Values['to'] <> ''
  then
  begin
    Receip.ulReserved := 0;
    Receip.ulRecipClass := MAPI_TO;
    Receip.lpszName := StrNew(PChar(Mail.Values['to']));
    Receip.lpszAddress:=StrNew(PChar('SMTP:' + Mail.Values['to']));
    Receip.ulEIDSize:=0;
    MapiMessage.nRecipCount := 1;
    MapiMessage.lpRecips    := @Receip;
  end;
  AttachCount := 0;
  for i1 := 0 to MaxInt
  do
  begin
    if Mail.Values['attachment'+inttostr(i1)]=''
    then
      break;
    inc(AttachCount);
  end;
  if AttachCount > 0
  then
  begin
    GetMem(Attachments,SizeOf(TMapiFileDesc)*AttachCount);
    for i1 := 0 to AttachCount-1
    do
    begin
      FileName := Mail.Values['attachment'+inttostr(i1)];
      Attachments[i1].ulReserved := 0;
      Attachments[i1].flFlags    := 0;
      Attachments[i1].nPosition  := ULONG($FFFFFFFF);
      Attachments[i1].lpszPathName := StrNew(PChar(FileName));
      Attachments[i1].lpszFileName := StrNew(PChar(ExtractFileName(FileName
 )));
      Attachments[i1].lpFileType := nil;
    end;

    MapiMessage.nFileCount := AttachCount;
    MapiMessage.lpFiles := @Attachments^;
  end;

  if Mail.Values['subject'] <> ''
  then
    MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
  if Mail.Values['body'] <> ''    
  then
    MapiMessage.lpszNoteText
 := StrNew(PChar(Mail.Values['body']));

  Result := MapiSendMail(0, Handle, MapiMessage,MAPI_DIALOG*Ord(Handle<>0)
 or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);

  for i1 := 0 to AttachCount-1
  do
  begin
    strDispose(Attachments[i1].lpszPathName);
    strDispose(Attachments[i1].lpszFileName);
  end;

  if assigned(MapiMessage.lpszSubject)  
  then
    strDispose(MapiMessage.lpszSubject);
  if assigned(MapiMessage.lpszNoteText)
  then
    strDispose(MapiMessage.lpszNoteText);
  if assigned(Receip.lpszAddress)      
  then
    strDispose(Receip.lpszAddress);
  if assigned(Receip.lpszName)          
  then
    strDispose(Receip.lpszName);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  mail : TStringList
begin
  mail := TStringList.Create;
  mail.values['to']:='xyz@zz.com';
  mail.values['subject'] := 'no subject';
  mail.values['body'] := 'no subject';
  mail.values['body'] := 'no subject';
  mail.values['attachment0'] := 'c:\winnt\winnt256.bmp';
  mail.values['attachment1'] := 'c:\winnt\winnt.bmp';
  sendEMail(application.handle, mail);
  mail.free;
end;

The Neil

0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Syntax Check Delphi Seattle IOS app without MAC ? 1 105
Communication Between RC4 Delphi <-> PHP 3 123
Printing problem 2 102
How to debug For loops? 3 57
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question