CONCEPT:
	mail


DESCRIPTION:
	This document describes the mail system used in Nightfall.
	The idea is to make a central mail handling object which
	accepts and distributes mail between users. Mail is stored in
	the /mail directory. save_object is used to save mail
	information in mail files in this directory. Only the mail
	demon object and the owner of the mail file can access it.

	A number of mail readers will probably available which access
	the mail files. A typical mail user agent has commands to
	read mail contained in the user's mail file, to reply to
	messages, to forward, delete, save them. A folder structure
	can be implemented. Outgoing mail is given to the mail demon
	object by the user agent for distribution. The mailreader
	should implement multiple recipients - carbon copy, cc and
	blind carbon copy, bcc. Carbon copy means alternate recipients
	to which the message should be sent. Blind carbon copy is the
	same, but the recipients won't be listed in the received
	message.

	Save file format (sort of formal notation):

	mixed *folders = ({
	   ({ string name1; string name2; ... string nameN; })
	   ({ mixed *msgs1; mixed *msgs2; ... mixed *msgsN; })
	})

	The array variable <folders> contains a number of folder
	structures containing the actual messages. There are special
	folders which are reserved: mail, newmail. New mail will
	be delivered into the newmail folder. This is the only hard
	coded requirement (the mail demon will simply deposit new
	mail there). The folder name 'mail' should be used for read
	mail. Other folders can be dynamically created by the user
	agent.

	Each msgs field is an array of messages:

	mixed *msgs = ({ mixed *message1; ... mixed *messageM })

	A message is represented as an array with the following fields:

	mixed *message = ({
	   string from;
	   string sender;
	   string recipient;
	   string *cc;
	   string *bcc;
	   string subject;
	   string date;
	   string id;
	   string body;
	})

	The mailer demon (/secure/mailer, or /obj/mailer) provides
	the following functions:

	DeliverMail(mixed *message)
	  Hand a mail message over to the mailer demon. The mailer
	  demon extracts recipients from the recipient, cc and bcc
	  fields and removes the bcc information. It then deposits
	  the message to the mail files of all recipients. A valid
	  message is shown above.

	int FingerMail(string user)
	  Gives the number of unread messages a user has.


SEE ALSO:
