AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MAPI Mailversand mit TB und Delphi 7

Ein Thema von zongo-joe · begonnen am 19. Feb 2025 · letzter Beitrag vom 20. Feb 2025
Antwort Antwort
Seite 1 von 2  1 2      
zongo-joe

Registriert seit: 8. Jun 2007
13 Beiträge
 
Delphi 7 Professional
 
#1

MAPI Mailversand mit TB und Delphi 7

  Alt 19. Feb 2025, 20:27
Nabend zusammen,
ich arbeite noch mit Delphi 7 (ja, funzt noch) und habe bisher unter Win10 keine Probleme mit dem MAPI Mailversand mit folgender Proc gehabt. Unter Win11 gehts nicht mehr; ich kriege keine Fehlermeldung, aber die Mail geht nicht raus. Ich habe Thunderbird als MailTo Standard-Client gesetzt und mit shellexecute(0, 'open', PChar(mmail), '', '', SW_NORMAL); wird auch TB aufgerufen. Aber warum geht das verdammte MAPI nicht?
Schon mal Danke für Eure Mühe.
BG Zongo

Delphi-Quellcode:
function SendFileMail(const FileName: TFileName; const Subject, BodyText,
  RecipAdress: String; bccx:boolean ): String;

  (* die registry muss folgende Werte aufweisen:
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem\MAPI="1"
  HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Messaging Subsystem\MAPI="1"
  *)

var
  mMessage: TMapiMessage;
  mlpFiles: TMapiFileDesc;
  mRecips: TMapiRecipDesc;
begin
  if not FileExists(FileName) and (filename<>'') then
  begin
    Result := 'File "' + FileName + '" not found!';
    Exit;
  end;

  with mRecips do
  begin
    if not bccx then ulRecipClass := MAPI_TO else ulRecipClass := MAPI_BCC;
    lpszName := PChar(RecipAdress);
    lpszAddress := PChar(RecipAdress);
    ulEIDSize := 0;
    lpEntryID := nil;
  end;

  with mlpFiles do
  begin
    flFlags := 0;
    nPosition := 0;
    lpszPathName := PChar(FileName);
    lpszFileName := nil;
    lpFileType := nil;
  end;

  with mMessage do
  begin
    lpszSubject := PChar(Subject);
    lpszNoteText := PChar(BodyText);
    lpszMessageType := nil;
    lpszDateReceived := nil;
    lpszConversationID := nil;
    flFlags := 0;
    lpOriginator := nil;
    nRecipCount := 1;
    lpRecips := @mRecips;
    nFileCount := 1;
    lpFiles := @mlpFiles;
    if filename='then lpFiles:= nil;
    // if html then lpszNoteText:=nil; // dann wird der Anhang als HTML Message-Text benutzt
  end;

  case MapiSendMail(0, 0, mMessage, MAPI_LOGON_UI or MAPI_NEW_SESSION, 0) of
    MAPI_E_AMBIGUOUS_RECIPIENT:
      begin
        Result := 'A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set!';
        mmonitor('SendFileMail answer: A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set!');
      end;
    MAPI_E_ATTACHMENT_NOT_FOUND:
      begin
        Result := 'The specified attachment was not found!';
        mmonitor('SendFileMail answer: The specified attachment was not found!');
      end;
    MAPI_E_ATTACHMENT_OPEN_FAILURE:
      begin
        Result := 'The specified attachment could not be opened!';
        mmonitor('SendFileMail answer: The specified attachment could not be opened!');
      end;
    MAPI_E_BAD_RECIPTYPE:
      begin
        Result := 'The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC!';
        mmonitor('SendFileMail answer: The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC!');
      end;
    MAPI_E_FAILURE:
      begin
        Result := 'One or more unspecified errors occurred!';
        mmonitor('SendFileMail answer: One or more unspecified errors occurred!');
      end;
    MAPI_E_INSUFFICIENT_MEMORY:
      begin
        Result := 'There was insufficient memory to proceed!';
        mmonitor('SendFileMail answer: There was insufficient memory to proceed!');
      end;
    MAPI_E_LOGIN_FAILURE:
      begin
        Result := 'There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed!';
        mmonitor('SendFileMail answer: There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed!');
      end;
    MAPI_E_TEXT_TOO_LARGE:
      begin
        Result := 'The text in the message was too large to sent!';
        mmonitor('SendFileMail answer: The text in the message was too large to sent!');
      end;
    MAPI_E_TOO_MANY_FILES:
      begin
        Result := 'There were too many file attachments!';
        mmonitor('SendFileMail answer: There were too many file attachments!');
      end;
    MAPI_E_TOO_MANY_RECIPIENTS:
      begin
        Result := 'There were too many recipients!';
        mmonitor('SendFileMail answer: There were too many recipients!');
      end;
    MAPI_E_UNKNOWN_RECIPIENT:
      begin
        Result := 'A recipient did not appear in the address list!';
        mmonitor('SendFileMail answer: A recipient did not appear in the address list!');
      end;
    MAPI_E_USER_ABORT:
      begin
        Result := 'The user canceled one of the dialog boxes!';
        mmonitor('SendFileMail answer: The user canceled one of the dialog boxes!');
      end;
  end;
