Announcement

Collapse
No announcement yet.

Vom Druckertreiber eine Mail über den Standard-Mail-Client senden.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vom Druckertreiber eine Mail über den Standard-Mail-Client senden.

    Hallo Leute,

    seit einiger Zeit beschäftigt mich das Problem.
    Ich möchte über einen Ausdruck eine Datei als Anhang über den Standard-Mail-Client versenden. Dazu wurde in C++ ein virtueller Druckertreiber erstellt der wiederum eine DLL (in Delphi entwickelt) aufruft. In dieser DLL werden nun alle Konvertierungen vorgenommen und je nach Wunsch direkt an einen Mail-Server versand (dies funktioiert schon) oder über die Mapi an den Standard Mail Client. Folgendes habe ich schon versucht:

    ShellExecute(0,'','mailTo: [email protected]',Nil,Nil,0);
    Wenn der Mailclient geöffnet ist funktioniert es, allerdings weiß ich nicht wie es dann mit Anhang funktioniert.

    Err := MapiSendMail(0 , 0, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
    gibt was auch immer ich versuche Err = 19 "Invalid Session" zurück, egal ob ich mit der eingebundenen Mapi oder SMapi oder auf Jedi angepasst versuche. Ich nehme an das es an der Systemebene des Druckertreibers liegt. Das ausführende Programm der DLL ist "spoolsv.exe" hier unter W2K

    Nun die Frage: Was mach ich falsch ?
    Wenn ich die DLL in ein normales Programm packe und die Funktion aufrufe klappt alles wunderbar.

    Besten Dank schon mal.

    ---------------------
    Gruß Eduard(at)Demont.de

  • #2
    CoInitialize(Ex) vergessen oder Problem mit dem fehlenden User (seitens MApi)?

    - nic

    Comment


    • #3
      Hallo,

      danke Nico für Deine schnelle Antwort, nur leider mache ich anscheinen was verkehrt. Ich poste mal meine Funktion:
      <PRE>
      uses ...
      ActiveX, SMapi,
      .....

      ....
      ....

      function TForm.SendWithMapi:Boolean;
      var
      MapiMessage: lpMapiMessage;
      MError: Cardinal;
      MapiFileAtt:lpMapiFileDesc;
      MAPIRecip: lpMapiRecipDesc;
      begin
      If Not FileExists(MySendFile) Then Begin
      Result := False;
      MessageBox(0,PChar('Error : -1'+#10+'File nicht vorhanden '+MySendFile),ProgName,MB_OK Or MB_ICONERROR Or MB_SYSTEMMODAL);
      End Else Begin
      Result := True;

      CoInitialize(nil);
      TRY
      New(MAPIRecip);
      With MAPIRecip^ Do Begin
      ulReserved := 0;
      ulRecipClass := MAPI_TO;
      lpszName := PChar(MyToAdrName);
      lpszAddress := PChar(MyToAdr);
      ulEIDSize := 0;
      lpEntryID := Nil;
      End;

      New(MapiFileAtt);
      With MapiFileAtt^ Do Begin
      UlReserved:=0;
      flFlags := Mapi_Ole_Static;
      nPosition:= 0;
      LpszPathName:=PChar(MySendFile);
      LpszFileName:=Nil;
      LpFileType:=Nil;
      End;

      New(MapiMessage);
      with MapiMessage^ do begin
      ulReserved := 0;
      lpszSubject := PChar(MySubject);
      lpszNoteText := PChar(MyBody); // normalerweise sollte es Empty sein um das es aber funktioniert muß hier min 5 Leerzeichen rein.
      lpszMessageType := nil;
      lpszDateReceived := nil;
      lpszConversationID := nil;
      flFlags := 0;
      lpOriginator := nil;
      nRecipCount := 1;
      lpRecips := MAPIRecip;
      nFileCount := 1;
      lpFiles := MapiFileAtt;
      end;

      TRY
      // MError := MapiSendMail(0, Self.ParentWindow, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0); // geht auch nicht

      MError := MapiSendMail(0, 0, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);

      EXCEPT
      END;
      FINALLY
      CoUninitialize;
      Result := (MError<=MAPI_USER_ABORT) ;
      END;
      If Not Result Then MessageBox(0,PChar('MAPI Send-Error : '+IntToStr(MError)),ProgName,MB_Ok Or MB_ICONERROR Or MB_SYSTEMMODAL );
      End;
      end;
      </PRE>

      Wie ich schon oben erwähnt funktioniert dies in einem Normalem-Desktop-Programm.

      Danke schon mal für Euer Bemühen.

      Gruß Eduard(at)Demont.d

      Comment


      • #4
        Gegenfrage, wer soll bei MAPI_DIALOG und/oder MAPI_LOGON_UI den Dialog sehen/ausfüllen? (der Service ist sicher nicht interaktiv und wird somit in einer anderen Window Station ausgeführt).

        - nic

        Comment


        • #5
          Hallo Nico,

          der Druckertreiber ist so ausgelegt das er nur Local verwendet werden kann. Ich hoffe das man diese Problem irgendwie lösen kann. Der Anwender Druckt über diesen virtuellen Druckertreiber und bekommt den Druck gleich als Anhang an ein Mail worin er ev. nurnoch einen Eintrag im TO: vornimmt und Abschickt.

          Gruß Eduard(at)Demont.d

          Comment


          • #6
            Hallo,

            zum Versenden von emails mit Anhang von BMP-Dateien verwende ich seit Delphi 5 die Delphi-Unit MAPI mit dem Aufruf

            status := MAPISendMail( fMAPISession, Application.Handle, Msg, MAPI_Dialog, 0 );

            Das funktionierte immer.

            Nach der Umstellung von Delphi 5 auf Delphi 7 funktioniert das auch für Microsoft Outlook Express, aber nicht
            bei Outlook 2000. Es wird der Status 11 zurückgegeben mit der Fehlermeldung

            The specified attachment was not found. No message was sent.

            Was hat sich geändert und wer weiß Rat? Für eine Antwort wäre ich sehr dankbar.

            Mit freundlichen Grüßen

            Dieter Huttanu

            Comment

            Working...
            X