Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SMTP Email versenden schlägt fehl (https://www.delphipraxis.net/135699-smtp-email-versenden-schlaegt-fehl.html)

BAMatze 16. Jun 2009 08:43


SMTP Email versenden schlägt fehl
 
Hallo und guten Morgen an alle DP´ler,

Hab jetzt mal ein wenig Zeit und wollte mich in Erinnerung an die DT mal mit dem Thema Indy beschäftigen und bin gerade dabei eine TestMail über Yahoo zu verschicken. Das Verbinden funktioniert auch ohne Probleme, allerdings kommt ein Fehler wenn das Send(idMessage) ausführe. Ich hab im Internet mal Gegoogled und auch mehrere Ports gefunden, die in frage kommt. Ich weiß aber auch, dass in der Veranstaltung auf den DT darauf hingewiesen wurde, dass man bestimmte Einstellungen machen muss. Leider kann ich mich nicht mehr genau daran erinnern.
Vieleicht sieht ja jemand wo der Fehler liegt.
Delphi-Quellcode:
//Configure SMPTP
  SMTP.Host := 'smtp.mail.yahoo.de';
  SMTP.Username := Username;
  SMTP.Password := Pw;
  SMTP.Port := 587;     // welcher ist das bei Yahoo?
  // in Google habe ich den Hinweis gefunden, dass anstelle des Ports 25 der Port 587 verwendet
  // werden soll. Allerdings gibt es bei beiden die Fehlermeldung, dass keine Email versendet
  // werden konnte.

  //Configure idMessage
  idMessage.From.Text := 'Test';
  idMessage.Sender.Text := 'Test';
  idMessage.Recipients.EMailAddresses := Empfaengermail;
  idMessage.Subject := 'Test';
  idMessage.Priority := TIdMessagePriority(mpHigh);
  idMessage.CCList.EMailAddresses := '';
  idMessage.BccList.EMailAddresses := '';
  idMessage.ReceiptRecipient.Text := '';

  idMessage.Body.Clear;
  idMessage.Body := TestStringList;

//Send E-Mail
  Try
    SMTP.Connect;
    SMTP.Send(idMessage); //<--- hier tritt der Fehler auf
    SMTP.Disconnect;
  Except
    If SMTP.Connected = True Then
    Begin
      Try
        SMTP.Disconnect;
      Except
        MessageDlg('Could not disconnect from the E-Mail Server: ' + 'smtp.mail.yahoo.de', mtError, [mbOK], 0);
      End;
    End;
    MessageDlg('Could not send E-Mail to: ' + Empfaengermail, mtError, [mbOk], 0);
  End;

  //Destroy TIdSMTP and TIdMessage Componente
  SMTP.Free;
  idMessage.Free;

end;
Der Quellcode ist nicht von mir sondern habe ich hier gefunden. Es scheint noch ein Fehler bei der idMessage zu geben, da sich mit Yahoo verbunden wird

Hier mal ein paar Quellen, die ich gefunden hab:
Originalthreat von dem der Quellcode stammt
Änderung Port (ist aber älter, kann sich also auch wieder geändert haben)

Vielen Dank
BAMatze

invalid_operation 16. Jun 2009 08:56

Re: SMTP Email versenden schlägt fehl
 
Soweit ich mich erinnere, musste ich mein Yahoo-Postfach erst für pop3/smtp-Zugriffe freischalten.

Pobier's mal mit GMX (Port25).

HTH

shmia 16. Jun 2009 08:57

Re: SMTP Email versenden schlägt fehl
 
Absender- und Empfänger Email Adresse sind ungültig - das kann ja nicht funktionieren.

BAMatze 16. Jun 2009 09:45

Re: SMTP Email versenden schlägt fehl
 
Zitat:

Zitat von shmia
Absender- und Empfänger Email Adresse sind ungültig - das kann ja nicht funktionieren.

Wie kommst du darauf?

nahpets 16. Jun 2009 10:07

Re: SMTP Email versenden schlägt fehl
 
Delphi-Quellcode:
idMessage.From.Text := 'Test';
idMessage.Sender.Text := 'Test';
sollte offensichtlich sein. Müssen gültige Mailadressen sein. Wo soll denn bitte eine Mail an den Empfänger 'Test' hingehen? Und wie soll der Empfänger den Absender 'Test' erkennen?

smtp.mail.yahoo.de hat Port 25 offen.

Und bitte verrate uns doch noch die Fehlermeldung.
Der Inhalt von Username, PW und Empfaengermail könnte von Bedeutung sein (muss aber nicht zwingend) jenachdem, wie offen der Mailserver von Yahoo ist. Lässt der z. B. einen Mailversand ohne vorhergehende Anmeldung zu?

Schau bitte mal unter http://de.wikipedia.org/wiki/Simple_...nsfer_Protocol, dort bei "Das Protokoll" findest Du eine Tabelle mit Befehlen. Diese kannst Du über
Code:
Telnet smtp.mail.yahoo.de 25
ausprobieren. Wenn Du damit mit Deinen Daten eine Mail versenden kannst, dann gehts mit den gleichen Werten auch über Indy.

Assertor 16. Jun 2009 10:15

Re: SMTP Email versenden schlägt fehl
 
Hi BAMatze,

mir fallen 3 unglücklich gewählte Dinge auf: Disconnect in der Exception, kein Try/Finally für IdSMTP/IdMessage.Free, keine richtige Fehlerbehandlung

Du könntest neben dem Exception Handling aber auch IdSMTP.OnStatus verwenden, um etwas mehr Informationen zu erhalten, wo es hakt. Ebenso ein Portsniffer (ich nutze z.B. häufig SmartSniff) hilft weiter.

Port 25 ist der richtige für SMTP, außer Du verwendest SSL. Für SSL benötigst Du den OpenSSL Client Socket IO Handler, mußt UseTLS richtig einstellen und die DLLs ins Anwendungsverzeichnis packen.

Afaik muß bei Yahoo die Absenderadresse gültig sein und es gibt ein Limit von 5 Mails pro Connect. Port 25 ist SMTP Klartext, Port 465 SSL. 587 ist ein alternativer SMTP Port (für die 25), falls es Probleme durch einen blockenden ISP gibt.

(Roter Kasten) @Stephan: Gut erklärt und schneller, dem kann ich nur zustimmen :thumb:

Gruß Assertor

:dp:

BAMatze 16. Jun 2009 10:38

Re: SMTP Email versenden schlägt fehl
 
Zitat:

Zitat von nahpets
Delphi-Quellcode:
idMessage.From.Text := 'Test';
idMessage.Sender.Text := 'Test';
sollte offensichtlich sein. Müssen gültige Mailadressen sein. Wo soll denn bitte eine Mail an den Empfänger 'Test' hingehen? Und wie soll der Empfänger den Absender 'Test' erkennen?

smtp.mail.yahoo.de hat Port 25 offen.

Und bitte verrate uns doch noch die Fehlermeldung.
Der Inhalt von Username, PW und Empfaengermail könnte von Bedeutung sein (muss aber nicht zwingend) jenachdem, wie offen der Mailserver von Yahoo ist. Lässt der z. B. einen Mailversand ohne vorhergehende Anmeldung zu?

Schau bitte mal unter http://de.wikipedia.org/wiki/Simple_...nsfer_Protocol, dort bei "Das Protokoll" findest Du eine Tabelle mit Befehlen. Diese kannst Du über
Code:
Telnet smtp.mail.yahoo.de 25
ausprobieren. Wenn Du damit mit Deinen Daten eine Mail versenden kannst, dann gehts mit den gleichen Werten auch über Indy.

Hallo und schonmal Danke an nahpets hab jetzt mit einigen Hinweisen erfolgreich eine EMail versendet. Ich schreibe hier mal, da es für mich aus den bisherigen Threats, die ich gefunden hab nicht wirklich ersichtlich war, auf was wo eingetragen ist. Allerdings werde ich einige Daten nur beispielhaft angeben, da es sich dabei um Logindaten und EMail-Adressen von mir handelt.

Zur Fehlermeldung wurde ein Socket-Fehler 10054 angegeben, welcher allerdings auch noch auf dem falschen Port (465) ausgelöst wurde. Diesen Port habe ich auf der Yahoo-Seite für einen SMTP-Emailversand gefunden.

Ok hier für alle die nochmal hier nach einem EMail-versand aus einem Programm heraus suchen, die Einstellungen, die ich verwendet hab.
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdMessage, IdSMTPBase, IdSMTP;

procedure TForm1.FormCreate(Sender: TObject);
var
SMTP : TIdSMTP;
idMessage : TIdMessage;
TestStringList: TStringList;

begin
  TestStringList := TStringList.Create;
  TestStringList.Add('Test'); // Es wird im Textfeld der EMail das Wort "Test" angegeben.

  //Create TIdSMTP and TIdMessage Componente
  SMTP := TIdSMTP.Create();
  idMessage := TIdMessage.Create();

  //Configure SMPTP
  SMTP.Host := 'smtp.mail.yahoo.de';
  SMTP.Username := Username;
  SMTP.Password := Pw;
  SMTP.Port := 25; // Wenn Ihr bei eurem Yahoo-Account nachseht, werden dort unter den Einstellungen für SMTP-EMailversand der Port 465 angegeben. wenn Ihr diesen verwendet erhaltet Ihr einen Socket-Error 10054. Dieser Port ist wie Assertor sagt für die Verwendung von SSL gültig.

  //Configure idMessage
  idMessage.From.Text := SenderMail;
  idMessage.Sender.Text := EmpfaengerMail;
  idMessage.Recipients.EMailAddresses := EmpfaengerMail;
  idMessage.Subject := 'Test';

  idMessage.Body.Clear;
  idMessage.Body := TestStringList; // Schreibt "Text" in das Textfeld der EMail

  //Send E-Mail
  Try
    SMTP.Connect;
    SMTP.Send(idMessage);
    SMTP.Disconnect;
  Except
    If SMTP.Connected = True Then
    Begin
      Try
        SMTP.Disconnect;
      Except
        MessageDlg('Could not disconnect from the E-Mail Server: ' + 'smtp.mail.yahoo.de', mtError, [mbOK], 0);
      End;
    End;
    MessageDlg('Could not send E-Mail to: ' + Empfaengermail, mtError, [mbOk], 0);
  End;

  //Destroy TIdSMTP and TIdMessage Componente
  SMTP.Free;
  idMessage.Free;
end;
Ok der Inhalt der Konstanden kann ich hier aus persönlichen Gründen wie gesagt nicht preisgeben, sind ja schließlich meine persönlichen Daten. Allerdings für SenderMail einfach bei yahoo anmelden, dann bekommt ihr Yahoo-Account mit EMail-Adresse (z.B. Schulze.Maier@yahoo.de = SenderMail und Username = Schulze.Maier) und die Empfangsemail ist beliebig, bei mir war das eine ...@live.de. Hoffe das hilft mal jemanden, der wie ich als Anfänger ein paar Probleme mit dem Einarbeiten hat.

@Assertor und nahpets beide ein Dankeschön waren wirklich sehr hilfreiche Erklärungen für mich. Allerdings eins hab ich noch nicht ganz verstanden @Assertor, wie meinst du das mit dem Try/Finally. Könntest du eventuell den hier geposteten Quellcode umstellen, wie es besser wäre?

Edit1 uses-Klausel hinzugefügt

Assertor 16. Jun 2009 10:49

Re: SMTP Email versenden schlägt fehl
 
Hi,

kurz aus der Hand ohne Delphi:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  IdSMTP: TIdSMTP;
  IdMessage: TIdMessage;
  TestStringList: TStringList;
begin
  TestStringList := TStringList.Create;
  IdSMTP := TIdSMTP.Create();
  IdMessage := TIdMessage.Create();
  try

    TestStringList.Add('Test'); // Es wird im Textfeld der EMail das Wort "Test" angegeben.
   
    //Configure SMPTP
    IdSMTP.Host := 'smtp.mail.yahoo.de';
    IdSMTP.Username := Username;
    IdSMTP.Password := Pw;
    // Port kann bei Default leer bleiben, wird von Indy festgelegt
    // IdSMTP.Port := 25; // (465 = SSL, aber dafür fehlt hier der OpenSSL Handler)

    //Configure idMessage
    IdMessage.From.Text := SenderMail;
    {
      warum Sender.Text? Und dann auch noch mit EmpfaengerMail???
      Das wird Yahoo ablehenen, Du sagst damit, der Absender sei der Empfänger...
    IdMessage.Sender.Text := EmpfaengerMail;
    }
    IdMessage.Recipients.EMailAddresses := EmpfaengerMail;
    IdMessage.Subject := 'Test';

    // idMessage.Body.Clear; // bei neuem Objekt nicht nötig
    IdMessage.Body := TestStringList; // Schreibt "Text" in das Textfeld der EMail
   
    try
      IdSMTP.Connect;
      IdSMTP.Send(IdMessage);
      IdSMTP.Disconnect;
    except
      On E:Exception do
        MessageDlg('Fehler beim Senden: ' +  E.Message + ' [' + E.ClassName + ']', mtError, [mbOK], 0);
    end;

  finally
    IdMessage.Free;
    IdSMTP.Free;
    TestStringList.Free;
  end;
end;
Damit erhälst Du nun auch die echte Fehlermeldung.

Übrigens: Socket-Fehler 10054 bedeutet, die Gegenstelle hat die Verbindung getrennt. Bei dem SSL Port 465 ist das ohne Nutzung von SSL ja wohl klar...

Gruß Assertor

Edit: Variablennamen korrigiert

BAMatze 16. Jun 2009 11:13

Re: SMTP Email versenden schlägt fehl
 
Danke euch
BAMatze


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