Entwickler-Ecke

Internet / Netzwerk - Mail an Standard-Mailclient übergeben


MarWestermann - Do 17.04.08 19:24
Titel: Mail an Standard-Mailclient übergeben
Hi,

ich hab ein kleines Problem und finde dazu einfach keine Lösung.

Ich möchte einfach eine Mail an den Standard-Mail-Client übergeben. So dass dort die einzelnen Felder An, Bcc, Betreff und Text schon vorausgefüllt sind und ich nur auf senden klicken muss.

Kennt jemand ne Klasse / Methode, mit der das geht?

Wäre für jeden Rat dankbar.

Gruß Marco Westermann


Moderiert von user profile iconNarses: Topic aus Algorithmen, Optimierung und Assembler verschoben am Do 17.04.2008 um 22:20
Moderiert von user profile iconAXMD: Topic aus Dateizugriff verschoben am Fr 18.04.2008 um 13:43


chrisdrury - Fr 18.04.08 07:57

Versuchs doch mal mit ShellExecute...
Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
  s := 'mailto: meier@bla.de; mueller@bla.de?subject=Eine Mail mit ShellExecute'
       + '&Body=Dies ist der text der mail,%0Aauch mit zeilenumbruch.' +
       '%0A%0AGruß %0AAbsender';
  if ShellExecute(Application.Handle, 'open', PChar(s), NIL,NIL, SW_SHOWNORMAL) > 32 then
  ShowMessage('Mail gesendet!');

Ach ja, nicht vergessen die Unit ShellApi in die uses aufzunehmen... :wink:


Chatfix - Fr 18.04.08 08:49

Ich hab da früher auch mal so einen Fall gehabt.
Mit der Lösung solltest du auch Anhänge ranhängen können.


Delphi-Quelltext
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:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Mapi, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal; 
type 
  TAttachAccessArray = array [0..0of TMapiFileDesc; 
  PAttachAccessArray = ^TAttachAccessArray; 
var 
  MapiMessage: TMapiMessage; 
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray; 
  AttachCount: Integer; 
  i1: integer; 
  FileName: string
  dwRet: Cardinal; 
  MAPI_Session: Cardinal; 
  WndList: Pointer; 
begin 
  dwRet := MapiLogon(Handle, 
    PChar(''), 
    PChar(''), 
    MAPI_LOGON_UI or MAPI_NEW_SESSION, 
    0, @MAPI_Session); 

  if (dwRet <> SUCCESS_SUCCESS) then 
  begin 
    MessageBox(Handle, 
      PChar('Error while trying to send email'), 
      PChar('Error'), 
      MB_ICONERROR or MB_OK); 
  end 
  else 
  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'])); 

    WndList := DisableTaskWindows(0); 
    try 
    Result := MapiSendMail(MAPI_Session, Handle, 
      MapiMessage, MAPI_DIALOG, 0); 
    finally 
      EnableTaskWindows( WndList ); 
    end

    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); 
    MapiLogOff(MAPI_Session, Handle, 00); 
  end
end

procedure TForm1.FormActivate(Sender: TObject);
var 
  mail: TStringList;
  i: Integer; 
begin
  mail := TStringList.Create; 
  try
    mail.values['to'] := 'Receiver-Email@test.xyz';
    mail.values['subject'] := 'Hello';
    mail.values['body'] := 'blah';    
    for i := 1 to ParamCount do
    begin
      mail.values['attachment' + IntToStr(i - 1)] := ParamStr(i)
    end;
    sendEMail(Application.Handle, mail);
  finally 
    mail.Free;
  end;
  Close;
end;


In dem Beispiel werden als Parameter übergebene Dateien angehängt.