Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Firemonkey XE8: E-Mail mit HTML body senden (https://www.delphipraxis.net/190214-firemonkey-xe8-e-mail-mit-html-body-senden.html)

Loko789 13. Sep 2016 10:00

Firemonkey XE8: E-Mail mit HTML body senden
 
Hallo,

Ich stehe vor volgendem Problem.
Habe ein HTML Dokument und dieses möchte ich als body senden. Wie bei Outlook, dort gibt es die Funktion einfügen->als Text einfügen.
Git es sowas? Mir ist sehr wichtig das es platform unabhähing ist. Ich nutze zurzeit volgendes um die E-Mail zu versenden:
Delphi-Quellcode:
unit OpenHelp;

interface

  type
    TopenHelp = class
      function OpenURL(const URL: string): Boolean;

    end;

implementation

  uses
    IdURI, SysUtils, Classes, FMX.Dialogs,
{$IFDEF ANDROID}
    Androidapi.Helpers,
    FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText,
    Androidapi.JNI.Net, Androidapi.JNI.JavaTypes;
{$ENDIF ANDROID}
{$IFDEF MSWINDOWS}
  shellapi;
{$ENDIF MSWINDOWS}

  function TopenHelp.OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;

{$IFDEF ANDROID}
    var
      Intent: JIntent;
    begin
      Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(URL)));
      try
        SharedActivity.startActivity(Intent);
        exit(true);
      except
        on e: Exception do
        begin
          if DisplayError then
            ShowMessage('Error: ' + e.Message);
          exit(False);
        end;
      end;

{$ENDIF ANDROID}
{$IFDEF MSWINDOWS}
      begin
        ShellExecute(0, 'open', PChar(URL), nil, nil, 0);

      end;
{$ENDIF MSWINDOWS}


end.
--------------------------------
procedure TForm_Produktberater.Button3Click(Sender: TObject);
   var
   open:TopenHelp;
   begin
        open:=TopenHelp.Create;
        open.OpenURL('mailto:m.mustermann@domain.de')
        open.free;

    end;
Ist dieser ansatz der richtige? :?:

Gruß
Loko

dGeek 13. Sep 2016 13:43

AW: Firemonkey XE8: E-Mail mit HTML body senden
 
Versende deine Mails doch über einen SMTP-Server. Dann braucht das System, auf dem das Programm läuft, keinen Mail-Client installiert zu haben.

Loko789 13. Sep 2016 14:06

AW: Firemonkey XE8: E-Mail mit HTML body senden
 
Zitat:

Zitat von dGeek (Beitrag 1347517)
Versende deine Mails doch über einen SMTP-Server. Dann braucht das System, auf dem das Programm läuft, keinen Mail-Client installiert zu haben.

Danke für dem Tipp.
Gibt es abgesehen davon noch eine andere Lösung um Mails mit dem Standard Mail-Client zu senden?

Edit:
Habe es jetzt geschafft via SMTP-Server. Hat etwas gedauert aber es funktioniert

Rollo62 15. Sep 2016 12:42

AW: Firemonkey XE8: E-Mail mit HTML body senden
 
Ist auch noch eine Baustelle, aber vielleicht hilft dir das weiter ?
Das wurde aus diversen Tips, Tricks und Tests zusammengestrickt.

Gerne auch Ergebnisse und Verbesserungen zurückmelden.

Rollo

Delphi-Quellcode:
interface

uses
    System.UITypes, System.SysUtils
  , FMX.Dialogs
{$IFDEF IOS}
//06.05.16 ChgToDpfMin , DPF.iOS.MFMailCompose
  , DPF.iOS.MailMin
{$ENDIF IOS}
{$IFDEF ANDROID}
  , Androidapi.JNI.JavaTypes
  , Androidapi.JNIBridge, Androidapi.JNI.App
  , Androidapi.JNI.Net
  , Androidapi.JNI.Os
  , Androidapi.JNI.GraphicsContentViewText
  , AndroidApi.Helpers
  , FMX.Helpers.Android
//  , Androidapi.Jni.Net
//  , FMX.Helpers.Android
//  , Androidapi.JNIBridge
{$ENDIF ANDROID}
  ;


type
  TS4Mail_Attachments = array of String;




// Send mail with standard client on various platforms
function Mail_Send(const sRecp, sCC, sBCC, sSubj, sBody: String; const aAttach : TS4Mail_Attachments): Boolean;
{$IFDEF IOS}
var
  FMailCompose : TDPFMailCompose;
{$ENDIF IOS}

{$IFDEF ANDROID}
var
  Intent : JIntent;
  Uri   : Jnet_Uri;
  AttachmentFile: JFile;
  D, S  : JString;
  aDest: TJavaObjectArray<JString>;
//  Uri   : TJnet_Uri;

{$ENDIF ANDROID}
begin

{$IFDEF IOS}
  FMailCompose := TDPFMailCompose.Create(nil);

  try

    Result := FMailCompose.CanSendMail;
    if Result then
    begin
      Result := FMailCompose.MailCompose(sSubj,  //Subject
                                         sBody,  //Body
                                         False,  //Is Html
                                         [sRecp], //Array of recepients
                                         [sCC],  //Array of CC
                                         [sBCC], //Array of BCC
                                         aAttach //Array of Attachment Files
//                                       , []    //Array of Attachment Files
//                                       , nil,
//                                         ''
                                         );

