ZX81 Sendmail und unverschlüsselte SMTP-Server?

ZX-Team Forum
Benutzeravatar
siggi
User
Beiträge: 2450
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: ZX81 Sendmail und unverschlüsselte SMTP-Server?

Beitrag von siggi » 14.08.2018, 18:39

:wink:

Und hier noch ein Screenshot mit Druck/Filemenü:
Menu.jpg
Menu.jpg (85.24 KiB) 564 mal betrachtet
Gruß
Siggi
Zuletzt geändert von siggi am 05.09.2018, 17:28, insgesamt 2-mal geändert.
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Datenkraken bitte nicht füttern!

Benutzeravatar
siggi
User
Beiträge: 2450
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: ZX81 Sendmail und unverschlüsselte SMTP-Server?

Beitrag von siggi » 05.09.2018, 14:59

Es geht noch etwas besser :mrgreen:

Ich habe (durch Tipps und Tricks) den Programmcode verkleinern und dadurch noch mehr Features einbauen können. Die beiden Neuerungen sind:
1) man kann sich im BASIC-Teil ein "Adressbuch" einrichten, um oft genutzte E-Mailadressen kurz über ihren "Alias" eingeben zu können
2) man kann nun nicht mehr nur Zedit-Text, sondern beliebige Dateien (bzw. Memoryblöcke) als Attachment zur Nachricht mitschicken

zu 1)
Damit der Normaluser dazu nicht das C-Programm umbauen muß, habe ich vorgesehen, daß im BASIC-Teil des Programms Kürzel (Alias) und E-Mailadressen abgelegt werden können (in BASIC Variable A$). Wenn das C-Programm dann nach E-Mail-Adresse des Empfängers fragt, gibt man nur seinen Alias ein. Wenn das C Programm erkennt, daß kein'@' (als PFUND eingegeben!) im eingebenen Adresse-String enthalten ist, dann betrachtet es die Eingable als "Alias": es ruft dann nach und nach die BASIC-Zeilen 1000-1100 auf, in denen die Variable A$ vom BASIC gefüllt wird. Das C-Programm vergleicht dann den darin abgelegten Alias und holt sich bei Gleichheit die E-Mail-Adress auch aus A$. An die wird die E-Mail dann gesendet.
Ansonsten wird weiter gesucht bis Zeile 1100.

Die Variable A$ wird wie folgt befüllt, damit sie das C Programm auswerten kann:

LET A$ = "alias=e-mail"

Wenn das C-Programm dies einliest, wird der Teil vor dem "=" als "Alias" und der Teil danach (keine Leerzeichen!) als dessen E-Mailadresse betrachtet.
Dort kann man also auf BASIC Ebene bis zu 100 "Alias" eingeben (Zeilen 1000-1100), sofern das noch ins Ram passt :wink:

Im Programm könnte das beispielsweise so aus aussehen:

Code: Alles auswählen

           900>STOP                       
           990 REM ENTER HERE (LINES 1000-1100) ALIAS=E-MAIL. E.G. FOR ALIAS "ME":                         
           995 REM LET A$="ME=ME&HOME.COM"
          1000 LET A$="SIGGI=SIGGI&DORT.DE"
          1001 LET A$="angie=merkel@bundestag.de"                               
          1100 REM LAST ALIAS LINE        


Wenn man also eine E-Mail einfach an "SIGGI" sendet, wird daraus die E-Mailadresse "SIGGI@DORT.DE" gemacht (inverse Zeichen werden dabei zu GROßBUCHSTABEN)

Zu 2)
Man kann nun Zedit-Text oder beliebige Speicherbereiche (Eingabe von Startadresse und Länge und Dateiname) als Attachment der E-Mail mitschicken. Um z. B. ein BASIC-Programm zu verschicken, lädt/kopiert man es auf Adresse 32768, notiert desse Länge und startet dann SENDMAIL.
Dort gibt man dann Adresse und Länge ein und es geht auf die Reise ...

Viel Spaß beim Emaillieren :wink:

Siggi


Edit: ZIP erstmal wieder entfernt. Suche noch nach sporadischem Aufhänger :shock:
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Datenkraken bitte nicht füttern!

Benutzeravatar
siggi
User
Beiträge: 2450
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: ZX81 Sendmail und unverschlüsselte SMTP-Server?

Beitrag von siggi » 05.09.2018, 20:53

Hier nun ein ZIP, in dem SMAIL ist, das sporadisch nicht mehr hängt ;)

Grund war ein verwirrtes BASIC, das manchmal nach Ende des C-Programmes (nachdem man im C-Programm vor- und rückwärts die BASIC-Zeilen ausgeführt hatte, um nach einem Alias zu suchen) nicht mehr in den Kommando-Modus gehen wollte.

Nun wird am Ende des C-Programmes die Zeile 900 "STOP" ausgeführt, das BASIC wieder auf die Reihe bringt.
Diese Zeile sollte also nie gelöscht werden, auch wenn bei der Eingabe von neuen "Alias" ins BASIC-Programm der Speicherplatz knapp wird.

Gruß
Siggi
smail-V3.1.zip
(13.59 KiB) 19-mal heruntergeladen
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Datenkraken bitte nicht füttern!

Benutzeravatar
siggi
User
Beiträge: 2450
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: ZX81 Sendmail und unverschlüsselte SMTP-Server?

Beitrag von siggi » 09.09.2018, 13:29

Und es geht noch etwas mehr. :mrgreen:
Deshalb hier nun das ultimative, finale (*) ZX81-SENDMAIL (V3.2) :mrgreen:

Damit kann man nun beliebig viele Dateien als Attachment der E-Mail verschicken!

Da aber nicht "beliebig viele" Daten ins RAM des Zeddy reinpassen, habe ich über die BASIC-Schnittstelle des Z88DK einige Zeilen BASIC eingebunden, die MEFISDOS oder den USB-Filemanager aufrufen, um weitere Attachments ins Ram zu laden, die dann verschickt werden.

Die BASIC-Schnittstelle kann natürlich jeder für sein Massenspeicher-System anpassen. Dazu können die Zeilen 2000-2100 genutzt werden. Über BASIC-Variablen können Daten zwischen BASIC und C-Programm ausgetauscht werden:
zu Beginn der Zeilen 2000 wird Name des Attachments (String N$), die Startadresse den internen Textpuffers (Zahl "addr") und seine Länge (Zahl "len") geliefert. Dort könnte man seine Daten hinkopieren. Oder anderwo hin, wo halt Platz ist (z. B. oberhalb 32K).

Am Ende wird vom C-Programm "addr" und "len" wieder eingelesen, da sollte also Startadresse und Länge des Attachments im RAM zurückgegeben werden, wo es sich das C-Programm dann holt und verschickt.

Für den MEFISDOS-Aufruf sieht das bei mir so aus:

Code: Alles auswählen

          2000 POKE 0,2
          2005 PRINT "LOAD FILE TO 32768"
          2010 RAND USR 8198
          2020 LET ADDR=32768
          2030 LET LEN=PEEK 16438+256*PEEK 16439
          2050 POKE 0,4
          2099 STOP
Und für den UFM-32K, den ich erst mit Mefisdos nach 32K lade und dann dort aufrufe, sieht das so aus:

Code: Alles auswählen

          2000 LOAD "D:CMDS/UFM-32K"
          2005 PRINT "LOAD FILE TO 40960"
          2010 PRINT USR 32768
          2020 LET ADDR=40960
          2030 LET LEN=PEEK 16438+256*PEEK 16439
          2040 POKE 0,4
          2099 STOP 
Den UFM-32K lade ich erst dann ins RAM ab 32K, wenn ich ihn für ein (weiteres) Attachment benötige (nicht schon vor Start von Sendmail!). Bis dahin ist das RAM ab 32K noch unangetastet und kann also noch einen ZEDIT-Text enthalten, der als erstes Attachment verschickt wird. Danach kann dann der 32K-Bereich für den Filemanager benutzt werden, wenn wirklich noch ein Attachment angehängt werden soll.

EDIT: DIESE BEISPIELE FUNKTIONIEREN AUF MEINER HARDWARE! FÜR EURE HARDWARE MÜßT IHR DIESE BASIC-ZEILEN ANPASSEN!

Bitte beachten:
Im BASIC-Teil können keine Sprünge (GOTO, GOSUB, FOR/NEXT) bearbeitet werden. Fehlerbehandlung ist da also nicht möglich!
Und am Ende sollte der BASIC-Teil mit STOP abgeschlossen sein, damit BASIC nicht verwirrt wird.

Die "POKE 0,x"-Befehle bewirken bei mir Speicherbank-Umschaltungen und können anderswo entfallen oder durch POKE 8 ersetzt werden.

So sieht der Aufruf dann aus: Menü-Punkt 6 (Filemanager) auswählen:

Filemanager.jpg
Filemanager.jpg (74.06 KiB) 427 mal betrachtet

Und hier ist ein BASIC-Beispiel, wie das komplette BASIC-Programm ausehen kann (die Zeile 900 STOP darf nie gelöscht werden!)

Code: Alles auswählen

             2>POKE 0,4
             3 RAND USR VAL "16514"
           900 STOP 
           990 REM ENTER HERE (LINES 1000-1100 ALIAS=E-MAIL. E.G. FOR ALIAS "ME":
           995 REM LET A$="ME=ME&HOME.COM"
          1000 LET A$="SIGGI=SIGGI&XXX.DDD"
          1010 LET A$="ME=GARGAMEL&GARGA.DE"
          1100 REM LAST ALIAS LINE
          1999 REM LINES 2000-2100 FOR CALLING A FILEMANAGER
          2000 LOAD "D:CMDS/UFM-32K"
          2005 PRINT "LOAD FILE TO 40960"
          2010 PRINT USR 32768
          2020 LET ADDR=40960
          2030 LET LEN=PEEK 16438+256*PEEK 16439
          2040 POKE 0,4
          2099 STOP 
Damit Platz für BASIC bleibt, habe die interne Message-Größe auf 500 (vormals 1000) Zeichen reduziert. Wer mehr Text eintippen will, sollte das mit ZEDIT tun oder mehre Texte nacheinander eintippen und diese als Attachments verschicken. Dabei wird der Text der "Message" im Klartext übertragen, die im Attachment werden base64-codiert, sodaß man dort beliebige binäre Daten (z. B. P-Files) verschicken kann.

Hoffe, daß das auch mit anderen Massenspeichersystemen funzt, denn das Zusammenspiel des C-Programm mit BASIC und anderen C-Programmen (UFM) ist nicht ganz trivial, da sich die Programme bei FAST/SLOW-Umschaltungen sich gegenseitig die Display-Routinen klauen ...

Gruß
Siggi
sendmail-V3.2.zip
SENDMAL V3.2 mit UFM-Aufruf
(15.04 KiB) 18-mal heruntergeladen
(*) sofern mir nicht noch mehr einfällt :wink:
Zuletzt geändert von siggi am 13.09.2018, 09:18, insgesamt 3-mal geändert.
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Datenkraken bitte nicht füttern!

Benutzeravatar
siggi
User
Beiträge: 2450
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: ZX81 Sendmail und unverschlüsselte SMTP-Server?

Beitrag von siggi » 12.09.2018, 13:01

Hallo
noch ein paar Tipps, wenn man sich seinen eigenen Filemanager (z. B. für ZXNU, vielleicht auch ZxMore) über die Zeilen 2000-2100 einbinden will:
Vorneweg: Die BASIC-Zeilen werden alle im FAST-Modus ausgeführt (vor Ausführen JEDER Zeile wird in FAST geschaltet!). Am Ende wird dann erst wieder in SLOW geschaltet. Das ist notwendig, um die DISPLAY-Routine unter Kontrolle zu halten, die im C-Programm ja eigens benutzt wird (nicht die Standard-Display-Routine des Zeddy).
Somit ist die Ausgabe über die PRINT-Anweisung in meinen Beispielen oben nicht sichtbar.

Im Code sieht das so aus (zx_line() ist die Funktion, die die BASIC-Zeile ausführt)

Code: Alles auswählen

unsigned int __CALLEE__ exec_BASIC_lines(unsigned int start, unsigned int end)
{
	err = 0;
	zx_cls();
	for (line_no = start; line_no <= end; line_no++)
	{
		in_WaitForNoKey();
		zx_fast();
		err = zx_line(line_no);
		if ((err > 0) && (err != 0xffff) && (err != 9))
		{
			break;
		}
	}
        zx_cls();
	zx_slow();
        in_WaitForNoKey();
	return err;
}
Wer also unbedingt was sehen muß, muß innerhalt einer BASIC-Zeile den SLOW-Modus einschalten und seine möchtegern-sichtbaren Aktionen in der gleichen Zeile durchführen. Das geht aber nicht im Zx81-BASIC (nur 1 Kommando pro Zeile), nur in einem MC.
Genauso wird es von Mefisdos im RAM/EEPROM oder UFM gemacht, die selbstständig nach SLOW schalten, wenn es was zu sehen gibt.

Da man beim ZxMore nur einfach an die LOAD_Funktion dran kommt, wenn SLOW-Modus an ist, müßte man beim ZxMore ein kleines MC schreiben,
das
- in SLOW schaltet
- in Schleife auf einen bestimmen Tastendruck wartet (BREAK?)
In dieser Schleife könnte man dann mit (DS-L) ein Attachment laden und dann nach Tastendruck (BREAK?) zum C-Programm zurückkehren.
Aufruf dann in Zeile 2000 durch RAND USR ....

Wenn man nicht komfortabel über den UFM, sondern auf Kommandozeilen-Ebene den USB-Treiber (PIO oder NU-Version) benutzen will, muß man vor Start von Sendmail erstmal ins richtige Verzeichnis des USB-Sticks reinwechseln, wo man seine Attachments drin hat.
Und im Sendmail kann man ja den Namen des Attachments angeben, der auch über die BASIC-Variable N$ beim Aufruf des USB-Treibers an diesen als Dateinamen der zu ladenden Datei mitgegeben werden kann.

So müßte das dann aussehen, wenn der USB-Treiber über seine BASIC-Schnittstelle auf XXX aufgerufen und die Datei nach 41000 geladen werden soll:

Code: Alles auswählen

2000 PRINT USR XXX;"L "+N$+" 41000"+CHR$(11)
2020 LET ADDR=41000
2030 LET LEN=PEEK 16438+256*PEEK 16439
2100 STOP
Falls Adresse oder Dateilänge nicht über die Systemvariablen automatisch ermittelt werden können, ist das kein Beinbruch: ADDR und LEN kann man im Sendmail Programm auch noch manuell eingeben.

Die Zeilen 2000-2100 sollte man testweise mit RUN 2000 ausführen und so richtig austesten (auch im FAST-Modus!).
Wenn sie da fehlerlos laufen, kann man sie dann auch über Sendmail (nach RUN) aufrufen lassen.
Man kann den Filemanager ja auch vor dem Verbindungsaufbau zum Mailserver schon in Sendmail aufrufen (dort wo die Eingabe der Message erwartet wird) und so auch mal antesten.

Falls das mit dem FAST-Modus der BASIC-Zeilen zu viel Ärger macht: Bescheid geben.
So richtig stabil ist das bei mir nur im FAST-Modus gelaufen, aber vielleicht ist da ja noch was machbar (wenn erforderlich).

Gruß
Siggi
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Datenkraken bitte nicht füttern!

Antworten