Parsing a mail packet lazarus / 38-Networking and Web Programming ---------------------------------------------------------------------- nugax · 2022-04-05 12:33 Hi! I have one more thing within this mailpacket parser I am trying to do. The documentation and composition of these packets are very old and not very good, and I am just a little new to FP. I have attached 2 mail packets to try. what I am trying to do is pull the AREA: out of the message body. If you open the packet in a text editor or hexdump in Linux, you see it  there, preceeded by a byte 0. But, I cant get any looping or anything to find AREA and then caapture and return what is after AREA: Here is what I have (that doesnt work). I would really just like to have a function that returns the AREA: -> but its proven to be a challenge. Maybe you can help determine where I am going wrong. Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i function GetMSGArea(MsgFile:  array of byte): string;var  iCnt: integer;  scheck: string;  sReturnString: string;  i: integer;  ch: char; begin  iCnt := 0;  write('first: ' + chr(MsgFile[iCnt]));  while iCnt < length(MsgFile) do  begin    //Check For CTL-A | ^A In Header    if (MsgFile[iCnt]) = 1 then    begin      //Have CTL-A      sCheck := '';      for i := 0 to 4 do      begin        AppendStr(sCheck, chr(MsgFile[iCnt + 1])); // +1 to remove Control Char Code ^A, etc      Inc(iCnt);          write('');      write('Chr: ' + chr(MsgFile[iCnt]));      end;       //Set What We Are Checking For    if (sCheck = 'AREA:') then      begin        repeat          ch := chr(MsgFile[iCnt]);          Inc(iCnt);          AppendStr(sReturnString, ch);        until (ch = #13); //Kludge Ends in ^M       end;    end;    Inc(iCnt);  end;   Result := sReturnString; end; ---------------------------------------------------------------------- nugax · 2022-04-05 12:33 Test packets ---------------------------------------------------------------------- Zvoni · 2022-04-05 14:27 Hmmm.....at first thought you would need something like StrPos from SysUtils, but for Bytes https://www.freepascal.org/docs-html/rtl/sysutils/strpos.html Yes, it's for PChar, but a PChar is basically an Array of bytes, too. btw: Why are you even looking for the CTL-A? And then make the consecutive processing dependant on finding it? ---------------------------------------------------------------------- nugax · 2022-04-05 14:55 I actually had to look for byte 0 not CTL-A. This is so old stuff man, its hard to determine. I was able to write a program that did this: adams@dev-box:~/git/cyberbbs/build$ ./ctoss-x86_64-linux -v one.pkt ---------------------------------------------------------------------- Packet Information for: one.pkt ---------------------------------------------------------------------- Size Of Packet Header: 60 Number Of Msgs: From          : 40:1/1 To            : 40:100/16 PKT Type      : 2 Password      : APOLLO Date          : 2021/10/3 @ 18:2 Do you want to view Messages? (Y/N): MSG Header Size: 34 MagicNr   : 02 00 Orig Node : 1 Dest Node : 16 Orig Net  : 1 Dest Net  : 100 Attribute : 0 Cost      : 0 Date      : 03 Nov 21  15:52:53 To       : All From     : Daryl Stout Subject  : Sophos Virus News AreaName : CN_CYBER_SECURITY Message Body: ==================================================== TZUTC: -0500 MSGID: 359.cybernt-cncybers@40:100/23 25e82e0c PID: Synchronet 3.19a-Win32 master/46b1f86f5 Nov  1 2021 MSC 1928 TID: SBBSecho 3.14-Win32 master/46b1f86f5 Nov  1 2021 MSC 1928 BBSID: TBOLT CHRS: ASCII 1 Here is the latest information from the Naked Security Blog from Sophos. You can go to nakedsecurity.sophos.com to read these. You can also sign up to have these delivered to your email during the week. Be sure that you PRACTICE SAFE HEX -- and that you keep your anti- virus, anti-malware, anti-spyware, and anti-ransomware software up to date. Do NOT open any email attachments, even if they appear to be from someone you know!! Even if you were notified in advance that the file was coming before it arrived, use EXTREME CAUTION when opening attachments, or even clicking on links. If it appears your email has been spoofed, change your access password immediately!! It's best to use 2 unrelated words (the longer, the better), separated by a non-alphabetic character...such as BOAT+TOUCH (please do NOT use this example). While you can't use high ascii characters online, you can use numbers, letters (upper and lower case), and symbols. The use of a Password Manager, such as Dashlane, is STRONGLY RECOMMENDED. That way, you can create a different password for each site you visit, and you don't have to remember them...plus, you can make it a complex password, that's difficult for someone to guess. If they do, they can steal your identity, and make you liable for things like credit card debt, etc. Lastly, if your browser seemingly locks up, telling you to call Microsoft at a certain number, do NOT call the number!! Instead, close your web browser, clear the cache and cookies, do a full virus scan, then restart the browser. You may also want to reboot the computer afterwards. *** Facebook to throw out face recognition, delete all template data. Publicity stunt?? Or privacy progress?? *** Europol announces "targeting" of 12 suspects in ransomware attacks More anti-ransomware activity by law enforcement, this time in Switzerland and Ukraine. *** Microsoft documents "SHROOTLESS" hack patched in latest Apple updates We'd have called this bug "SHROOTMORE", but naming it wasn't our call. *** Microsoft Edge finally arrives on Linux -- "Official" build lands in repos Microsoft Edge for Linux makes an Official landing --- SBBSecho 3.14-Win32  * Origin: The Thunderbolt BBS - Little Rock, Arkansas (40:100/23) SEEN-BY: 1/1 100/1 102 103 104 105 106 108 109 15 16 2 210 225 23 24 3 30 31 35 SEEN-BY: 100/36 37 40 56 200/1 PATH: 100/23 1/1 cadams@dev-box:~/git/cyberbbs/build$ ---------------------------------------------------------------------- nugax · 2022-04-05 16:13 When I look in hexdump i see: 0d  quite a lot. What is that byte? ---------------------------------------------------------------------- howardpc · 2022-04-05 16:46 $0D (hex notation) = 013 (decimal) = CR (short for Carriage Return, a control character) In Windows systems it is usually paired with $0A = 010 (decimal) = LF (short for Line Feed) This pair of characters form the LineEnding string on Windows. ---------------------------------------------------------------------- 440bx · 2022-04-05 16:46 Quote from: nugax on April 05, 2022, 06:13:03 pmWhen I look in hexdump i see: 0d  quite a lot. What is that byte? That's the hex value for a carriage return. ---------------------------------------------------------------------- Zvoni · 2022-04-05 17:36 Hmmmm…….. as an idea: why not load that whole thing into a Stringlist, and then parse the individual entries? If that „mail“ is plain text, why going through it as a byte-array? ---------------------------------------------------------------------- nugax · 2022-04-05 18:13 Quote from: Zvoni on April 05, 2022, 07:36:53 pmHmmmm…….. as an idea: why not load that whole thing into a Stringlist, and then parse the individual entries? If that „mail“ is plain text, why going through it as a byte-array? So if I did this, would I be able to find the control characters as in binary? byte 1, 0, etc? Would that load and work correctly? ---------------------------------------------------------------------- BobDog · 2022-04-05 18:28 I can take a bit of your message and transfer it to an array of byte, which is your starting point. Maybe I have oversimplified? Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i type aob=array of byte; vara:ansistring='To       : All'+#13#10 +            'From     : Daryl Stout'+#13#10 +              'Subject  : Sophos Virus News'+#13#10+              'AreaName : CN_CYBER_SECURITY'+#13#10+              'Message Body:'+#13#10 +'===================================================='+#13#10 +'TZUTC: -0500'+#13#10 +'MSGID: 359.cybernt-cncybers@40:100/23 25e82e0c'+#13#10 +'PID: Synchronet 3.19a-Win32 master/46b1f86f5 Nov  1 2021 MSC 1928'+#13#10 +'TID: SBBSecho 3.14-Win32 master/46b1f86f5 Nov  1 2021 MSC 1928'+#13#10 +'BBSID: TBOLT'+#13#10 +'CHRS: ASCII 1'+#13#10 +'Here is the latest information from the Naked Security Blog from Sophos.'+#13#10 +'You can go to nakedsecurity.sophos.com to read these. You can also sign'+#13#10 +'up to have these delivered to your email during the week.'+#13#10 ; b:aob;c:ansistring='';i:int32;    function gettail(a:ansistring;nm:ansistring):ansistring; var p1,L,i:int32;    begin L:=length(a); p1:=pos(nm,a); a:=a[p1..L]; p1:=pos(#10,a); exit (a[1..p1]); end;                     begin        setlength(b,length(a));        b:=aob(a); // transfer the string to array of byte                                    //start here//      c:=ansistring(b); // back to ansistring        writeln('ans = ',gettail(c,'Area'));         writeln('press return to end . . .');      readln;                            end. ---------------------------------------------------------------------- nugax · 2022-04-05 21:51 I got all of the variables of the packet reading in. But, when there are two messages in the packet, it gives a error: EInOutError: Read past end of file          $0000000000451933  VIEWPACKET,  line 154 of ct_viewpacket.pas So, is it because I need to clear the msgheader variable? It should only be reading 34 bytes i believe. It should be continuing from where the buffer ended on the last message, right? Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i procedure ViewPacket(sPacketFileName: string);var  F: file of byte;  Msgheader: PktMessage;  PktHeader: ct_messagetools.RecPKTHeader;  buf: array[0..1024 * 32 - 1] of byte;  bytesread, StartPos: word;  zeropos: SizeInt;  ToUserName, FromUserName, Subject, AreaName {MsgText}: string;  ToFound, FromFound, MsgFound, SubjectFound, AreaFound, TZUTCFound, MsgIDFound, PIDFound, TIDFound, BBSIDFound, ChrsFound: boolean;  bPromptFound: boolean;  sArea: string;  MsgText: string;  chViewInput: char;  numbMsgs: integer;  TZUTC, MsgID, PID, TID, BBSID, Chrs: string;  bufKludges: array[0.. 1024] of byte;  curMsgNumb: integer;  posSeenBy: integer;  iMsgPromptInput : char; begin  AssignFile(F, sPacketFileName);  reset(F);   numbMsgs := 0;   //Get Number Of Messages  seek(F, 0);  blockread(F, buf[0], sizeof(buf), bytesread);  numbMsgs := ct_kludgetools.GetNumberPktMsgs(buf);   //Packet Header Info  seek(F, 0);  BlockRead(F, PktHeader, sizeof(PktHeader));   writeln('--------------------------------------- -------------------------------');  writeln('Packet Information for: ' + sPacketFileName);  writeln('---------------------------------------- ------------------------------');  writeln('Size Of Packet Header: ' + sizeof(PktHeader).ToString);  writeln('Number Of Msgs: ' + numbMsgs.ToString);  writeln('From          : ' + PktHeader.OrigZone.ToString + ':' + PktHeader.OrigNet.ToString + '/' + PktHeader.OrigNode.ToString);  writeln('To            : ' + PktHeader.DestZone.ToString + ':' + PktHeader.DestNet.ToString + '/' + PktHeader.DestNode.ToString);  writeln('PKT Type      : ' + PktHeader.PKTType.Tostring);  writeln('Password      : ' + PktHeader.Password);  writeln('Date          : ' + PktHeader.Year.ToString + '/' + PktHeader.Month.Tostring + '/' + PktHeader.Day.Tostring + ' @ ' + PktHeader.Hour.ToString + ':' + PktHeader.Minute.ToString);    //Get Input To View Messages In Packet  code.endl;  repeat    Write('Do you want to view Messages? (Y/N): ');    chViewInput := Readkey;    case (uppercase(chViewInput)) of      'Y': begin        code.endl;        code.endl;        endl;      end;      'N': begin        code.endl();        halt;      end;      else      code.endl;        Write('Invalid command.');        code.endl;    end;  until (uppercase(chViewInput) = 'Y');      //Go through messages  curMsgNumb := 0;   seek(f, 58);  while (curMsgNumb < numbMsgs) do  begin   //Increase Number Of Message Displayed    Inc(curMsgNumb);     writeln('=========================[ MSG # ' + curMsgNumb.ToString + ']=========================');    //Message Information (Header/Kludge)    writeln('MSG Header Size: ', sizeof(PktMessage));      BlockRead(F, msgheader, sizeof(msgheader));     writeln('MagicNr   : ', msgheader.MagicNr[0].ToHexString, ' ', msgheader.MagicNr[1].ToHexString); // must be 02 00    writeln('Orig Node : ', MsgHeader.OrigNode);    writeln('Dest Node : ', MsgHeader.DestNode);    writeln('Orig Net  : ', MsgHeader.OrigNet);  writeln('Dest Net  : ', MsgHeader.DestNet);    writeln('Attribute : ', Msgheader.Attr);    writeln('Cost      : ', msgheader.Cost);    writeln('Date      : ', msgheader.Date);     //Read Buffer    blockread(F, buf[StartPos], sizeof(buf), bytesread);      writeln('');     ToFound := False;    FromFound := False;    SubjectFound := False;    //AreaFound := False;    MsgFound := False;    StartPos := 0;    ToUserName := '';    FromUserName := '';    Subject := '';    AreaName := '';  TZUTC := '';    MsgId := '';     // MsgText := '';    zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 0);    //writeln('ToUserName: StrtPos = ',StartPos,', indexbyte = ',zeropos,', Buf[',StartPos,']=',Char(Buf[StartPos]));    if (zeropos <> -1) then    begin      ToFound := True;      SetLength(ToUserName, zeropos);      if (zeropos > 0) then        Move(Buf[StartPos], ToUserName[1], zeropos);      //ToUserName := PChar(Buf[StartPos]);      StartPos := StartPos + zeropos + 1;    end;    writeln('To       : ', ToUserName);    if ToFound then    begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 0);      //writeln('FromUserName: StrtPos = ',StartPos,', indexbyte = ',zeropos,', Buf[',StartPos,']=',Char(Buf[StartPos]));      if (zeropos <> -1) then      begin        FromFound := True;        SetLength(FromUserName, zeropos);        if (zeropos > 0) then        Move(Buf[StartPos], FromUserName[1], zeropos);        StartPos := StartPos + zeropos + 1;      end;    end;    writeln('From     : ', FromUserName);    if FromFound then    begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 0);      //writeln('Subject: StrtPos = ',StartPos,', indexbyte = ',zeropos,', Buf[',StartPos,']=',Char(Buf[StartPos]));      if (zeropos <> -1) then      begin        SubjectFound := True;        SetLength(Subject, zeropos);        if (zeropos > 0) then          Move(Buf[StartPos], Subject[1], zeropos);        StartPos := StartPos + zeropos + 1;      end;    end;    writeln('Subject  : ', Subject);    // ** this file does not seem to have a areaname field     if SubjectFound then    begin      //StartPos := StartPos;      StartPos := StartPos + 5;    zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 1);      // writeln('AreaName: StrtPos = ',StartPos,', indexbyte = ',zeropos,', Buf[',StartPos,']=',Char(Buf[StartPos]));      if (zeropos <> -1) then      begin        AreaFound := True;        SetLength(AreaName, zeropos);        if (zeropos > 0) then          Move(Buf[StartPos], AreaName[1], zeropos);        StartPos := StartPos + zeropos + 1;    end;    end;    writeln('AreaName : ', AreaName);     //Find and Display Kludges For Message     //Find TZUTC    if AreaFound then    if SubjectFound then      begin        zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 1);        if (zeropos <> -1) then        begin          TZUTCFound := True;          if (zeropos > 0) then            StartPos := StartPos;          SetLength(TZUTC, zeropos);          Move(Buf[StartPos], TZUTC[1], zeropos);          StartPos := StartPos + zeropos + 1;        end;    end;    Delete(TZUTC, 1, 7);    writeln('TZUTC    : ', TZUTC);     //Find MSGId    if TZUTCFound then      if AreaFound then      begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 1);      if (zeropos <> -1) then        begin          MsgIDFound := True;        if (zeropos > 0) then            StartPos := StartPos + 7;        zeropos := zeropos - 7;          SetLength(MsgID, zeropos);        Move(Buf[StartPos], MsgID[1], zeropos);          StartPos := StartPos + zeropos + 1;        end;      end;    writeln('MsgID    : ', MsgID);     //Find PID    if TZUTCFound then    begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 1);      if (zeropos <> -1) then      begin        PIDFound := True;        if (zeropos > 0) then          StartPos := StartPos + 5;        zeropos := zeropos - 5;        SetLength(PID, zeropos);        Move(Buf[StartPos], PID[1], zeropos);        StartPos := StartPos + zeropos + 1;      end;    end;    writeln('PID      : ', PID);     //Find TID    if PIDFound then    begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 1);      if (zeropos <> -1) then      begin        TIDFound := True;        if (zeropos > 0) then          StartPos := StartPos + 5;        zeropos := zeropos - 5;        SetLength(TID, zeropos);      Move(Buf[StartPos], TID[1], zeropos);        StartPos := StartPos + zeropos + 1;      end;    end;    writeln('TID      : ', TID);     //Find BBSID    if TIDFound then    begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 1);      if (zeropos <> -1) then      begin        BBSIDFound := True;        if (zeropos > 0) then          StartPos := StartPos + 7;        zeropos := zeropos - 7;        SetLength(BBSID, zeropos);        Move(Buf[StartPos], BBSID[1], zeropos);        StartPos := StartPos + zeropos + 1;      end;    end;    writeln('BBSID    : ', BBSID);     //Find Chrs    if BBSIDFound then    begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 13);      if (zeropos <> -1) then      begin      ChrsFound := True;        if (zeropos > 0) then          StartPos := StartPos + 6;        zeropos := zeropos - 6;        SetLength(Chrs, zeropos);        Move(Buf[StartPos], Chrs[1], zeropos);        StartPos := StartPos + zeropos + 1;      end;    end;    writeln('Chrs     : ', Chrs);    code.endl;     writeln('SEEN BY:');  {  //Get Seen By Line   if ChrsFound then    begin      posSeenBy := indexbyte(buf[StartPos], bytesread - StartPos, 13);      if (indexbyte(buf[StartPos], bytesread - StartPos, 13) <> -1) then      begin        if (      end;       zeropos := indexbyte(buf[StartPos], bytesread - StartPos, );      if (zeropos <> -1) then      begin      ChrsFound := True;        if (zeropos > 0) then          StartPos := StartPos + 6;          zeropos := zeropos - 6;          SetLength(Chrs, zeropos);        Move(Buf[StartPos], Chrs[1], zeropos);        StartPos := StartPos + zeropos + 1;      end;    end;  writeln('Chrs     : ', Chrs);  }      //Setup Message Text (As String)    if AreaFound then      if SubjectFound then      begin      zeropos := indexbyte(buf[StartPos], bytesread - StartPos, 0);      //writeln('MsgText: StrtPos = ',StartPos,', indexbyte = ',zeropos,', Buf[',StartPos,']=',Char(Buf[StartPos]));        if (zeropos <> -1) then        begin          MsgFound := True;          SetLength(MsgText, zeropos);          if (zeropos > 0) then          Move(Buf[StartPos], MsgText[1], zeropos);          StartPos := StartPos + zeropos + 1;        end;      end;        MsgText := AdjustLineBreaks(MsgText);    writeln('');    writeln('Message Body:');    writeln('====================================================');    Write(MsgText);     code.endl;    write(' Next Message Quit  -> ');    bPromptFound := False;    repeat        iMsgPromptInput := ReadKey;       case (iMsgPromptInput) of      #27 : begin code.endl; halt; code.endl; end;      #13 : begin  bPromptFound  := True;  end;     else       begin         writeln('Invalid key');     end;     end;    until (bPromptFound = True);;     if (bPromptFound = True) then    begin      code.endl;    end;   end; end;                   Output from the first message: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i ----------- -----------------------------------------------------------Packet Information for: 12bcd812.pkt ---------------------------------------------------------------------- Size Of Packet Header: 60Number Of Msgs: 2From          : 40:1/1To          : 40:100/16PKT Type      : 2Password      : APOLLODate          : 2021/2/31 @ 12:7 Do you want to view Messages? (Y/N):   =========================[ MSG # 1]=========================MSG Header Size: 34MagicNr   : 02 00Orig Node : 1Dest Node : 16Orig Net  : 1Dest Net  : 100Attribute : 0Cost      : 0Date      : 30 Mar 21  21:04:13 To       : AllFrom     : Daryl StoutSubject  : Sophos Virus NewsAreaName : CN_CYBER_SECURITYTZUTC    : -0500MsgID    : 167.cybernt-cncybers@40:100/23 24c90f44PID      : Synchronet 3.18c-Win32 master/c967d666b Mar 17 2021 MSC 1928TID      : SBBSecho 3.13-Win32 master/c967d666b Mar 17 2021 MSC 1928BBSID    : TBOLTChrs   : CP437 2 SEEN BY: Message Body:====================================================Here is the latest information from the Naked Security Blog from Sophos.You can go to nakedsecurity.sophos.com to read these. You can also signup to have these delivered to your email during the week. Be sure that you PRACTICE SAFE HEX -- and that you keep your anti-virus,anti-malware, anti-spyware, and anti-ransomware software up to date.  Do NOT open any email attachments, even if they appear to be from someoneyou know!! Even if you were notified in advance that the file was comingbefore it arrived, use EXTREME CAUTION when opening attachments, or evenclicking on links.  If it appears your email has been spoofed, change your access password immediately!! It's best to use 2 unrelated words (the longer, the better), separated by a non-alphabetic character...such as BOAT+TOUCH (please do NOT use this example). While you can't use high ascii characters online,you can use numbers, letters (upper and lower case), and symbols. The use of a Password Manager, such as Dashlane, is STRONGLY RECOMMENDED. That way, you can create a different password for each site you visit, and you don't have to remember them...plus, you can make it a complex password, that's difficult for someone to guess. If they do, they can steal your identity, and make you liable for things like credit card debt, etc. Lastly, if your browser seemingly locks up, telling you to call Microsoftat a certain number, do NOT call the number!! Instead, close your webbrowser, clear the cache and cookies, do a full virus scan, then restartthe browser. You may also want to reboot the computer afterwards. *** PHP web language narrowly avoids "backdoor" supply chain attack The crooks got in and added a backdoor to PHP, but it looks as thoughit was caught before any harm was done. ***         Naked Security Live - Lessons beyond ransomware Cybercrime isn't about just one sort of attack, one type of crook, or onemethod of protection! ***         Serious Security: OpenSSL fixes two high- severity crypto bugs The bug that broke security when you turned STRICT mode on... ***         Apple devices get urgent patch for zero- day exploit - update now! Universal Cross Site Scripting bug means all web browsing is potentially at risk. We explain in plain English.  *** Alan Turing's �50 banknote officially unveiled If only he'd been treated like this in his lifetime, the computingpioneer who knew "this was only a foretaste". ***--- SBBSecho 3.13-Win32 * Origin: The Thunderbolt BBS - tbolt.synchro.net (40:100/23)SEEN-BY: 1/1 100/1 102 103 104 105 106 108 109 15 16 2 210 225 23 24 3 30 31 35SEEN-BY: 100/36 37 40 56 200/1PATH: 100/23 1/1  Next Message Quit  -> ---------------------------------------------------------------------- af0815 · 2022-04-06 04:31 BTW: It is interesting to see FidoNet is still alive on a small base. A have never seen a Fido Package in the wild for a long time. (History https://de.wikipedia.org/wiki/FidoNet (German) and http://ftsc.org/ here are the docs http://ftsc.org/docs/) ---------------------------------------------------------------------- nugax · 2022-04-06 13:18 its not just fidonet, there are active BBS dev, othernets are VERY active, the Fidonet Backbone is still growing with some traffic. The worst part is the 30-40 year old technology on transferring mail. This is what I am trying to do. Write a tosser to toss mail to/from a sqlite database. Some followed standards (for the most part) but theres a lot of old school just binary parsing involved and it can get quote complex until you flush it out. Especially if your newer to the language. ---------------------------------------------------------------------- MarkMLl · 2022-04-06 16:51 Quote from: nugax on April 06, 2022, 03:18:51 pmThe worst part is the 30-40 year old technology on transferring mail. RFC 561, which was the original standard for Internet-format email, is 49 years old. It's most unfortunate that the people who invented FIDO, CoSy, MULTICS Forum, ARPANET/Internet email/Usenet and so on generally did so either in ignorance of or with wilful disregard for pre-existing standards and parallel work. Broadly speaking, the Internet-format stuff has won out. I mention this not in criticism of the other efforts, but because the way the Internet headers work (colon-separated key:value followed by a blank line, and used in just about everything including HTTPS and VOIP) might be relevant to any attempt to rationalise or store other formats. MarkMLl ---------------------------------------------------------------------- af0815 · 2022-04-06 18:55 FidoNet have its own format (binkp) because the Message was only an extra :-) It combines message Transport and a very compley routing system in one. This is a verspecial format, because the full routing must be working, with a transport from Mailbox to Mailbox. I know it, becaus i was a Node long ago (first with a modem, later with a virtual Modem on a special phoneline). The phonecost were very high in this time, so all messages are routed from the cheapest connection to the next Box :-) It was the "good old time". But if working it is a very roboust system, without control of the 'Internet'. So FodoNet can work without the restriction of a controlled Internet. ---------------------------------------------------------------------- MarkMLl · 2022-04-06 20:21 You ought to have been in the UK: you couldn't even own a modem legally. MarkMLl ---------------------------------------------------------------------- winni · 2022-04-06 22:13 Quote from: MarkMLl on April 06, 2022, 10:21:28 pmYou ought to have been in the UK: you couldn't even own a modem legally. MarkMLl Hi! Some years late you should have been in Germany: UK was allowed to use 9600 Baud, but with pulling a jumper they had 19200 Baud. Nobody controlled that in the UK. US was happily using modems with 38400 Baud - US Robotics  with 56 k was not yet invented. In Germany there were only 2400 Baud allowed - by the Ministry of Post !!! They sent a Journalist from city of Hannover to prison because he used a UK or US modem!!! German telephone rates were cheap after 3 h in the night. After the disco it was the time to "surf" to Italy or Norway .... And there was heavy trafic on the german Fido Net. Winni