Entwickler-Ecke

Internet / Netzwerk - Vom Druckertreiber eine Mail per Mapi senden


EDE - Mo 10.02.03 18:39
Titel: Vom Druckertreiber eine Mail per Mapi 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: irgendo(at)hin.de',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.


Delete - Mo 10.02.03 19:34

Nur mal zum Verständnis: Du leitest den Ausdruck in eine Datei um, diese willst du dann als Anhang mit dem standard Mail-Client verschicken. Ist das soweit richtig?

Wenn du nun die Datei auf der Festplatte siehst, bedeutet das ja, dass mit dem Drucken alles geklappt hat. Auch die Fehlermeldung deutet eigentlich daraufhin, dass da was beim Senden erst schief geht.

Was jetzt interessant wäre, ist die Initialisierung der TMAPIMessage-Struktur. Was mir gerade auffällt, du hast als Anwendungs-Handle 0 angegeben, eventuell liegt es daran.

Ansonsten kann ich dir nur noch etwas Code aus meiner Schatzkiste anbieten. Allerdings ungetestet (irgendwo mal gefunden und gut aufbewart).

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:
uses Mapi;

Procedure TForm1.SendMail(Subject,Mailtext,
                   FromName,FromAdress,
                   ToName,ToAdress,
                   AttachedFileName,
                   DisplayFileName:string;
                   ShowDialog:boolean);
var
  MapiMessage : TMapiMessage;
  MError      : Cardinal;
  Empfaenger  : Array[0..1] of TMapiRecipDesc;
  Absender    : TMapiRecipDesc;
  Datei       : Array[0..1] of TMapiFileDesc;
begin
  with MapiMessage do begin
    ulReserved := 0;

    // Betreff
    lpszSubject := PChar(Subject);

    // Body
    lpszNoteText := PChar(Mailtext);

    lpszMessageType := nil;
    lpszDateReceived := nil;
    lpszConversationID := nil;
    flFlags := 0;

    // Absender festlegen
    Absender.ulReserved:=0;
    Absender.ulRecipClass:=MAPI_ORIG;
    Absender.lpszName:= PChar(FromName);
    Absender.lpszAddress:= PChar(FromAdress);
    Absender.ulEIDSize:=0;
    Absender.lpEntryID:=nil;
    lpOriginator := @Absender;

    // Empfänger festlegen (Hier: nur 1 Empfänger)
    nRecipCount := 1;

    Empfaenger[0].ulReserved:=0;
    Empfaenger[0].ulRecipClass:=MAPI_TO;
    Empfaenger[0].lpszName:= PChar(ToName);
    Empfaenger[0].lpszAddress:= PChar(ToAdress);
    Empfaenger[0].ulEIDSize:=0;
    Empfaenger[0].lpEntryID:=nil;
    lpRecips := @Empfaenger;

    // Dateien anhängen (Hier: nur 1 Datei)
    nFileCount := 1;

    // Name der Datei auf der Festplatte
    Datei[0].lpszPathName:= PChar(AttachedFilename);

    // Name, der in der Email angezeigt wird
    Datei[0].lpszFileName:= PChar(DisplayFilename);
    Datei[0].ulReserved:=0;
    Datei[0].flFlags:=0;
    Datei[0].nPosition:=Cardinal(-1);
    Datei[0].lpFileType:=nil;
    lpFiles := @Datei;

  end;

  // Senden
  if ShowDialog then
    MError := MapiSendMail(0, Application.Handle,
      MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI, 0)
  else
    // Wenn kein Dialogfeld angezeigt werden soll:
    MError := MapiSendMail(0, Application.Handle, MapiMessage, 0, 0);

  Case MError of
    MAPI_E_AMBIGUOUS_RECIPIENT:
      MessageDlg('Empfänger nicht eindeutig. (Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);

    MAPI_E_ATTACHMENT_NOT_FOUND:
      MessageDlg('Datei zum Anhängen nicht gefunden',mterror,[mbok],0);

    MAPI_E_ATTACHMENT_OPEN_FAILURE:
      MessageDlg('Datei zum Anhängen konnte nicht geöffnet werden.',mterror,[mbok],0);

    MAPI_E_BAD_RECIPTYPE:
      MessageDlg('Empfängertyp nicht MAPI_TO, MAPI_CC oder MAPI_BCC.',mterror,[mbok],0);

    MAPI_E_FAILURE:
      MessageDlg('Unbekannter Fehler.',mterror,[mbok],0);

    MAPI_E_INSUFFICIENT_MEMORY:
      MessageDlg('Nicht genug Speicher.',mterror,[mbok],0);

    MAPI_E_LOGIN_FAILURE:
      MessageDlg('Benutzerlogin (z.B. bei Outlook) fehlgeschlagen.',mterror,[mbok],0);

    MAPI_E_TEXT_TOO_LARGE:
      MessageDlg('Text zu groß.',mterror,[mbok],0);

    MAPI_E_TOO_MANY_FILES:
      MessageDlg('Zu viele Dateien zum Anhängen.',mterror,[mbok],0);

    MAPI_E_TOO_MANY_RECIPIENTS:
      MessageDlg('Zu viele Empfänger angegeben.',mterror,[mbok],0);

    MAPI_E_UNKNOWN_RECIPIENT: MessageDlg('Empfänger nicht in Adressbuch gefunden. '+
     '(Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);

    MAPI_E_USER_ABORT:
      MessageDlg('Benutzer hat Senden abgebrochen oder MAPI nicht installiert.',mterror,[mbok],0);

    SUCCESS_SUCCESS:
      MessageDlg('Erfolgreich !!! (Aber Absenden nicht garantiert.)',mtinformation,[mbok],0);

  End;
end; {Christian "NineBerry" Schwarz}


{ Aufrufparameter:

Subject:    Die Betreffzeile
Mailtext:    Der eigentliche Text der eMail
FromName:    Der Name des Absenders
FromAdress:    Die EMail-Adresse des Absenders
ToName:    Der Name des Empfängers
ToAdress:    Die EMail-Adresse des Empfängers
AttachedFileName: Der Dateiname der angehängten Datei
FileDisplayName:  Der in der Mail angezeigte Name der angehängten Datei
ShowDialog:   true: Die Mail wird vor dem Absenden angezeigt
    false: Die Mail wird "stumm" verschickt  }


EDE - Mo 10.02.03 19:42

Hallo,

danke erstmal für Deine schnelle Antwort, aber wie ich schon geschrieben habe funktioniert es mit SMTP-Versand und die MapiSend funktioniert in einem Normalen Programm auch. Also ich habe keine Probleme mit dem Struckturaufbau, ich wollte euch den Source hier ersparen :D
Wie ich schon schrieb "invalid Session" ist mein Problem :?


Delete - Mo 10.02.03 20:00

Ja, deswegen dachte ich auch es könnte daran liegen, dass du kein Handle mit gibst. Ansonsten, hast du schon mal probiert mit MAPILogon dir ein Session-Handle zu holen? Natürlich nur, wenn es überhaupt in das Konzept paßt. Aber eigentlich sollte es auch so gehen, laut PSDK.

Ich habe im PSDK noch das gefunden:
Zitat:

MAPISendDocuments
The MAPISendDocuments function sends a standard message with one or more attached files and a cover note. The cover note is a dialog box that allows the user to enter a list of recipients and an optional message. MAPISendDocuments differs from the MAPISendMail function in that it allows less flexibility in message generation.

Aber das dürfte nicht deinem Wunsch entsprechen.

PSDK oder online das MSDN hast du schon durchgewühlt? Blöde Frage eigentlich. :?

Ansonsten muß ich auch erstmal passen. Sorry. :(


EDE - Mo 10.02.03 20:10

Hallo,

Zitat:
PSDK oder online das MSDN hast du schon durchgewühlt? Blöde Frage eigentlich.


so is es :wink:

MAPISendDocuments kommt aber auf dasselbe ergebnis Err = 19 :(

Logon übrigens auch.

Man vesucht sehr viel in 3 Tagen :lol:

Ich glaube das ist ein fall für Nico.