Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   ReplyTo mit Standard-Mail-Client (https://www.delphipraxis.net/213402-replyto-mit-standard-mail-client.html)

NLan 25. Jul 2023 10:00

ReplyTo mit Standard-Mail-Client
 
Ich programmiere seit vielen Jahre mit Delphi (seit Delphi 5) - jetzt mit Delphi 10.

Bisher habe ich Mails über den Standard-Mail-Client von Windows mit der Mapi32.dll versendet.
Über das message Objekt (in der ..\source\rtl\win\winapi.mapi.pas von DELPHI)
funktioniert alles was man braucht (CC,BCC,Dateianhänge...)
Nur das "ReplyTo" also die abweichende Antwort-Adresse gibt es da nicht.

es gibt da nur:

MAPI_ORIG = 0; { Recipient is message originator }
MAPI_TO = 1; { Recipient is a primary recipient }
MAPI_CC = 2; { Recipient is a copy recipient }
MAPI_BCC = 3; { Recipient is blind copy recipient }

Hat jemand eine Idee, wie das geht (z.B. Werte 4..99)?

Oder muß ich eine andere Funktion zum Erzeugen von Mail's mit dem Standard-Mail-Client von Windows verwenden (ShellExecute ist keine Option) ?

DANKE

Delphi.Narium 25. Jul 2023 10:26

AW: ReplyTo mit Standard-Mail-Client
 
Ein Vorschlag in C++: Send mail with Mapi with reply-to multiple emails

Keine Ahnung, ob das wirklich hilfreich sein könnte.

Frickler 26. Jul 2023 13:53

AW: ReplyTo mit Standard-Mail-Client
 
Sowohl die Delphi-Standardbibliothek als auch die Jcl unterstützen nur "Simple MAPI". Das ist eine Untermenge von MAPI, die "Reply to" nicht unterstützt.

himitsu 26. Jul 2023 14:15

AW: ReplyTo mit Standard-Mail-Client
 
Auch Dateianhänge oder Textformatierungen sind da nicht wirklich unterstützt.

Eine Zeit lang hatten wir eine selbstgeschriebene .NET-Anwendung genutzt, wenn als Ziel ein MSOutlook vorhanden ist,
also eine Konsolenanwendung, welche Daten aus ihren Parametern an die Outlook-MAPI im .NET-Framework übergab.


Inzwischen erstellen wir mit Indy (glaub TIdMessage) eine .EML-Datei, welche dann per ShellExecute durch Windows ans Standard-MailProgramm übergeben wird.

NLan 26. Jul 2023 15:01

AW: ReplyTo mit Standard-Mail-Client
 
zu: Auch Dateianhänge oder Textformatierungen sind da nicht wirklich unterstützt.
---
Doch das geht alles prima über die MAPI. Es lassen sich beliebig viele Dateianhänge erzeugen und die Formatierung funktioniert mit HTML im Mail-Text.

Nur das ReplyTo scheint vergessen wurden zu sein bzw. ist später erst gekommen. Es gibt ja auch Teile "Reserved for future" bzw. weitere Werte für ulRecipClass im MapiRecipDesc object.

MapiMessage = record
ulReserved: ULONG; { Reserved for future use (M.B. 0) }
lpszSubject: LPSTR; { Message Subject }
lpszNoteText: LPSTR; { Message Text }
lpszMessageType: LPSTR; { Message Class }
lpszDateReceived: LPSTR; { in YYYY/MM/DD HH:MM format }
lpszConversationID: LPSTR; { conversation thread ID }
flFlags: FLAGS; { unread,return receipt }
lpOriginator: PMapiRecipDesc; { Originator descriptor }
nRecipCount: ULONG; { Number of recipients }
lpRecips: PMapiRecipDesc; { Recipient descriptors }
nFileCount: ULONG; { # of file attachments }
lpFiles: PMapiFileDesc; { Attachment descriptors }
end;

MapiRecipDesc = record
ulReserved: ULONG; { Reserved for future use }
ulRecipClass: ULONG; { Recipient class }
{ MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG }
lpszName: LPSTR; { Recipient name }
lpszAddress: LPSTR; { Recipient address (optional) }
ulEIDSize: ULONG; { Count in bytes of size of pEntryID }
lpEntryID: LPVOID; { System-specific recipient reference }
end;

Aber evtl. ist eine .EML-Datei doch die Lösung.

himitsu 26. Jul 2023 16:04

AW: ReplyTo mit Standard-Mail-Client
 
Hab nicht gesagt, dass es garnicht geht, sondern nicht wirklich "immer und überall und das auch noch zuverlässig".

Je nachdem, was für ein Mailprogramm und Windows vorliegt.

welche Windows-Version
was für ein Windows (Server, Home, Professional usw.)
Thunderbird
Windows Mail
Outlook mit 64-Bit in einem 64-Bit Windows
Outlook mit 32-Bit in einem 64-Bit Windows
Outlook mit 32-Bit in einem 32-Bit Windows
oder sonstwas

vor allem deutsche "vorinstallierte" Windowse gewisser OEM-Anbieter sind echt grauenhaft konfiguriert

NLan 30. Jul 2023 11:00

AW: ReplyTo mit Standard-Mail-Client
 
Hallo himitsu

ich habe jetzt mit TIdMessage erfolgreich eine EML-Datei erstellt (auch mit ReplyTo).
Aber wie bekommt man denn da ein Attachment (z.B. eine PDF-Datei) ran?
Vermutlich mit dem IdMessage.MessageParts - ich habe leider kein Beispiel gefunden, wie das geht.
Meine Versuche brachten immer einen "Abstrakten Fehler".
Hast du ein SAMPLE dafür?

Und wie erklärt man ShellExecute dass die EML-Datei nicht nur angezeigt wird, sondern man diese versenden möchte?
Bei mir erscheint der "SENDEN" Button nicht, weder im Windows-Mail noch im GroupWise-Mailclient.

himitsu 30. Jul 2023 11:47

AW: ReplyTo mit Standard-Mail-Client
 
Delphi-Quellcode:
TIdAttachmentFile.Create(IdMsg.MessageParts, Attachments[idx]).ContentID := ...;

Delphi-Quellcode:
  IdMsg := TIdMessage.Create(nil);
  try
    IdMsg.Subject := Subject;
    for idx := 0 to Addresses.Count - 1 do
       IdMsg.Recipients.Add.Address := Addresses[idx];
    IdMsg.ContentType := 'multipart/mixed; charset=UTF-8;';
    SL := TStringList.Create;
    try
      SL.Add('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">');
      SL.Add('<meta http-equiv="Content-Type" content="text/html; charset="UTF-8" />');
      SL.Add('<html><head>');
      SL.Add(Format('<title>%s</title>', ['Title']));
      SL.Add('</head><body>');
      SL.Add('<div>' + Replace(BodyText, sLineBreak, '<br />', [rfReplaceAll, rfIgnoreCase]) + '</div>');
      SL.Add('</body></html>');
      with TIdText.Create(IdMsg.MessageParts, SL) do begin
        ContentType := 'text/html';
        CharSet := 'UTF-8';
      end;
      for idx := 0 to Length(Attachments) - 1 do
        with TIdAttachmentFile.Create(IdMsg.MessageParts, Attachments[idx]) do
          ContentID := Format('%d_attach_%s', [idx, ContentIdgenerate]);
    finally
      SL.Free;
    end;
    //Wichtig ist dabei einzig und allein der X-Header (damit es als eine neue, zu sendende EMail verarbeitet wird): X-Unset
    IdMsg.Headers.Add('X-Unsent: 1');
    IdMsg.SaveToFile(fileName);
  finally
    IdMsg.Free;
  end;
  ShellExecute(Self.Handle, nil, PChar(fileName), nil, nil, 0);
k.A. ob man die IDs selber generieren+zuweisen muß.
Kurzfassung des Codes vom Kollegen.
Ich hätte gehofft Indy macht das selber.

mytbo 30. Jul 2023 15:20

AW: ReplyTo mit Standard-Mail-Client
 
Zitat:

Zitat von NLan (Beitrag 1525057)
Aber wie bekommt man denn da ein Attachment (z.B. eine PDF-Datei) ran?

Eine Möglichkeit wäre:
Delphi-Quellcode:
var
  idMessage: TIdMessage;
  idMessageBuilder: TIdMessageBuilderHTML;
begin
  idMessage := TIdMessage.Create(Nil);
  try
    idMessage.Subject := 'Party invitation';
    idMessage.From.Text := 'Peter Pan <peter@pan.com>';
    idMessage.Recipients.Add.Text := 'Elizabeth Swann <elizabeth@swann.gb>';
    idMessage.CCList.Add.Text := 'Jack Sparrow <jack@sparrow.dm>';
    idMessageBuilder := TIdMessageBuilderHTML.Create;
    try
      idMessageBuilder.Html.Text := 'Let''s have a little bit of fun.';
      idMessageBuilder.Attachments.Add(MakePath([Executable.ProgramFilePath, 'InvitationDoc.pdf']));
      idMessageBuilder.FillMessage(idMessage);
    finally
      idMessageBuilder.Free;
    end;

    idMessage.SaveToFile(MakePath([Executable.ProgramFilePath, 'EMail.txt']));
  finally
    idMessage.Free;
  end;
end;
Bis bald...
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 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