//     function DPFMailCompose( Subject: string;
//                           MessageBody: string;
//                           MessageBodyisHtml: Boolean;
//                           Recipients: array of string;
//                           CCRecipients: array of string;
//                           BCCRecipients: array of string;
//                           AttachedFiles: array of string;
//                           ImageView: TDPFImageView = nil;
//                           ImageViewName: string = 'DPF-Photo.png' ) : Boolean;
    end;

  finally
    FMailCompose.Free;
    FMailCompose := nil;
  end;

{$ELSE IOS}

{$IFDEF ANDROID}

  Result := False;

  try


    Intent := TJIntent.Create;

    aDest := TJavaObjectArray<JString>.Create(1);
    aDest.Items[0] := StringToJString( sRecp );

    Intent.setAction(TJIntent.JavaClass.ACTION_Send);
//    Intent.setType(  StringToJString('*/*'));
//    Intent.setType(  StringToJString('text/plain'));
//    Intent.setType(StringToJString('vnd.android.cursor.dir/email'));
    Intent.setType(StringToJString('message/rfc822')); // Hier sollten nur Mail Apps kommen (bei mir aber auch noch

    //Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE); //Use Array
    Intent.setFlags( TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
    Intent.putExtra( TJIntent.JavaClass.EXTRA_EMAIL,  aDest );
    Intent.putExtra( TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(sSubj));
    intent.putExtra( TJIntent.JavaClass.EXTRA_TEXT,   StringToJString(sBody));
//    Uri := TJnet_Uri.JavaClass.parse(StringToJString(FileName));
//    Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, Uri);


    if (Length(aAttach) > 0) and (aAttach[0] <> '') then
    begin
      if FileExists(aAttach[0]) then
      begin


        AttachmentFile := TJFile.JavaClass.init(StringToJString( aAttach[0] ));

//##        AttachmentFile := TAndroidHelper.Activity.getExternalFilesDir(StringToJString(aAttach[0]));


        Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
        Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,
                        TJParcelable.Wrap((Uri as ILocalObject).GetObjectID));

      end;

    end;


//##  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString(Recipient));
//##  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(Subject));
//##  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(Content));

//##  Intent.setType(StringToJString('vnd.android.cursor.dir/email'));

//    Intent.setType(StringToJString('vnd.android.cursor.dir/email'));


//##OFF   Intent.setType(StringToJString('vnd.android.cursor.dir/email'));

//##OFF   SharedActivity.startActivity(Intent);


//    Intent.setType(StringToJString('vnd.android.cursor.dir/email')); Auch OK

//##    Intent.setType(StringToJString('message/rfc822')); // Hier sollten nur Mail Apps kommen (bei mir aber auch noch

//    SharedActivity.startActivity(Intent);


//    Intent := TJIntent.Create;
//    Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
//    Intent.setType(StringToJString('message/rfc822'));
//    Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL,  StringToJString( sRecp ));
//    Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString( sSubj ));
//    intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT,   StringToJString( sBody ));

    TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(Intent,
                                          StrToJCharSequence('Choose email app')));

//    SharedActivity.startActivity(TJIntent.JavaClass.createChooser(Intent,
//                                 StrToJCharSequence('Which email app ?')));


//    Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SENDTO); // ACTION_SEND);
//    Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL,  StringToJString( sRecp ));
//    Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString( sSubj ));
//    Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT,   StringToJString( sBody ));
//    // Intent.setType(StringToJString('plain/text'));
//    Intent.setType(StringToJString('message/rfc822')); //message/rfc822'));
//    // LaunchActivity(Intent);
//    LaunchActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Which email app?')));

    Result := True;

  finally

  end;

{$ELSE ANDROID}
  {$MESSAGE WARN 'S4Mail_Send not implemented for this platform}
  Result := False;
{$ENDIF ANDROID}
{$ENDIF IOS}

end;

Wasserflasche 10. Okt 2016 14:35

AW: Firemonkey XE8: E-Mail mit HTML body senden
 
Danke Rollo62 für deine umfangreiche Nachricht. Leider erhalte ich immer die Fehlermeldung, dass der ausgewählte Anhang (eine PDF-Datei) nicht unterstützt wird bzw. ungültig (je nach E-Mail-App: GMX und GMail) ist. Ist das bei dir genauso und hast du schon eine Lösung dafür gefunden?

P.S.: Ich nutze XE 10.

Rollo62 10. Okt 2016 19:16

AW: Firemonkey XE8: E-Mail mit HTML body senden
 
Ich versende keine PDF, deshalb kann ich das nicht wirklich sagen.
Versuch doch einfach mal testweise ein Textfile oder JPEG File zu versenden, das geht beides bei mir.

Rollo

Wasserflasche 17. Okt 2016 10:01

AW: Firemonkey XE8: E-Mail mit HTML body senden
 
Leider kann ich auch keine anderen Dateitypen (.txt oder .jpg) versenden: Immer derselbe Fehler. :(

bra 17. Okt 2016 12:41

AW: Firemonkey XE8: E-Mail mit HTML body senden
 
Wir nutzen folgende Funktion zum Versenden:

Delphi-Quellcode:
procedure DoShareAction;
var
  Intent: JIntent;
  Uri: Jnet_Uri;
  Uris: JArrayList;
  AttachmentFile: JFile;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(FFileDesc));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(FFileDesc));
  Intent.setType(GetMimeType);

  // Datei anhängen
  FTempFile := GenerateTempFile;
  AttachmentFile := TJFile.JavaClass.init(StringToJString(FTempFile));
  Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
  Uris := TJArrayList.Create;
  Uris.add(0, Uri);
  Intent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, Uris);

  TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Bitte Ziel auswählen...')));
end;


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