Offline mail (QWK)
Callers can read and answer their messages offline with a QWK reader (MultiMail, OLX, SLMR, Blue Wave's QWK mode, Synchronet's own...). The BBS packs a caller's new messages into a packet. The caller reads it and writes their answers offline, then brings them back as a REP.
The packet¶
A packet is BBSID.QWK: a ZIP of CONTROL.DAT, MESSAGES.DAT, an index
file for each conference, PERSONAL.NDX (the messages to the caller),
DOOR.ID and HELLO (the message of the day). It holds:
- the caller's unread mail, in conference 0;
- the new messages in the areas of their new scan (the areas they left out of it stay out of the packet), each area a conference numbered by its ID. Every area the caller reads is listed, so a reader can post in one that isn't scanned.
A packet takes at most 500 new messages from one area, and 3000 in all. A caller with more waiting takes another packet.
The messages count as read only once the packet has gone: the areas' pointers move past them and the mail is marked read. A transfer that fails leaves everything new, for the next packet.
Names and subjects longer than QWK's 25 characters travel as QWKE lines
(Subject: ...) at the head of the text, which most readers understand.
Text is CP437.
BBSID is made from the system's name: its first 8 letters and digits,
in capitals (D-Modem BBS is DMODEMBB). qwk_id in [general] sets
another:
Changing it later breaks callers' readers, which file packets under it.
The REP¶
The caller's answers come back as BBSID.REP: a ZIP holding BBSID.MSG
(or the .MSG file on its own). Each message is posted, or mailed, as
if the caller had written it on the BBS:
- conference 0, or a message marked private, goes as mail to its To
(a user, or
Name@zone:net/nodeas netmail); - any other conference is posted in that area, with the caller's access checked as for any post. The message it answers becomes its reply-to when that message is in the same area.
The REP's From is ignored: the message is from the caller. Messages refused (an area they can't post in, a user who isn't there) are listed, and the rest still go. A REP uploaded twice posts once: what each REP brought is remembered for 90 days.
A REP is at most 16 MB and 1000 messages.
Getting it¶
| Where | The packet | The REP |
|---|---|---|
| text BBS: O on the main menu | Download, by XMODEM, YMODEM, ZMODEM or Kermit | Upload, likewise |
| 3270: O on the main menu | IND$FILE GET BBSID.QWK from the emulator's file transfer, typed on the screen's command line |
IND$FILE PUT BBSID.REP |
| FTP | get /qwk/BBSID.QWK |
put BBSID.REP into /qwk/ |
| HTTP API | GET /api/v1/qwk |
POST /api/v1/qwk/rep |
The FTP directory /qwk is there for logged-in users, not anonymous
ones. It hides a file area named qwk from them. The packet listed
there is made as it is asked for (and again after a minute). It counts
as taken once all of it has been read.
A sysop's own menus offer it with qwk (customization).
QWK networks¶
QWK networks (DOVE-Net, FSXNet's QWK side and others) join BBSes through a hub. Each node calls the hub as a user, puts a REP of what its callers wrote in the network's conferences, and takes a packet of what was written everywhere else. This BBS can be either.
As a node¶
Give each network a [qwknet NAME] section: the hub's FTP server, the
account it gave you, and which of its conferences go in which area here.
[qwknet dovenet]
address = hub.example.org:21
tls = explicit ; FTPS (AUTH TLS); implicit, or no
user = MYBBS
password = secret
dir = /qwk ; where the hub keeps its packet ("/": the root)
every = 60 ; minutes between calls (0: only when asked)
2001 = DOVE General ; CONFERENCE = AREA
2002 = DOVE Chat
The areas must exist (bbs area add "DOVE General"). On each call the
BBS:
- puts
HUBID.REPin the hub's directory, holding the messages written here in those areas since the last call (at most 1000 a call); - takes
HUBID.QWKand posts what is in it, under each writer's name, in the areas of its conferences. Conferences not listed are passed over, and so is mail to the node's account.
HUBID is the packet found in the hub's directory, or hub_id. The
first call sends nothing already here. Only messages written on this BBS
go up: those that came by a network, a news peer or FidoNet stay put.
Each message from the hub is known by its conference and number, so a
packet taken twice posts nothing twice. Answers keep their threads both
ways where the message answered came by the network.
bbs qwknet call [NET] (or POST /api/v1/admin/qwknet/call) calls now.
As a hub¶
Make an account for each node and flag it:
A node's account takes its packet and puts its REP like any caller, best
by FTP (/qwk). What its REP brings is posted under the
names of the node's writers, not the account's. Its access is still
checked on each area. Its packet leaves out what came from the node
itself. The areas a node gets are those of its account's new scan.
See also: Message areas, Files and FTP, File transfers