end; // von sendfilemail

Geändert von zongo-joe (19. Feb 2025 um 20:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.788 Beiträge
 
Delphi 12 Athens
 
#2

AW: MAPI Mailversand mit TB und Delphi 7

  Alt 19. Feb 2025, 20:37
Was liefert MapiSendMail denn zurück? Die Vermutung liegt nahe, dass es ein von dir nicht erwarteter Fehlercode ist. Leider ignorierst du den aber. Stattdessen solltest du dann diesen unbekannten Code auch ausgeben, wenn der Wert ungleich 0 (also Erfolg) ist. In deiner Liste fehlt z.B. noch MAPI_E_INVALID_RECIPS. GetLastError kannst du auch noch prüfen.

Da du noch Delphi 7 nutzt, nutzt du die Ansi-Variante. In der Doku steht aber eindeutig:
Zitat:
MAPISendMail ist für die Verwendung in den Betriebssystemen verfügbar, die im Abschnitt Anforderungen angegeben sind. Es kann in nachfolgenden Versionen geändert oder entfernt werden. Verwenden Sie stattdessen MAPISendMailW.
Es ist daher durchaus möglich, dass unter Windows 11 nur noch MAPISendMailW korrekt funktioniert.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
zongo-joe

Registriert seit: 8. Jun 2007
13 Beiträge
 
Delphi 7 Professional
 
#3

AW: MAPI Mailversand mit TB und Delphi 7

  Alt 19. Feb 2025, 21:34
Hallo Jaenicke,
erstmal vielen Dank, der Fehlercode ist 0 (also kein fehler IMHO)?
Wie geht das denn MAPISendMailW (sorry für dumme Fragen)..

Ich habe die mapi32.dll gefunden, ins Programmverzeichnis gestellt und mit
MapiSendMailW(0, 0, mMessage, MAPI_LOGON_UI or MAPI_NEW_SESSION, 0); external mapidllname; stdcall; (mit mapidllname='mapi32.dll')
klappt das nicht (MapiSendMailW unbekannt).
Bin darin offen gestanden nicht so firm.
Gibts vllt noch ein andere Möglichkeit?
BG
Zongo

Geändert von zongo-joe (19. Feb 2025 um 22:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.788 Beiträge
 
Delphi 12 Athens
 
#4

AW: MAPI Mailversand mit TB und Delphi 7

  Alt Gestern, 00:13
klappt das nicht (MapiSendMailW unbekannt).
Ein wenig Recherche zeigt: Leider ist die Funktion eine Fata Morgana. Microsoft entwickelt Mapi ja nicht mehr weiter, so dass die Funktion nur in der Doku und in der Headerdatei existiert, aber gar nicht implementiert ist.

Unter Windows 11 bekomme ich aber eine 1 zurück. Bist du sicher, dass das bei dir eine 0 ist?
Das lag bei mir daran, dass Mapi dort standardmäßig nicht aktiviert ist. Du musst daher den Wert MAPI in der Registry als Zeichenfolge anlegen und auf 1 setzen:
Code:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Messaging Subsystem
Für 64-Bit Anwendungen muss der Wert entsprechend direkt unter Software statt unter WOW6432Node gesetzt werden. Daraufhin funktionierte es mit der normalen Ansiversion.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
zongo-joe

Registriert seit: 8. Jun 2007
13 Beiträge
 
Delphi 7 Professional
 
#5

AW: MAPI Mailversand mit TB und Delphi 7

  Alt Gestern, 09:18
0:13 - WOW, vielen Dank !

also die Schlüssel
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem\MAPI="1"
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\ Windows Messaging Subsystem\MAPI="1"
hatte ich schon gesetzt.

Aber wie kann ich das für meine Software machen? Ich habe ja nur eine .exe die ich direkt ausführe, ohne dass eine Installation / Win-Registrierung erfolgt, wie eine portable GUI. Die hat ja keine Reg-Eintrag.

Ich habe auch überöegt, ob es an der Firewall liegen kann, ich habe ja nur den normalen Windows-Defender und die Win11 Firewall, da habe ich aber nichts an Einstellungen gefunden.
Dabnke & Grüße,
Zongo
  Mit Zitat antworten Zitat
AuronTLG
Online

Registriert seit: 2. Mai 2018
Ort: Marburg
308 Beiträge
 
Delphi 12 Athens
 
#6

AW: MAPI Mailversand mit TB und Delphi 7

  Alt Gestern, 09:19
Ich habe gerade mal geguckt, was ich in einem alten Delphi-7-Programm diesbezüglich drin habe, und bei mir sieht das so aus:

Ich habe folgende Variablen:

Code:
SM: TFNMapiSendMail;
MAPIModule: HModule;
Ergebnis : Cardinal;
MapiMessage : TMapiMessage;
...
...
...
Der Aufruf sieht dann folgendermaßen aus:

Code:
MAPIModule := LoadLibrary(PChar(MAPIDLL));
if MAPIModule <> 0 then
  begin
    try
      @SM := GetProcAddress(MAPIModule, 'MAPISendMail');
      if @SM<>nil
        then Ergebnis := SM(0, 0, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI, 0);
  ...
  ...
  ...
Ich kann keine Erklärungen zum Warum und Wieso abgeben, da das schon seit Ewigkeiten so ist und größtenteils ohne Probleme funktioniert hat.
  Mit Zitat antworten Zitat
zongo-joe

Registriert seit: 8. Jun 2007
13 Beiträge
 
Delphi 7 Professional
 
#7

AW: MAPI Mailversand mit TB und Delphi 7

  Alt Gestern, 09:41
Vielen Dank, aber damit wird nur eine Mail in Thunderbird geöffnet, die ich dann noch manuell abschicken muss. Könnte das an einer Einstellung im TB liegen?

Oder wisst Ihr noch eine andere Möglichkeit ausser MAPI?

Ich habe jetzt das Standard-Maulprogramm in Win11 in MS-Mail geändert, aber beim MAPI Aufruf wird immer noch der TB geöffnet ... dann sollte doch MS Mail kommen? ich blicke hier echt nicht mehr durch.

Geändert von zongo-joe (Gestern um 09:50 Uhr)
  Mit Zitat antworten Zitat
AuronTLG
Online

Registriert seit: 2. Mai 2018
Ort: Marburg
308 Beiträge
 
Delphi 12 Athens
 
#8

AW: MAPI Mailversand mit TB und Delphi 7

  Alt Gestern, 09:50
Vielen Dank, aber damit wird nur eine Mail in Thunderbird geöffnet, die ich dann noch manuell abschicken muss. Könnte das an einer Einstellung im TB liegen?

Oder wisst Ihr noch eine andere Möglichkeit ausser MAPI?
Hm, wahrscheinlich eher an den Flags in der Funktion.
Ich habe dort "MAPI_DIALOG or MAPI_LOGON_UI" verwendet, weil ich an dieser Stelle eben genau will, dass der EMail-Client aufgeht und man die Mail selbst abschicken muss.

Du willst die Mail direkt verschicken? Da kann ich im Bezug auf MAPI leider nicht viel zu sagen, da ich diesen Fall direkt über SMTP und IMAP umsetze. Das wäre übrigens auch eine alternative Möglichkeit.
Ich bin mir nicht ganz sicher, wie das in Delphi 7 damit aussieht, aber die Indy SMTP und IMAP Komponenten kann man dafür wunderbar nehmen.
  Mit Zitat antworten Zitat
zongo-joe

Registriert seit: 8. Jun 2007
13 Beiträge
 
Delphi 7 Professional
 
#9

AW: MAPI Mailversand mit TB und Delphi 7

  Alt Gestern, 10:11
Jetzt gehts !

Ich habe das Flag MAPI_DIALOG entfernt und er macht was er soll. Sowohl mit TB als Standard app als auch mitz Mail als Standard-APP. Keine Ahnung wieso, aber es klappt.

Ich danke euch beiden ganz herzlich für eure Mühe!

BG
Zongo
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
613 Beiträge
 
Delphi XE6 Enterprise
 
#10

AW: MAPI Mailversand mit TB und Delphi 7

  Alt Gestern, 11:49
Du willst die Mail direkt verschicken? Da kann ich im Bezug auf MAPI leider nicht viel zu sagen, da ich diesen Fall direkt über SMTP und IMAP umsetze. Das wäre übrigens auch eine alternative Möglichkeit.
Inwiefern wird IMAP für das Senden von Mails verwendet?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz