Mail per Telnet versenden



  • Hallo,
    ich würde mir gerne auf meinem Linux-Rechner ein Skript schreiben, welches mir bei diversen Aktionen eine EMail schickt. Ich möchte nur für diesen Zweck auf dem Linux-Rechner aber kein eigenen Mail-Server installieren, da schon einer auf meinem Windows-Rechner läuft.
    Wenn ich von Linux mit "telnet 10.25.4.1(=Windows-Kiste) 25" und dann per Hand den ganzen Kram per Hand eingebe funktioniert es. Nun soll dies aber ein Skript erledigen, und so sieht's aus:

    #!/bin/sh
    ( echo "HELO linux-kiste"
      echo "MAIL FROM: system@linux-kiste"
      echo "RCPT TO: ich@windows-kiste"
      echo "DATA"
      echo "Subject: Betreff"
      echo "test"
      echo "."
      echo "QUIT"
    ) | telnet 10.25.4.1 25
    

    Funzt nicht!

    Auch das bringt nichts:

    #!/bin/sh
    echo -e "hier der ganze kram nun mit <CRLN>" | telnet 10.25.4.1 25
    

    ich bekomme immer nur dies hier ausgegeben:

    Trying 10.25.4.1...
    Connected to 10.25.4.1.
    Escape character is '^]'.
    220 <Name der Windows-Kiste> Microsoft ESMTP MAIL Service, Version: 5.0.2195.5329 ready at  Mon, 5 Jan 2004 17:32:42 +0100
    Connection closed by foreign host.
    

    Ich dachte mir schon, dass das Spript möglicherweise zu schnell ist und habe deshalb ein paar sleep's eingebaut, bring aber auch nichts.

    Weiss jemand, was ich falsch mache?
    Danke!



  • Hallo!

    Für solche Zwecke sollte netcat recht gut sein.
    Gibts hier: http://www.atstake.com/research/tools/network_utilities/



  • Achso, habe ich vergessen zu erwähnen. Habe es natürlich auch mit nc, statt telnet probiert. Funktioniert auch nicht!
    Was kann denn nur der Fehler sein? Wenn ich die Zeilen selber mit Telnet eingebe, funktioniert es ja (bei nc gibt es bei der Methode per Hand Proble mit CL+LF).

    Warum funktioniert es dann nicht, wenn ich die Eingabe auf meine Weise Pipe? Da muss duch ein Denkfehler sein! Hat jemand eine Idee?



  • Kurz: Deine Lösung heißt rsh, das telnet für Skripte.



  • Was hat denn jetzt RemoteShell damit schon wieder zu tun?

    Vielleicht nochmal mein Problem: Rechner A soll per Skript eine EMail versenden können an irgend einen Rechner B, der einen SMTP-Dienst/MTA laufen hat.
    Rechner A soll dafür keinen(!) eigenen Mailserver installiert haben, weil dies ja nicht notwendig ist. Dazu muss das Skript nur die Zeichenfolgen entsprechend des SendMailTransposrtProtocol's senden. Dies kann man z.B. mit "telnet <IP von Rechner B> 25" per Hand eingeben:

    HELO
    MAIL FROM: sys@rechner_a
    RCPT TO: ich@rechner_b.de
    DATA
    Subject: Betr
    Inhalt
    .
    QUIT
    

    ... und "ich@rechner_b.de" bekommt tatsächlich eine EMail mit dem Subject "Betr", Inhalt ist "Inhalt" und Absender ist "sys@rechner_a". So, das FUNKTIONIERT!

    Wenn ich allerdings die Standard-Eingabe von telnet (oder nc!) automatisch mit diesen Daten befülle (siehe Skripts oben) funktioniert es nicht. Ich möchte nur wissen, was ich falsch mache. Oder sollte rsh dafür eine Lösung bieten, wäre ich um ein kleines Beispiel dankbar, da ich mir mit rsh nichts vorstellen kann (Rechner B hat übrigens keinen RSH-Server laufen!).

    Danke.



  • Ich vermute, dass dein Skript die einzelnen Zeilen zu schnell hintereinander an den Server schickt, ohne die Antworten des Servers abzuwarten.



  • Ja, das habe ich auch schon vermutet. Deshalb habe ich es in dem ersten Skript auch schon mit einem "sleep 5" vor jedem "echo" probiert. Das Ergebnis ist aber das selbe, dauert nur länger bis es nicht funktioniert 😉



  • In der FAQ gibt es eine C-Source.
    Du musst auch die Antworten auslesen.



  • Ok, daran habe ich inzwischen auch schon gedacht, mir einfach ein kleines C Programm zu schreiben, obwohl ich dies als absolute Notlösung betrachte. Ein Bash-Skript wäre mir viel lieber und solange es nicht klar ist, warum es damit nicht geht (gehen kann?), gebe ich nicht auf. Aber vielleicht lässt es sich ja noch lösen.

    Unix-Tom schrieb:

    Du musst auch die Antworten auslesen.

    Ich dachte, dass ich die Antworten auslesen würde? Sie werden zwar nicht interpretiert, aber auf der Konsole müssten sie doch angezeigt werden, schliesslich bekomme ich ja auch Ausgaben von telnet angezeigt, wie "Trying to connect... etc.".
    Habe ich hier etwa meinen Denkfehler?



  • z.B. mit mail (Nur Text-Mails, Anhang IMHO nicht moeglich):

    mail -s "Test mit mail" user@xyz.de < /pfad/mail.txt
    

    z.B. mit mutt (Nur Text-Mails)

    mutt -s "Test mit mutt" -a /pfad/anhang user@xyz.de < /pfad/mail.txt
    

    z.B. Sendmail direkt ansprechen (hier eine HTML-Mail)

    #!/bin/sh
    
    /usr/sbin/sendmail -f abc@xyz.de -t <<EOF
    Subject: Test mit sendmail
    From: Absender <abc@xyz.de>
    To: Empfaenger <xyz@abc.de>
    Content-Type: text/html
    
    <HTML><BODY>
    <A1> Das ist eine HTML Mail </A1>
    Hallo ...
    </BODY></HTML>
    EOF
    


  • @rup: Ich bin ja wirklich dankbar für jede Hilfe, aber nun zum 3. mal: Ich will keinen Mailserver auf dem Linux-Rechner installieren (z.B. ist "mail" ein Tool für den Postfix-Deamon).

    Mein Problem richtet sich wahrscheinlich weniger an Leute, die alle Mail-Kommandos kennen, sondern eher an diejenigen, die sich mich Bash und Pipen sehr gut auskennen.



  • wischmop2 schrieb:

    Mein Problem richtet sich wahrscheinlich weniger an Leute, die alle Mail-Kommandos kennen, sondern eher an diejenigen, die sich mich Bash und Pipen sehr gut auskennen.

    Nein, Du willst nicht verstehen, das telnet ein Programm ist, das für den interaktiven Einsatz ausgelegt ist. Um das zu scriptifizieren kann man sich eines anderen Programmes bedienen, das das Script dann entsprechend an die Anwendung verfüttert. expect zB (erfordert Tcl/Tk, mW).



  • Daniel E. schrieb:

    Nein, Du willst nicht verstehen, das telnet ein Programm ist, das für den interaktiven Einsatz ausgelegt ist.

    Stimmt! Verstehe nämlich nicht, warum telnet die Interaktion von einem anderen Programm stört. Dachte immer "programm1 | programm2" hätte zur Folge, das stdout von Programm1 für Programm2 stdin ist und somit meine Eingaben, die ich sonst per Hand bei Telnet mache nun die Ausgabe von Programm1 ist.
    Egal, belassen wir es hierbei, eine Lösung oder ein Beispiel mittels Bash-Skript (ohne SMTP-Server) wird mir wahrscheinlich eh keiner geben können.

    Trotzdem vielen Dank für eure Mühe!



  • > Ich möchte nur für diesen Zweck auf dem Linux-Rechner aber kein eigenen Mail-Server installieren
    hab ich ueberlesen und kann ich auch nicht nachvollziehen, da normalerweise auf jeder Linux Kiste ein MTA laeuft. Viele Systemtools verwenden diesen zum verschicken von Mails an den Admin (z.B. cron).

    Folgendes hat bei mir mit web.de gerade funktioniert (nach pop3 Authentifizierung)

    #!/bin/bash

    netcat smtp.web.de 25 << EOF
    helo xyz.abc
    MAIL FROM: account@web.de
    RCPT TO: xyz@abc.de
    DATA
    test mit netcat
    .
    QUIT
    EOF



  • wischmop2 schrieb:

    Egal, belassen wir es hierbei, eine Lösung oder ein Beispiel mittels Bash-Skript (ohne SMTP-Server) wird mir wahrscheinlich eh keiner geben können.

    Hast Du dir expect wenigstens mal angesehen?
    Netcat bzw nc (<- rup) geht wohl, falls eines der Programme existiert, rsh mit ein bißchen rumbasteln an den Ports ebenfalls. Was willst Du eigentlich noch?


Log in to reply