Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   MapiSendMail, Festellen welcher Empfänger angegeben wurde (https://www.delphipraxis.net/172746-mapisendmail-festellen-welcher-empfaenger-angegeben-wurde.html)

norwegen60 20. Jan 2013 15:27

MapiSendMail, Festellen welcher Empfänger angegeben wurde
 
Hallo,

ich verschicke per
Delphi-Quellcode:
function TuHilfs1.SendEMail(Handle: THandle; var Mail: TStringlist): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
  sTo : PAnsiChar;
begin
  dwRet := MapiLogon(Handle,
    PAnsiChar(''),
    PAnsiChar(''),
    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(PAnsiChar(AnsiString(Mail.Values['to'])));
      Receip.lpszAddress := StrNew(PAnsiChar(AnsiString('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(PAnsiChar(AnsiString(FileName)));
        Attachments[i1].lpszFileName :=
          StrNew(PAnsiChar(AnsiString(ExtractFileName(FileName))));
        Attachments[i1].lpFileType := nil;
      end;
      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := @Attachments^;
    end;

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

    WndList := DisableTaskWindows(0);
    try
    { Achtung MaQMa ist nicht bedienbar, bis die Mail wieder geschlossen ist }
    Result := MapiSendMail(MAPI_Session, Handle, MapiMessage,
        MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
    finally
      sTo := Receip.lpszName; //:= StrNew(PAnsiChar(AnsiString(Mail.Values['to'])));
      Mail.Values['to'] := sTo;
      sTo := Receip.lpszAddress; //:= StrNew(PAnsiChar(AnsiString(Mail.Values['to'])));
      Mail.Values['to'] := sTo;
      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, 0, 0);
  end;
end;
und das funktioniert in so weit auch ganz gut. Durch das Öffnen des Outlook-Fensters hat der Anwender noch die Möglichkeit, weitere Empfänger einzufügen. Wie kann ich jetzt feststellen, welches die letztlich verwendeten Empfänger waren? In Receip.lpszName stehen immer noch nur die, die ich eingefügt habe

Danke für eure Tips
Gerd

Tyrolean 23. Jan 2013 07:59

AW: MapiSendMail, Festellen welcher Empfänger angegeben wurde
 
Hallo!

Zitat:

Zitat von norwegen60 (Beitrag 1199899)
und das funktioniert in so weit auch ganz gut. Durch das Öffnen des Outlook-Fensters hat der Anwender noch die Möglichkeit, weitere Empfänger einzufügen. Wie kann ich jetzt feststellen, welches die letztlich verwendeten Empfänger waren? In Receip.lpszName stehen immer noch nur die, die ich eingefügt habe

Danke für eure Tips
Gerd

Soweit ich weiss geht das über MAPI alleine nicht (Aussage von Peter Wolters von Rapware.nl). Mit Mapi-Extended sollte das gehen, dass du nach dem übergeben der Mail und nachdem der User Send gedrückt hat du dir die Mail wieder vom Outlook holst und dann deine zusätzlichen Empfänger abfragen kannst.

Falls du das hinbekommst, wäre ich froh um eine kurze Nachricht, den sowas bräuchte ich auch :)

Gruß aus den Bergen
Günter

soulies 23. Jan 2013 14:58

AW: MapiSendMail, Festellen welcher Empfänger angegeben wurde
 
hoi,

du könntest evtl. auch MAPIAddress zusätzlich aufrufen.

Das öffnet den Dialog zum hinzufügen von Empfängern.
Du kannst deine Liste übergeben und anzeigen und erhälst am Ende
eine finale Liste (also falls der User einen Empfänger hinzugefügt hat).

in etwa so ...
Delphi-Quellcode:
    if Mail.Values['to'] <> '' then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := StrNew(PAnsiChar(AnsiString(Mail.Values['to'])));
      Receip.lpszAddress := StrNew(PAnsiChar(AnsiString('SMTP:' + Mail.Values['to'])));
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;

    MapiAddress( MAPI_Session,
                 Handle,
                 'Empfänger',
                 1,           // ein Textfeld nur fuer "To"
                 '',
                 1,           // deine bisherige anzahl
                 Receip,      // deine bisherige liste
                 0 ,
                 0 ,
                 @new_count,  // neue anzahl
                 new_list );  // neue liste
    MapiMessage.nRecipCount := new_count ;
    MapiMessage.lpRecips := new_list;

    AttachCount := 0;
vielleicht kannst Du damit weiter arbeiten.


cya


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz