Entwickler-Ecke

Internet / Netzwerk - Indy SMTP - Mail an externe Adresse verschicken ?


mambo - Mo 02.08.04 16:27
Titel: Indy SMTP - Mail an externe Adresse verschicken ?
Hallo !

Ich möchte, dass mein Programm sich an unseren firmeninternen SMTP-Server anmelden und darüber Mails an die Angestellten verschicken kann. Dies habe ich mit der Indy-Komponente (IdSMTP) realisiert. Verschicke ich ein Mail an eine firmeninterne Adresse, läuft das soweit auch alles gut, nur sobald ich eine "externe" Adresse angebe, dann kommt immer der bekannte "relay" Fehler! Das ist mir natürlich auch klar, wenn ich der Komponente nur "host" und "port" als Parameter übergebe, dann läßt mich der Server nur intern- aber nicht "rausmailen" !

Wenn ich jedoch probiere, UserId und Password zu übergeben und dann mit IdSMTP.Authenticate versuche, mich zu authentifizieren, dann kommt immer die Fehlermeldung: "Unrecognized Authentication Type" !


Delphi-Quelltext
1:
2:
3:
4:
5:
  IdSMTP.Connect;
  IdSMTP.AuthenticationType := atLogin;
  IdSMTP.UserID := 'Mein_Benutzername';
  IdSMTP.Password := 'MeinPasswort';
  IdSMTP.Authenticate; // hier kommt der Fehler !!!


Auf dem Server läuft auch unser MS Exchange, hängt das vielleicht damit zusammen, daß man sich grundsätzlich mit der Indy-Komponente nicht bei Exchange-SMTP-Servern anmelden kann ???

Weil ich denke doch, daß, wenn ich mich am Server korrekt anmelde, ich auch an externe Adressen Mails verschicken kann, oder ? Über Outlook kann ich das ja auch ... oder ist das ganz was anderes ?

Danke für die Hilfe

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt


Manina - Mi 07.03.07 19:53

Ich habe genau das selbe Problem...

Wirklich niemand mit ner Idee ?


matze - Mi 07.03.07 23:41

also erstmal ist es unnötig die Methode Authenticate aufzurufen. Jedenfalls meiner Erfahrung nach.
Mach einfach einen connect();

Wenn es dann immer noch nicht geht würde ich mal schauen, ob der Exchange Server auch wirklich SMTP unterstützt. Du könntest dich mit einem Packetsniffer ja mal reinhängen und schauen, was Outlook bei der Kommunikation mit dem Server anders macht als die Indy Komponente.

Was es auch noch gibt: Das kenne ich aber nur von Freehostern ist eine Praxis, die sich "SMTP after POP" nennt. Das heisst, dass man sich erst per POP3 am Server einmal angemeldet haben muss, bevor man Mails senden kann. Kann sein, dass das bei deinem Server so eingestellt ist. Ist aber unwahrscheinlich.

Ich würde dir mal zu dem Packetsniffer raten.

//Edit: Ich hab mir grad nochmal deinen Code angeschaut und den Fehler gefunden.
Dreh mal die Reihenfolge um, sodass du erst die Daten setzt und dann das connect machst. Den Authenticate lass aber raus!


Manina - Do 08.03.07 17:28

Das Problem ist doch gewesen, Post an Externe Adressen zu schicken, an interne funzt ja alles.

Ich hab inzwischen eine brauchbare Lösung gefunden :lol:


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:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
      Msg := TIdMessage.Create(SMTP);
      Msg.AttachmentEncoding := 'MIME';
      Msg.ContentType := 'text/plain';
      Msg.Encoding := meMIME;
      Msg.NoEncode := False;
      Msg.NoDecode := False;
      Msg.IsEncoded := True;
      Msg.Subject := MainWin.Caption;
// Empfängeradresse (Extern !!!!!)
      with Msg.Recipients.Add do begin
        Address := Edit1.Text;
        Name := Copy(Edit1.Text, 1, Pos('@',Edit1.Text) - 1);
      end;
// CC-Empfänger (intern oder extern)
      if Edit7.Text <> '' then with Msg.CCList.Add do begin
        Address := Edit7.Text;
        Name := Copy(Edit7.Text, 1, Pos('@',Edit7.Text) - 1);
      end;
// eigene eMail-Adresse wie im Exchangekonto
      Msg.From.Address := Edit2.Text;
      Msg.From.Name := Copy(Edit2.Text, 1, Pos('@',Edit2.Text) - 1);
      Msg.Body.Text := Memo.Text;
// Anlage
      TIdAttachment.Create(Msg.MessageParts, MyFileName);
// der Exchangeserver
      SMTP.Host := Edit3.Text;
// wenn nur autorisiertes Login am Exchange möglich
      if Edit4.Text <> '' then begin
        SMTP.AuthenticationType := atLogin;
        SMTP.Username := Edit4.Text;
        SMTP.Password := Edit5.Text;
      end
// wenn anonymes Login möglich
      else begin
        SMTP.AuthenticationType := atNone;
        SMTP.Username := '';
        SMTP.Password := '';
      end;
      try
        SMTP.Connect;
        try
          if SMTP.Username <> '' then SMTP.Authenticate;
          try
            SMTP.Send(Msg);  // hier kommt erstmal ein Fehler vom Exchange...
          except
            ShowMessage('Error sending result to ' + Edit1.Text);
            // der hier angezeigt wird
            rep := SMTP.LastCmdResult;
            for i := 0 to rep.Text.Count - 1 do ShowMessage(rep.Text[i]);
          end;
        except
          ShowMessage('Error Authenticating on ' + SMTP.Host);
        end;
      except
        ShowMessage('Error Connecting to ' + SMTP.Host);
      end;
      SMTP.Disconnect;
      Msg.Free;


Der erwähnte Fehler lautet im Klartext (siehe Codezeile 48 ) etwa Relay to this recipient not allowed

Der Rest des Problems hat also weder was mit Indy noch mit SMTP zu tun, sondern ist eine Einstellungsfrage auf dem Exchangeserver selber ! Ich hab mir geholfen, indem ich dort ein Relay für meinen eigenen Rechner (also der, auf dem mein Programm läuft) nach draußen erlaubt habe (siehe angehängtes Bild).

//Edit Ups, hatte das zweite Bild vergessen :oops: