Frage deutsch
~~~~~~~~~~~~~~~~
Wie übergibt mein QB Programm Kommandos an TELNET oder FTP ?
Kann ich, wenn ich mit SHELL "telnet" aufgerufen habe, Anweisungen über Qb an
Telnet weitergeben? Wie geht das?
Question English
~~~~~~~~~~~~~~~~
How can my QB prog pass commands to TELNET or FTP?
Antwort 1
~~~~~~~~~~~~~~~~
[ von Sebastian ( qbasic*sebastian-steiner.de ) im QB-Forum, 15.6.2004 ]
Schreib dazu folgendes kleine Programm:
OPEN "TEMP.TMP" FOR OUTPUT AS #1
PRINT #1, "TELNETBEFEHL"
PRINT #1, "TELNETBEFEHL"
PRINT #1, "QUIT" 'Oder wie das bei Telnet heißt. ;-)
CLOSE #1
SHELL "TELNET.EXE 123.123.123.123<TEMP.TMP"
In die Datei Temp.tmp musst Du die Befehle genau so reinschreiben, als wenn
Du sie eingeben würdest. Wenn Du normal nach einem Befehl ENTER drückst, muss
auch in der Datei eine neue Zeile begonnen werden. Ich mache das so ähnlich mit
FTP.EXE. Achtung! Wenn Du Passwörter oder andere geheime Sachen in die Datei
schreibst, solltest Du sie nach dem SHELL "..." unbedingt wieder löschen.
*** Anmerkungen
An sich funktioniert das recht einfach. Du legst eine Datei an, in der alle
Eingaben, die du sonst in telnet machen würdest, genauso drinstehen.
Wenn du nach dem Passwort Enter drücken würdest, muss in der Datei an dieser
Stelle auch ein Absatz sein usw. Ähnlich wie bei FTP also.
Bei telnet und insbesondere beim Mails verschicken ist das aber leider nicht
so knorke, weil du immer so eine hohle Antwort wie "530" oder sowas abwarten
musst und ggf. darauf reagieren musst.
Daher müsstest du die Ausgaben die telnet macht auch irgendwie abfangen und
auswerten.
Gut, man könnte das auch ohne diese Auswertung machen, aber dann ist nicht
gewiss wie gut das Programm insbesondere bei verschiedenen Servern funktioniert.
Außerdem weißt du dann nicht, wie's mit der eMail steht: Wurde sie gesendet oder
waren wir gar nicht online?
Antwort 2
~~~~~~~~~~~~
[ von Sebastian Steiner ( sebastian_steiner*gmx.de ) im
QB-Forum, 7.11.2004 ]
.
Per FTP eine Datei von einem Internet-Server herunterladen funktioniert
ungefähr so:
OPEN ENVIRON$("TEMP")+"\~FTP.TMP" FOR OUTPUT AS #1
PRINT #1, "Benutzername"
PRINT #1, "Passwort"
PRINT #1, "GET"
PRINT #1, "index.html"
PRINT #1, "C:\index.html"
PRINT #1, "quit"
CLOSE #1
SHELL "ftp.exe home.arcor.de<"+ENVIRON$("TEMP")+"\~FTP.TMP"
KILL ENVIRON$("TEMP")+"\~FTP.TMP"
Der Code lädt eine Datei vom Server via FTP herunter. Hochladen ist ähnlich.
Beschäftige dich mal mit den FTP-Befehlen. Das Ganze ist ungetestet, aber sollte
funktionieren.
Antwort 3
~~~~~~~~~~~~~~~~
[ von z0mbie ( z0mbie*inverse-productions.de ) im
QB-Forum, 15.6.2004 ]
.
Wenn die Anweisungen bedingt sein sollen (z.B. von den Antworten eines
Servers), kann man die zu sendenden Kommando-Strings in eine Textdatei speichern
und telnet dann so aufrufen:
SHELL "telnet server port <datei.txt"
Ich bin mir aber nicht sicher, ob Du 1 oder 2 < brauchst.
Antwort 4
~~~~~~~~~~~~~~~~
[ von Andre Klein ( "A.K.", webmaster*iconsoft.de ) im QB-Forum,
13.4.2004 ]
.
Das Verschicken einer E-Mail per Telnet funktioniert gemäß dem folgenden
kleinen Beispiel:
SHELL "Telnet post.strato.de 25"
'post.strato.de ist ein SMTP-Server. Port 25 ist auch SMTP.
Wenn man das so aufruft, dann wird automatisch ein Terminal gestartet, wo man
jetzt seine Eingaben machen kann.
'Wenn die Verbindung steht kommt folgendes:
<- "220..."
Das erste was man dann machen muß ist:
-> "HELO blabla" - Anmelden beim SMTP
<- "250..."
-> "MAIL FROM: vonmir@dir.de" - Die eigene E-Mail-Adresse
<- "220..."
-> "RCPT TO: dieziel@adresse"
<- "250..."
-> "Data"
<- "354..."
-> "Das ist ein Probetext."
-> "."
<- "250..."
-> "Quit"
<- "221..."
So, ich hoffe, das ist noch übersichtlich genug.
-> bedeutet selber schreiben.
<- bedeutet Antwort vom Server
Port 80 = HTTP
Port 21 = FTP (benötigt aber mindestens 2 Ports, wenn man Infos haben
möchte)
usw.
Jedes Protokoll hat natürlich seine eigenen Befehle. Bei HTTP sollte der
"GET" Befehl aber reichen zum Ausprobieren.
Antwort 5
~~~~~~~~~~~~~~~~
[ von Andreas Meile ( qbasicde*dreael.ch ) im QB-Forum,
25.4.2004 ]
.
Zum Aufrufen von E-Mail-Funktionen mit Qbasic über Telnet gibt es u.a. den
folgende Ansatz, der Sockets verwendet:
Probiere einmal ein Telnet auf Port 25 Deines Providers machen. Gib dort
telnet smtp.meinisp.de 25
220 smtp.meinisp.de SMTP Sendmail ready.
HELO qbasic.de
250 Pleased meet you
MAIL From: absender*darkangel.de
250 Sender ok
RCPT To: darkangel*darkangel.de
250 Recipient ok
DATA
354 Enter mail, and end with "." on a line by itself
From: "Dark Angel" <absender@darkangel.de>
To: darkangel@darkangel.de
Subject: Test
Dies wird direkt mit handerzeugtem SMTP-Protokoll versendet.
.
250 Message accepted for delivery
QUIT
221 closing connection
Dieses einfache Protokoll solltest Du wie unter
http://dreael.catty.ch/Deutsch/BASIC-Knowhow-Ecke/InternetMitQuickBASIC.html
beschrieben umsetzen können. Details siehe RFC 2821, also
http://www.ietf.org/rfc/rfc2821.txt
Diese Methode eignet sich in einer reinen MS-DOS 6.22-Umgebung am besten.
*** Tipp
SMTP ist ein dialogorientiertes Protokoll, wo man immer die Rückantwort
abwarten muss, bevor man zum nächsten Schritt übergeht. Speziell diese
-stelligen Codes der Rückmeldungen muss man auswerten. Für weitere Details
siehe
http://www.ietf.org/rfc/rfc2821.txt
Antwort 6
~~~~~~~~~~~~~~~~
[ von Andreas Meile ( qbasicde*dreael.ch ) im QB-Forum,
10.11.2004 ]
.
Es gibt verschiedene Möglichkeiten
1.) Zur Telnet-Variante:
Dazu kann man Socket-Programmierung wie unter
http://dreael.catty.ch/Deutsch/BASIC-Knowhow-Ecke/InternetMitQuickBASIC.html
vorgehen, in dem man eine Socket-Verbindung auf den SMTP-Server, Port 25 des
ISPs aufbaut und folgenden Dialog ausführt:
Beispiel-SMTP-Sitzung hat folgendes geschrieben:
dreael@pingu:~ > telnet smtp.provider.de 25
Trying 192.0.2.235...
Connected to smtp.provider.de.
Escape character is '^]'.
220 smtp.provider.de ESMTP Sendmail 8.12.3/8.12.3/SuSE Linux 0.6; Wed, 10 Nov
2004 19:22:41 +0100
HELO dial-1234.provider.de
250 dial-1234.provider.de Hello dial-12345.provider.de [192.0.2.211], pleased
to meet you
MAIL From: hans.muster@provider.de
250 2.1.0 hans.muster@provider.de... Sender ok
RCPT To: empfaenger@domain.de
250 2.1.5 empfaenger@domain.de... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
From: "Hans Muster" <hans.muster@provider.de>
To: empfaenger@domain.de
Subject: Betreffzeile
Hallo Hans, dies ist
nur eine Testnachricht.
.
250 2.0.0 iAAIMfRL023347 Message accepted for delivery
QUIT
221 2.0.0 smtp.provider.de closing connection
Connection closed by foreign host.
dreael@pingu:~ > _
Die genauen Details sind in RFC 2821 beschrieben. POP3 ist übrigens ganz
ähnlich aufgebaut.
2.) VBScript-Variante mit CDONTS.NewMail
Wenn man mit NT 4.0/2000/XP Professional arbeitet und IIS installiert hat
(ASP-Programmierer arbeiten normalerweise so), kann man folgenden Code
verwenden:
absender$ = "hans.muster@provider.de"
empfaenger$ = "empfaenger@domain.de"
betreff$ = "Betreffzeile"
text1$ = "Hallo Hans"
text2$ = "Dies ist ein Test."
OPEN ENVIRON$("TEMP") + "\~SENDM.VBS" FOR OUTPUT AS 1
PRINT#1, "Set oMail = CreateObject(" + CHR$(34) + "CDONTS.NewMail" + CHR$(34)
+ ")"
PRINT#1, "oMail.From = " + CHR$(34) + absender$ + CHR$(34)
PRINT#1, "oMail.To = " + CHR$(34) + empfaenger$ + CHR$(34)
PRINT#1, "oMail.Subject = " + CHR$(34) + betreff$ + CHR$(34)
PRINT#1, "oMail.Body = " + CHR$(34) + text1$ + CHR$(34) + " & vbCrLf _"
PRINT#1, " & " + CHR$(34) + text2$ + CHR$(34)
PRINT#1, "oMail.Send"
PRINT#1, "Set oMail = Nothing"
CLOSE 1
SHELL "cscript //NoLogo " + ENVIRON$("TEMP") + "\~SENDM.VBS"
KILL ENVIRON$("TEMP") + "\~SENDM.VBS"
3.) Mit Microsoft Outlook
Auch Microsoft Outlook aus dem Office-Paket besitzt ansonsten ebenfalls
geeignete ActiveX-Automatisierungsobjekte, um ganz ähnlich wie Variante 2
arbeiten zu können. Hinweis: Sicherheitseinstellungen so anpassen, dass Deine
QB-Applikation als vertrauenswürdig akzeptiert wird!
4.) spezielle Kommandozeilen-E-Mail-Clients
Es gibt spezielle Kommandozeilen-E-Mail-Clients wie beispielsweise
- http://www.febooti.com/products/command-line-email/
- "Blat" ( www.blat.net )
die man direkt mit SHELL aufrufen kann
*** Tipp
Zum Thema E-Mail-Versand und Sockets allgemein: Siehe ausführliches Posting
unter
www.makorus.de/phpbb/viewtopic.php?p=1389#1389
Noch so viel zu TELNET.EXE von Windows: Es gibt die alte, grafische Version
aus Windows 95/98/ME/NT 4.0 sowie die neue Version als Konsolenapplikation
(=läuft in einer Eingabeaufforderung).
Bei der alten Version konnte man immerhin mit VBScript und dem Windows Script
Host via SendKeys() Tastendrücke senden. Obwohl die neue Version für
Kommandozeile wäre, klappte zumindest bei mir bisher noch nie ein
SHELL "telnet host.domain.de <eingaben.txt"
korrekt, weshalb man diese Variante "beerdigen" muss.
Antwort 7
~~~~~~~~~~~~~~~
[ von TJHooker im QB-Forum, 7.2.05 ]
.
So funktionierts: Erstelle eine txt-Datei mit folgendem
Inhalt:
benutzername
passwort
weitere befehle
... einfach einen Befehl pro Zeile, ohne FTP davor oder irgendwas, und
speichere die Datei mit der Endung
.TXT ab. In deinem Programm rufst du dann einfach
SHELL "ftp -s:deinetextdatei.txt ftp-serveradresse"
auf. Das dürfte funktionieren. Wenn du das nun in einer Schleife laufen
lassen willst, musst du immer nur den Inhalt der Textdatei vom QBasic-Programm
aus ändern und den SHELL-Befehl verwenden (siehe oben). Wenn du schon eine
Verbindung aufgebaut hast, kannst du es trotzdem aufrufen; denn wenn du
verbunden bist, bist du verbunden...Probier mal damit rum, so muss es
laufen.
*** weitere Bemerkungen
So wie ich's geschrieben habe, funktionierts auch aus einer Batch-Datei
heraus. Wenn du die TXT-Datei mit QBasic bearbeitest, funktionierts 100%ig. Mit
der option "s" bei FTP veranlasst Du FTP.EXE, nach dem Öffnen der Verbindung ein
Script abzuarbeiten. Das ist Alles; und dieses Skript kannst du ja mit QB
editieren...
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]