[delphi] attachment met OE

Pagina: 1
Acties:

  • leerling
  • Registratie: Maart 2002
  • Nu online
ik wil in mijn source het standaard emailprogramma aanroepen. (dus ook outlook express).

Nu kan ik met outlook express geen attachment toevoegen met shellexecute.
Ik doe dat op de volgende manier:

procedure TForm1.Button1Click(Sender: TObject);
Command: string;
begin
Command := 'mailto:test@test.com?subject=test&body=bericht&attach=' + Chr(34) + 'c:\test.zip' + Chr(34);
ShellExecute(0, nil, PChar(Command), nil, nil, SW_SHOWNORMAL);
end;

Alles doet het, behalve de attachment. Weet iemand misschien hoe ik dat op kan lossen?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Oficieel bestaat de parameter "attach" niet voor de mailto-URL, volgens de betreffende RFC (weet zo ff niet welke). Maar als je zeker weet dat OE dit zou moeten snappen, zou je kunnen proberen om \ te escapen met \\, gezien OE in C++ geschreven is.

offtopic:
Chr(34) kun je beter schrijven als '"', lijkt me wat leesbaarder.

日本!🎌


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Er is een MAPI-manier om een mail te sturen inclusief attachement. Ik heb het hier getest en 't werkt correct. Het werkt echter wel alleen met 1 attachement. Als je er meer aanhangt ziet 'ie alleen de eerste. Misschien dat ik daar nog eens aan toekom. Let wel op: je gebruikt dus Mapi (in de uses).

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
62
63
64
65
66
67
68
69
70
71
72
73
74
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;

De aanroep realiseer je als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
var
  mail: TStringList;
begin
  mail:=tstringlist.create;
  try
    mail.values['to']:='RicoDaSilva@hotmail.com';
    mail.values['subject']:='Eej Gump!';
    mail.values['body']:='Body-text';
    mail.values['body']:='Nog een regeltje';
    mail.values['attachment0']:='c:\tstfile.txt';
    sendEMail(application.handle,mail);
  finally
    mail.free;
  end;
end;

Succes ermee...

My personal website


  • leerling
  • Registratie: Maart 2002
  • Nu online
Het werkt, bedankt.

  • leerling
  • Registratie: Maart 2002
  • Nu online
ik heb zelf ook nog wat gevonden.
bij het tabblad fastnet staat het component NMSMTP.

je geeft de volgende source en hij doet het ook:

procedure TForm1.Button1Click(Sender: TObject);
begin
smtpOut.Connect;
smtpOut.PostMessage.ToAddress.Add('test@test.com');
smtpOut.PostMessage.Subject := 'onderwerp';
smtpOut.PostMessage.Body.Add('bericht');
if fileNameEdit.Text <> '' then begin
smtpOut.PostMessage.Attachments.Add(FileAttachment.Text);
end;
smtpOut.SendMail;
end;