E-Mail senden aus Delphi iOS

Posted by on in Blogs
Wenn man direkt aus seinem Delphi XE4 iOS Programm eine E-Mail über das Bord-eigene E-Mail Programm senden will, ist das eigentlich ganz einfach.... wenn man weiß wie.

Diese Funktionen verstecken sich im UIApplication Objekt. Dies wollen wir erstmal haben:
TUIApplication.Wrap(TUIApplication.OCClass.SharedApplication);

Dann noch eine kleine Funktion, die aus einem normalen Delphi-String eine NSURL macht:
TNSUrl.Wrap(TNSUrl.OCClass.URLWithString(NSSTR(AStr)));

Anschliessend können wir die E-Mail recht einfach versenden:
  URL := 'mailto:This email address is being protected from spambots. You need JavaScript enabled to view it.?subject=Test&body=Testmessage';
  SharedApplication.openURL(StrToNSUrl(URL));

Natürlich kann man "Test" und "Testmessage" durch eigene Strings (hier reichen reine Delphi-Strings) ersetzen und sich den Text/String passend konkatinieren.

Damit wir auf die UIApplication und die Typen zugreifen können, brauchen wir noch die Erweiterung der USES-Clause um iOSapi.UIKit und iOSapi.CocoaTypes

Komplett sieht das dann so aus (sorry für die Formatierung):
unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
iOSapi.Foundation, iOSapi.UIKit, iOSapi.CocoaTypes;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
function SharedApplication: UIApplication;
function StrToNSUrl(const AStr: string): NSUrl;
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
URL: String;
begin
URL := 'mailto:This email address is being protected from spambots. You need JavaScript enabled to view it.?subject=Test&body=Testmessage';
SharedApplication.openURL(StrToNSUrl(URL));
end;

function TForm1.SharedApplication: UIApplication;
begin
Result := TUIApplication.Wrap(TUIApplication.OCClass.SharedApplication);
end;

function TForm1.StrToNSUrl(const AStr: string): NSUrl;
begin
Result := TNSUrl.Wrap(TNSUrl.OCClass.URLWithString(NSSTR(AStr)));
end;

end.

Wenn es im iOS Simulator nicht funktioniert, liegt das daran, daß dort kein E-Mail Account definiert ist :-)


Comments

  • Guest
    Jörg Thursday, 20 March 2014

    Hallo,

    wie muss den der URL-String aussehen wenn ich Strings einsetzte z.B.
    URL :='mailto:'+edit1.text+'?subject=Test&body='+Memo1.text;

    so funktioniert das nicht, auch wenn ich mit Tstring arbeite funktioniert es nicht.

    Das Beispiel oben funktioniert.

    Gruß

    Jörg

  • Guest
    Matthias Eissing Thursday, 20 March 2014

    Das liegt an den Leerstellen (die möglicherweise im Memo1.text drin sind) und an den Linefeeds (#10)

    Diese müssen dann umschrieben ("escaped") werden. Das ist immer so bei "mailto-URLs"....

    procedure TForm1.Button1Click(Sender: TObject);
    const
    LF = #10;
    var
    URL : String;
    Body : String;
    begin
    Body := Memo1.Text;
    Body := StringReplace(Body,' ','%20',[rfReplaceAll]); // Leerstellen konvertieren
    Body := StringReplace(Body,LF,'%0A',[rfReplaceAll]); // Zeilenumbruch konvertieren
    URL := 'mailto:[email protected]?subject=Test&body='+Body;
    SharedApplication.openURL(StrToNSUrl(URL));
    end;

  • Guest
    Jörg Thursday, 20 March 2014

    Hallo Matthias,

    danke für die schnelle Antwort.
    Wenn man für mailto:+edit1.text verwenden möchte, muss
    das auch escaped werden?

    Gruß

    Jörg

  • Guest
    Matthias Eissing Thursday, 20 March 2014

    Ja. Die mailto-URL darf keine Leerstellen/Sonderzeichen/LFs beinhalten.... Von daher könnte man die komplette URL auf Sonderzeichen untersuchen und ersetzen (nicht nur den "Body")

  • Guest
    Jörg Thursday, 20 March 2014

    habe das Beispiel mit meinem Code angepasst, im Simulator passiert nichts, es wird keine eMail angezeigt.

  • Guest
    Jörg Thursday, 20 March 2014

    hier mein Code-Auszug:

    sendTo := StringReplace(sendTo,' ','%20',[rfReplaceAll]); // Leerstellen konvertieren
    sendTo := StringReplace(sendTo,LF,'%0A',[rfReplaceAll]); // Zeilenumbruch konvertieren
    Body := StringReplace(Body,' ','%20',[rfReplaceAll]); // Leerstellen konvertieren
    Body := StringReplace(Body,LF,'%0A',[rfReplaceAll]); // Zeilenumbruch konvertieren
    URL := 'mailto:'+sendTo+'?subject=Test&body='+Body;
    SharedApplication.openURL(StrToNSUrl(URL));

  • Guest
    Matthias Eissing Thursday, 20 March 2014

    :-)

    Dann geh mal auf die eMail Einstellungen/die eMail App vom Simulator!
    Gibt es nicht? - Genau deswegen geht das auch nicht....

    (Sorry für Sarkasmus :-))

    Es gibt einige Dinge, die gehen prinzipiell nicht auf dem iOS Simulator; zB eMail

  • Guest
    Jörg Thursday, 20 March 2014

    WEnn ich das Beispiel von den D.P.F Components IOS nehme, zeigt er mir im eMail - Beispiel, im Simulator die generierte eMail an, Man geht dann audf senden und er tut so, als würde er senden.

    Hier in diesem Beispiel drücke ich den Button zum generieren der eMail und es kommt kein Fenster mit der eMail und mit dem Button senden.

  • Guest
    Matthias Eissing Thursday, 20 March 2014

    das eine ist eine MAILTO-URL, das andere benutzt den MFMailComposeViewController (der die eMail so anzeigt, wie man es erwartet oder bei installierte Mail.app vorfindet).....

  • Please login first in order for you to submit comments
  • Page :
  • 1

Check out more tips and tricks in this development video: