Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zwei Felder als Email senden


Chaka - Do 06.11.08 18:09
Titel: Zwei Felder als Email senden
Hallo,

also ich lerne Pascal erst, kann deswegen nicht so richtig viel.

Ich habe jedenfalls vor ein Programm zu entwickeln, das 2 Edit-Felder beinhaltet. Das eine ist für den Namen das andere für eine Email-Adresse. So und jetzt kommt das Problem. Eigentlich sollen die Daten die in das Feld geschrieben werden automatisch an eine Email Adresse gesendet werden. Aber ich weiß überhaupt nicht wie das funktionieren soll... Hoffe hier sind ein paar richtig gute Programmierer die mir helfen würden!

Danke schon einmal im Voraus

Paul


Swordooo - Do 06.11.08 19:44

Hi,


Delphi-Quelltext
1:
2:
3:
4:
uses ShellApi;
...
ShellExecute(Application.Handle, 'open',
PChar('mailto:name@email.de?subject=Betreff&body=irgendein Text'), nilnil, sw_ShowNormal);


Das setzt aber ein E-Mail Programm Voraus wie z.B. Thunderbird o.ä.

MfG Swordooo


Yogu - Do 06.11.08 20:57

Um die Mail direkt aus Delphi heraus zu senden, benötigst du zum Beispiel die Suche in der Entwickler-Ecke INDYS. Dabei gibt es allerdings ein Sicherheitsproblem: Die Zugangsdaten für das Sender-Emailkonto (welches du brauchst, wenn du die Mails nicht direkt auf den Server hochlädst) können mehr oder weniger einfach ausgelesen oder abgefangen werden.

Um was handelt es sich denn? Wozu soll die Mail verschickt werden?


Chaka - Do 06.11.08 21:43

Erstmal Danke für die Hilfe. Ja, also es müsste direkt aus Delphi rausgesendet werden. Aber leider weiß ich nicht genau wie das funktioniert. Kannst du mir das vlt nochmal genauer erläutern? wie das genau funktioniert? Also der Benutzer der das Programm ausführt hat 2 Edit-Felder. Da trägt der dann seinen Namen und seine Email-Adresse ein. Dann klickt er auf einen Button und anschließend sollten die Daten dann an eine email Adresse versendet werden. Ob in der Email-Adresse steht:
Name: Max Mustermann
Email: max@mustermann.de

oder max_mustermann, max@mustermann.de ist völlig egal...

Viele Grüße

Paul


Xentar - Do 06.11.08 22:20

http://www.delphi-treff.de/tutorials/netzwerk-und-internet/indy/page/8/


Chaka - Mi 12.11.08 18:02

Ok. Aber daraus werde ich nicht so richtig Schlau...
Ich muß also dieses Indy erst auf meinem Computer installieren. Dann muss ich in den Quelltext reinschreiben das ich Indy benutze und dann den Code noch einfügen, oder?

aber was muß ich da rein schreiben, das ich Indy verwende???
und wie muß der Code aussehen???


Viele Grüße
Paul


Tilman - Mi 12.11.08 18:49

Die "Indys" sind einfach weitere Komponenten wie TButton, TEdit usw. Nach dem du Indy installiert hast sind die dann in deiner Komponenten-Palette vorhanden und du kannst die einfach in dein Projekt reinziehen.


Chaka - Mi 12.11.08 18:59

ah ok danke!!!


MDX - Mi 12.11.08 19:03

Du könntest auch über PHP schicken lassen:


XML-Daten
1:
2:
3:
<?php
mail('AN', 'BETREFF', 'TEXT', 'From: DEINEMAILADRESSE');
?>

du bräuchtest nur einen free hoster wie funpic oder so...

und musst das dann per idhttp1.post an die PHP Datei schicken lassen, wie das geht, kuck einfach mal im Forum


Chaka - Mi 12.11.08 19:42

aha. So geht das also auch. Aber die Seite indyproject.org ist im Moment down... Also die Download-Links. Hab auch schon nach einem alternativ Download gesucht, aber nur einen für Microsoft Visual Studio.NET 2003 gefunden. Gestern war die auch nicht zu erreichen. Hat jemand einen download Link??? oder könnt ihr das mir schicken??


paul


Boldar - Mi 12.11.08 19:48

user profile iconSwordooo hat folgendes geschrieben Zum zitierten Posting springen:
Hi,


Delphi-Quelltext
1:
2:
3:
4:
uses ShellApi;
...
ShellExecute(Application.Handle, 'open',
PChar('mailto:name@email.de?subject=Betreff&body=irgendein Text'), nilnil, sw_ShowNormal);


Das setzt aber ein E-Mail Programm Voraus wie z.B. Thunderbird o.ä.

MfG Swordooo


Das geht doch genauso gut...


Chaka - Mi 12.11.08 19:52

Ja. Das geht auch, aber ich würde es gern so haben, das der die Email direkt an die Email Adresse sendet, statt das der dann noch Thunderbird & co. öffnet! Vlt. doch mit Php, wenn das funktioniert.


Boldar - Mi 12.11.08 20:23

Man sieht nichts vom Thunderbird...
Der wird sofort wieder geschlossen!


Chaka - Mi 12.11.08 21:22

aber da kommt doch dann dieses Verfassen Feld, oder?


Boldar - Mi 12.11.08 22:03

Nein, die Email wird schon von Delphi aus gesendet, es wird nur das Standart-Email-Programm dafür benutzt. D.h. der User sieht nichts davon.


Chaka - Do 13.11.08 17:11

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Nein, die Email wird schon von Delphi aus gesendet, es wird nur das Standart-Email-Programm dafür benutzt. D.h. der User sieht nichts davon.


Ich habe das jetzt ausprobiert, doch der öffnet dann Thunderbird und zeigt das an, was ich da als Betreff und so eingegeben habe!


Boldar - Do 13.11.08 17:24

dann musst du statt sw_shownormal was anderes angeben, guck mal inner OH
oder frag einen der Profis hier...


Chaka - Do 13.11.08 17:45

Gut, ich warte :D
Wenn der das nicht anzeigen würde, wäre das Hammer.
Weiß jemand wie das geht??


LexXis - Do 13.11.08 18:12

sw_ShowHidden verhindert, dass das ausgeführte Programm angezeigt wird. Allerdings ändert das soweit ich weiß nichts an der Tatsache, dass Thunderbird/WhatEver die eMail trotzdem nicht senden wird.

mfg


Chaka - Do 13.11.08 18:31

Warum wird Thunderbird die Email nicht senden?
dieses Sw_showHidden funktioniert nicht. Das ist ein undefinierter Bezeichner laut Delphi!

Kannst du mir weiterhelfen?


LexXis - Do 13.11.08 18:42

Oh, huppala. Heißt natürlich SW_HIDE.

Zu Erklärung: Dein eMail-Client wird mit den angegebenen Parametern aufgerufen. Was er damit allerdings im Endeffekt macht, bleibt ja dem Programm überlassen. In dem speziellen Fall ist es eben "eintragen" und nicht "senden". Aber die wenigsten Clients sollten wohl eMails völlig automatisch an irgendwen verschicken. Da stände Mal-/Spyware ja Tür und Tor offen um Daten unbemerkt nach außen zu senden. Wer blockt schon sein eMail-Programm per Firewall :twisted

mfg


Xentar - Do 13.11.08 18:43

Also nochmal:
ShellExecute öffnet ein fremdes Programm. In diesem Fall das Standard-Mailprogramm. SW_Show, SW_Hide usw. gibt dabei an, ob das Programmfenster angezeigt werden, oder im Hintergrund geöffnet werden soll, usw.
Ob Thunderbird nun aber die Mail direkt absendet, oder erst das Nachrichtenfenster öffnet, da hat DEIN Programm (normalerweise) keinen Einfluss drauf - sondern hängt von vom aufgerufenen Programm (also in diesem Fall Thunderbird) ab.

Deswegen nochmal mein Hinweis: Nimm die Indy Komponenten - da bist du gar nicht auf fremde Anwendungen angewiesen.
Die Kompoenten sind meistens schon bei Delphi dabei, also schon vorinstalliert. Welche du brauchst, und wie du die benutzt, steht in dem Tutorial das ich ungefähr letzte Woche schon verlinkt hab..


Chaka - Do 13.11.08 18:55

Ok. Aber die Seite indyproject.org ist offline. Also nur die wo der Download drauf ist..
Und so hab ich keine Möglichkeit an die Installationsdatei ran zu kommen. Hat vlt. jemand die und kann die mir via icq oder email schicken???

ist offline:

http://www.atozed.com/indy/plus/install.iwp


Xentar - Do 13.11.08 19:03

Welche Delphi Version hast du?


Boldar - Do 13.11.08 19:32

Hier [http://www.delphipraxis.net/topic47481.html] gibs ne Prozedur dafür, aber da wird ne Datei mitgeschickt. Man kann da dann doch einfach ein Datei-dummy mitschicken oder von den Profis hier die Procedur ändern lassen.


Chaka - Fr 14.11.08 18:58

Ich hab Delphi 2007!
Hat vlt jemand noch das Indy Paket???


Xentar - Fr 14.11.08 19:40

user profile iconChaka hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab Delphi 2007!
Hat vlt jemand noch das Indy Paket???


Sollte bei deiner Version schon bei sein..
Es sei denn, du hast es bei der Installation abgewählt.


jaenicke - Fr 14.11.08 19:44

user profile iconChaka hat folgendes geschrieben Zum zitierten Posting springen:
Ok. Aber die Seite indyproject.org ist offline. Also nur die wo der Download drauf ist..
Und so hab ich keine Möglichkeit an die Installationsdatei ran zu kommen. Hat vlt. jemand die und kann die mir via icq oder email schicken???

ist offline:

http://www.atozed.com/indy/plus/install.iwp
Und mit ein paar Sekunden suchen findest du auf der Seite genau diese Seiten trotzdem...
http://www.atozed.com/indy/index.DE.aspx
http://www.atozed.com/indy/Installer/Files.DE.aspx
...


Chaka - Sa 15.11.08 18:37

Super. Danke. Jetzt hab ich es auch!
Aber wo muß ich jetzt überall etwas eingeben (Servername...) und so? Ich hab das jetzt so:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  //Jetzt soll der die Email senden...


  case SmtpAuthType of
    0: SMTP.AuthenticationType := atNone;
    1: SMTP.AuthenticationType := atLogin; {Simple Login}
  end;

  //Benutzerdaten für Authentifizierung
  SMTP.UserID := SmtpServerUser;
  SMTP.Password := SmtpServerPassword;

  //Server-Daten
  SMTP.Host := SmtpServerName;
  SMTP.Port := SmtpServerPort;

  SMTP.Connect;

  try
    SMTP.Send(Hallo);
  finally
    SMTP.Disconnect;
  end;


Xentar - Sa 15.11.08 19:25

Du brauchst noch eine IdMessage.
In dieser kannst du die E-Mail bearbeiten (Betreff, Empfänger, Text, usw.)

Anschließend mit SMTP.Send(MyIDMessage); absenden und fertig.


Chaka - Sa 15.11.08 20:04

Sonst muss ich da nichts angeben???

hab das jetzt so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  //Email senden...


  case SmtpAuthType of
    0: SMTP.AuthenticationType := atNone;
    1: SMTP.AuthenticationType := atLogin; {Simple Login}
  end;

  //Benutzerdaten für Authentifizierung
  SMTP.UserID := SmtpServerUser;
  SMTP.Password := SmtpServerPassword;

  //Server-Daten
  SMTP.Host := SmtpServerName;
  SMTP.Port := SmtpServerPort;

  SMTP.Connect;

  try
    SMTP.Send(MyIDMessage);
  finally
    SMTP.Disconnect;
  end;

  MID:='wh'+FormatDateTime('yymmddssnnhh', now)+'A3F4E4@local';
IdMessage := TIdMessage.Create(Nil);
IdMessage.Date := now;
idMessage.From.Name:='Name des Absänders';
idMessage.From.Address:='Hier hab ich die Email Adresse an die der senden soll';
idMessage.Recipients.EMailAddresses:='von der adresse';
idMessage.Subject:='Das ist eine Testnachricht';
idMessage.Body.Add('TEXT_1');
idMessage.Body.Add('Text_2');
idMessage.AddHeader('Message-ID: <' + MID + '>');


aber angekommen ist bis jetzt nichts...


LexXis - Sa 15.11.08 20:13

Erst die IdMessage befüllen, dann versuchen zu senden ;)
Und natürlich drauf achten, dass auch die richtige IdMessage bei SMTP.Send() angegeben ist.

mfg


UGrohne - Sa 15.11.08 20:32

Tja, Mails verschicken ist keine so einfache Sache, wie man immer glaubt. Du hast in diesem Fall 2 Probleme:

Erstens kann es sein, dass der empfangende Mailserver die Mail ablehnt, weil sie von einer dynamischen Adresse kommt oder anderen Spam-Ähnlichkeiten unterworfen ist (Reverse-DNS usw.), solange Du die Mail nicht über einen von DIr "kontrollierten" SMTP-Server schickst, an dem Du Dich authentifizieren musst. Dann hast Du aber das Problem, dass ohne besondere Vorkehrungen, die Zugangsdaten wie schon gesagt, im Klartext in der Exe stehen.

So, das Zweite wären dann noch Virenscanner und Firewalls. McAffee z.B. blockt erstmal alle ausgehenden SMTP-Nachrichten, wenn sie nicht von bekannten Programmen kommen (Outlook usw.) und das merkt dann nicht mal jemand.

Dafür gibt es nur zwei Lösungen: Entweder Du überlasst dem Nutzer die Kontrolle, worüber und wie geschickt wird (eigener Mailclient, sein eigener Mailserver, ...) oder Du verwendest das PHP-Skript. Letzteres hätte den Charm, dass Du bestimmst, wer der Absender ist und diesem (im Idealfall) auch vertraut wird von anderen SMTP-Servern.


Chaka - So 16.11.08 19:41

Schade, jetzt war ich soweit. Gibts für das Php-Script nen Link?


UGrohne - So 16.11.08 20:36

