Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi E-Mail mit Anhang im E-Mailclient (https://www.delphipraxis.net/144449-e-mail-mit-anhang-im-e-mailclient.html)

Opa Knack 8. Dez 2009 02:18


E-Mail mit Anhang im E-Mailclient
 
Hallo,

mit diesem Thread habe ich herausgefunden, wie ich eine E-Mail mit Anhang versenden kann (was funktioniert...).

Mein Ansinnen ist nun, die E-Mail nicht direkt zu versenden, sondern statt dessen im E-Mailclient zu öffnen. Hintergrund dieses Wunsches ist, dass bei obigem Lösungsansatz auch dann versucht wird, die Mail zu verschicken, wenn man gerade offline ist. Ich fände es nun praktisch, wenn in diesem Fall einfach der entsprechende Eintrag im Postausgang gespeichert würde und somit später versandt werden könnte. Zusätzlicher Nutzen wäre dabei, dass der Anwender noch nachvollziehbarer präsentiert bekommt, was gerade passiert, und somit nicht der irrigen Vermutung anheim fiele, dass sensible Daten ohne sein Wissen übermittelt würden.

Hat jemand eine Idee, wie ich das bewerkstelligen kann?

Danke und Gruß
Opa

shmia 8. Dez 2009 18:05

Re: E-Mail mit Anhang im E-Mailclient
 
Neben der Funktion MAPISendMail gibt es auch die Funktion MAPISaveMail, die eigentlich genau die gleichen Übergabeparameter haben müsste.
MAPISaveMail speichert die EMail lokal im Client (kann später manuell gesendet werden).

Opa Knack 8. Dez 2009 23:04

Re: E-Mail mit Anhang im E-Mailclient
 
Hallo

und Danke für die Rückmeldung. Ich habe jetzt ein paar Stunden gesucht, aber nirgendwo eine nachvollziehbare Delphi-Umsetzung von MAPISaveMail gefunden. Leider klappt's mit den Parametern nicht, es wird noch ein Parameter verlangt, den ich persönlich nicht so ganz einordnen kann (LPTSTR lpszMessageID). Ich habe die Parameter wie zuvor übergeben und einfach durch '' bzw. durch nil ersetzt (nun ja, man kann's ja mal versuchen), aber leider hat beides nicht geklappt.

Hat jemand einen Tipp, welcher Parameter übergeben werden muss bzw. (was natürlich noch besser wäre) hat jemand ein Beispiel, wie MAPISaveMail umgesetzt wird?

Danke und Gruß
Opa

Opa Knack 17. Dez 2009 00:13

Re: E-Mail mit Anhang im E-Mailclient
 
Entschuldigung für's pushen, aber ich habe immer noch keine Lösung gefunden ...

Noch mal kurz zur Zusammenfassung: Ich möchte eine E-Mail mit Attachment so zum E-Mailclient bringen, dass er sie entweder im Postausgang speichert, wenn der Rechner gerade offline ist, oder aber dass er sie öffnet (also quasi das, was der Mailto-Link im Browser macht, nur dass hier noch ein Attachment dazukommt).

Hat jemand eine Idee?

Danke und Gruß
Opa

Ralf Meyer 19. Dez 2009 11:36

Re: E-Mail mit Anhang im E-Mailclient
 
Hallo Opa,

Hast du mal versucht in der SendFileMail Methode den Aufruf der Funktion "Mapisendmail" um die Option MAPI_Dialog zu erweitern?

Delphi-Quellcode:
case MapiSendMail(0, 0, mMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0) of
Gruß
Ralf

devidespe 23. Dez 2009 10:33

Re: E-Mail mit Anhang im E-Mailclient
 
Ich habe dieses Beispiel auch ausprobiert und grundsätzlich läuft es weniger fehleranfällig als die JvMail-Komponente der JVCL.

Allerdings erzeugt die Verwendung des "MAPI_DIALOG"-Attributes die Fehlermeldung:

---------------------------
Fehler
---------------------------
Die Datei konnte nicht per E-Mail versendet werden!

Meldung:
One or more unspecified errors occurred!
---------------------------

Das ist insofern schade, da ich die EMail noch nicht abschicken möchte, sondern der Anwender dies bestätigen muss.

Ralf Meyer 24. Dez 2009 22:13

Re: E-Mail mit Anhang im E-Mailclient
 
Hi,

hier mein Code zum versenden:
Delphi-Quellcode:
function SendFileMail(const FileName: TFileName; const Subject, BodyText, RecipAdress: String): String;
var
  mMessage: TMapiMessage;
  mlpFiles: TMapiFileDesc;
  mRecips: TMapiRecipDesc;
begin
  if not FileExists(FileName) then
  begin
    Result := 'File "' + FileName + '" not found!';
    Exit;
  end;

  with mRecips do
  begin
    ulRecipClass := MAPI_TO;
    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        := 0;
    lpFiles           := @mlpFiles;
  end;

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

Function Mail1( Const cTo, cSubject, cMessage : String ) : Boolean ;
var
  S: String;
Begin
  S := SendFileMail( 'C:\test.txt', cSubject, cMessage, cTo ) ;

  if Length(S) > 0 then
  begin
    MessageDlg('Die Datei konnte nicht per E-Mail versendet werden!' + #10#13#10#13 +
      'Meldung:' + #10#13 + S, mtError, [mbOK], 0);
  end;

end;
Den Fehler von devidespe bekomme ich mit diesem Code nicht. Das Versenden klappt einwandfrei.

Ich habe jedoch ein anderes Problem.
Der E-Mail Typ wird auf auf die Ziel E-Mail-Adresse gesetzt und nicht auf SMTP wie es sein müßte. Somit kommt keine Mail an.

Gruß
Ralf


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