user profile iconChaka hat folgendes geschrieben Zum zitierten Posting springen:
Schade, jetzt war ich soweit. Gibts für das Php-Script nen Link?

Es kommt ja darauf an, was Du genau machen willst. Wenn Du an eine ganz bestimmte Adresse senden willst und weißt, dass dieser Mailserver nicht solche Spam-Maßnahmen ergreift, kannst Du es ja trotzdem verwenden.


Chaka - Mo 17.11.08 17:39

Ja, soll immer nur an eine Email-Adresse. Aber wenn jetzt der Virenscanner oder die Firewall das von dem Client nicht durchlässt... Geht bei gmx so eine Mail durch???


UGrohne - Mo 17.11.08 17:51

user profile iconChaka hat folgendes geschrieben Zum zitierten Posting springen:
Ja, soll immer nur an eine Email-Adresse. Aber wenn jetzt der Virenscanner oder die Firewall das von dem Client nicht durchlässt... Geht bei gmx so eine Mail durch???

Muddu probiern. Aber wenn die Firewall das nicht durchlässt, hast Du wenig Chancen. Daher stimmt das auch wieder ;).


Chaka - Mo 17.11.08 18:31

Muss ich da jetzt noch irgendwas verändern:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  //Jetzt email senden...
    IdMessage := TIdMessage.Create(Nil);
IdMessage.Date := now;
idMessage.From.Name:='Programm';
idMessage.From.Address:='chaka@newsletter.de';
idMessage.Recipients.EMailAddresses:='**meine Email**@**die hab ich jetzt geändert**.de';
idMessage.Subject:='Das ist eine Testnachricht';
idMessage.Body.Add('TEXT_1');
idMessage.Body.Add('Text_2');
idMessage.AddHeader('Message-ID: <' + MID + '>');


  case SmtpAuthType of
    0: SMTP.AuthenticationType := atNone;
    1: SMTP.AuthenticationType := atLogin; {Simple Login}
  end;

  //Benutzerdaten für Authentifizierung
  SMTP.UserID := SmtpServerUser;
  SMTP.Password := SmtpServerPassword;

  //Server-Daten
  SMTP.Host := SmtpServerName;
  SMTP.Port := SmtpServerPort;

  SMTP.Connect;

  try
    SMTP.Send(idMessage);
  finally
    SMTP.Disconnect;
  end;



ich hab das Ganz genauso wie hier. Muß ich da irgendwas ergänzen???


Xentar - Mo 17.11.08 18:36

1. Wozu das TIdMessage.Create ?
2. Message ID muss man normalerweise nicht selber setzen.


Chaka - Do 20.11.08 18:15

Ich bekomme das irgendwie nicht hin...
Kann mir das jemand noch mal genauer erklären???


Xentar - Do 20.11.08 18:47

Tolle Fehlerbeschreibung..

Hälst du es nicht für besser, erstmal mit den Grundlagen von Delphi anzufangen, bevor du dich an sowas versuchst..? Sowas wie "Wie benutze ich Komponenten" oder so ähnlich..


Boldar - Do 20.11.08 19:15

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Hier [http://www.delphipraxis.net/topic47481.html] gibs ne Prozedur dafür, aber da wird ne Datei mitgeschickt. Man kann da dann doch einfach ein Datei-dummy mitschicken oder von den Profis hier die Procedur ändern lassen.


Chaka - Fr 21.11.08 18:55

Sorry, aber bei mir funktioniert das nicht. Da kommt immer die Meldung das der nicht weiß was mit S gemeint ist. Ich hab bei den Variablen S: String; eingetragen...
Was kann ich tun?


jaenicke - Fr 21.11.08 19:00

Wie sieht der Code denn aus, so wie du ihn jetzt bei dir geschrieben hast?


Boldar - Fr 21.11.08 21:02

s ist das functionsergebnis. Wenn

Delphi-Quelltext
1:
s=''                    

dann sind keine Fehler aufgetreten, ansonsten enthält s die Fehlermeldung.
Du kannst das einfach ignorieren und die function wie eine procedure aufrufen.


Chaka - So 21.12.08 19:57

Tut mir leid, aber irgendwie bekomme ich das nicht hin. kann man irgendwie auch mit anderen Sprachen das machen?


jaenicke - So 21.12.08 21:23

user profile iconChaka hat folgendes geschrieben Zum zitierten Posting springen:
Tut mir leid, aber irgendwie bekomme ich das nicht hin.
Sehr präzise Beschreibung...

user profile iconChaka hat folgendes geschrieben Zum zitierten Posting springen:
kann man irgendwie auch mit anderen Sprachen das machen?
Da sieht der Code im Grunde dann genauso aus. :nixweiss:

Wie gesagt:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie sieht der Code denn aus, so wie du ihn jetzt bei dir geschrieben hast?
Antworte doch einfach mal, sonst ist es nicht möglich zu sagen warum es nicht geht.