TLforward.doc




TLforward.txt for TinyList V:1.6.0 (C)2002 Kirk D Bailey
Released under the GNU General Document License


The big idea behind tinylist is ease of use, easy list management, easy membership
management, and flexibility of application with many options, combined sith a good
set of defaults for the beginner. And one other, mentioned at the end of this document.

I run a small email service, offering people free email accounts and list service. I
tried a few other list servers, and examined several more. They broke down into several
catagories financially and technically:

	*Free
	*Licensed

Well, free Email is not known for being a cash cow, so licensed was out. Examining FREE,
I found:

	*interpeted (usually perl, although there are now 2 others in python)
	*compiled (usually in C or C++)
and
	*Manual management (example:sendmail)
	*email management (example:majordomo)
	*web management (several)

Of these, I found that web management was simplest, with the least demand of technical
skill, and manual management the hardest, with highest demand for technical skill,
with email management being intermediate.

MAJORDOMO
Majordomo runs all commands with a large list of command words, and is rather confusing
to the beginner to operate, and even a simple list has 6 or more aliases to create. An
error in any one of them and things do not work right. For a beginner, this is not hard
to accomplish.

Worse, the traffic going out is fed to a sendmail alias for actual transmission, and it
is not secured in any way- anyone discovering the name of that alias can spam the list
at convience. Sendmail is not secure. As Majordomo is using ordinary sendmail aliases
for final transmission of the prepared message, majordomo is therefore not secure. Sorry.
Also, it only does STATIC or UNCHANGING footers, so no fortune cookies, text ads, or
anything else are possible out of the box, nor can you create a single file to create a
service wide footer to append along with the per list footer.

SENDMAIL
As stated above, Sendmail does  not offer a securing mechenism; all lists are manually
managed and are OPEN lists- that is, anyone at all can post to the list- your local
spammer for example. This is NOT a good idea. Most beginners will never dream of using
a outgoing address with a random name, and will implement majordomo lists using
(listname)-outgoing, just like in the examples- and some spammers are looking for this.

SENDMAIL lists generally use the listname as a alias name, and a savvy spammer will test
for both 'listname:" and 'listname-outgoing:' and see if there is any result- using a
registered email account to receive the list traffic, and another UNjoined account as the
sender to that insecure outgoing list alias.

Majordomo/sendmail list technology is a spammer's dream. List traffic needs to be
forwarded with a filter program which rejects posts from unauthorized posters,
with NO insecure outbound aliases involved. TinyList acomplishes this nicely.

Also there is NO ability to add a footer to the list traffic- which means, no
instructions, no pithy quotes, no text ad rotations. Many features considered normal
to a list are lacking in a sendmail list.

Still, if you do not have a MLM (Mail List Manager, such as majordomo or TinyList or
Mailman) and use sendmail (or postfix, which mimic's it), you can compose a list in
the aliases file simply as:

mylist::include:/pathtolist/subscriberfile

:include:  is a command recognized by sendmail. So if the subscriber file for mylist
was in /etc/mail/lists, it would be:

mylist::include:/etc/mail/lists/mylist

and ANY email addressed to 'mylist@mydomain.foo' would go out to the members listed
in the file 'mylist'. Always remenber to issue the 'newaliases' command after adding
a new alias. The aliases file is USUALLY kept in '/etc/mail'.

AGAIN, be advised that a sendmail list is NOT secure.

EASE OF INSTALLATION AND USE
Ezmlm, mailman, and mojomail all are rather confusing to the beginner, and at least
one must be compiled partially in C. Although they are pretty easy to use for a list
member, the postmaster can find the installation rather challenging, espically if
inexperienced. And none of them offer out of the box rotation of text ads that I am
aware of- and TinyList DOES. If present, I missed it- which is not hard for someone
not speaking C or perl (such as myself). Tinylist is intended and designed to be so
easy to use it blows the competition away. I invite you to see if it lives up to
this claim.

WHY PYTHON
I tried to learn perl, and found it confusing. The I discovered PYTHON. Perl has
been described as a write only language, which although an exageration, is
understandable. PYTHON on the other hand is so easy to understand it is startling.
For instance, I started seriously studying Python in November 2001, and had
TLpost.py up and running by Christmas. I AM NOT KIDDING. My favorite phrase at this
time was 'this is too easy...'

TinyList is VERBOSELY commented, with most scripts having a doc file for that list.
Please take a look at any of the scripts and see. If you can come up with a
modification you need, you can probably dope out how to implement it simply by
reading the scripts. At last resort, read the online language manuals and tutorials
at 'http://www.python.org/'.

MY SOLUTION
TinyList is indended to be DROP DEAD SIMPLE to install, and now that it offers a self
installer script, getting it up and runnning is a breeze- just run the executable
shell script 'TLinstall.sh' and answer 3 simple questions, and you're done, total
time should be under 5 minutes, INCLUDING creating the first list, 'testlist'.

TinyList easy to manage, and a breeze for the list member to interact with. The
defaults built in to TLpost.py are a good starting point for a discussion list,
the default list mode. Other types of lists are almost as trivial to implement and
use, with special features turned on, and usually defined, with the creation of files
in the list directory directly under your web cgi-bin.

TinyList is SECURE; only a member may post to a list, and there is no provision built
in to circumvent this. There IS no outgoing alias, TL talks directly to your server's
MTA (sendmail or postfix) to maintain complete control of the flow of traffic through
your list service. As an 'open' list is a spam operator's dream, we do not support
open lists, and reccomend you NOT modify tinylist to permit open lists.

Also, it does not reveal email identities to anyone; each person gets their email in
it's own envlope, and the message contains ONLY that person's email address, unlike
some services that stuff all the members into the TO field and hand it off to the MTA,
which shows them to every member of the list. A recent devlopment is for spammers to
join a list and harvest email addresses found there, a trend we are trying to fight.
 Don't feed the spamclowns.

GENERAL SCHEME OF OPERATION
TL is a set of scripts written entirely in Python, each covering one, or a limited set
of functions. Some of these offer web related management of the lists, or of the
service, or of your membership. TLpost.py handles the actual management of traffic as
it passes through your email server. The creation and properties of the service and
the lists is defined with files, all of which are stored in one convient place under
your web cgi-bin in a new directory, 'lists'. ALL global and per list files are in
this directory. The configuration file (tinylist.cf) is in the cgi-bin along with the
executable files and docs.

The content of these per list and global files usually defines the function. For
instance, if you want to offer a bullitin or newsletter, only a very few people can
post to it- such a list is like a magazine or a club newsletter, only one or a few
people can post to it (more than one is a good idea, just in case a club officer or
an employee gets sick and cannot handle posting the next issue). Just place their
pure email address' in the '(listname).ok2post' file, one per line.

A pure email address is: grumpy@tinylist.org, simply the account name, '@', and
domain name. A FULL email address tends to include extranious material, such as
"grumpy@tinylist.org <'Kirk Bailey'>". This material can confuse tinylist, and
is stripped out by TLpost.py, but should not be added if editing files manually,
nor should it be entered in any of the web forms the scripts generate. A later
version will include automatic stripping of extranious material to avoid this
weakness.

The file naming convention is as follows: (listname) referrs to the subscriber file
for the list in question, and would be replacesd with the actual name of the list
under discussion; all other files for the list use the name of the function as a
name extension, as "(listname).(function)", where (function)  is replaced with the
function being adderessed by the postmaster at that moment. 

The minimal install for a list is simply to provide a subscriber file for it, and
an alias in the aliases file. EVERY list has a subscriber file, named for that list.
This contains the pure email address of each email account subscribed, on per line,
as:

me@here.org
you@there.net
us@home.com
grumpy@tinylist.org

so the list 'testlist' has a subscriber file called 'testlist'. The idea is (listname)
for the subscriber file, and other list related files as '(listname).(function)'. In
most cases, the content of the file is going to define the function somehow. There are
a very few exceptions, and I will discuss them later.

The alias for a tinylist file is also simple:

(listname):|/pathtowebcgi-bin/TLpost.py (listname)"

More on this below. NOTE that ALL list traffic is fed to the tinylist program TLpost.py,
and cannot evade it and get to as outgoing alias, as THERE IS NONE. TLpost.py talks
directly to sendmail or to postfix which masquerades as sendmail, and accepts commands
the same way- even accepting a :include: statement in an alais if used.

OTHER FILES
Other files turn on and define special functions. If you had a company bullitin service
called YOYODYNE_NEWS, with limited posting, you would have these files:

	YOYODYNE_NEWS
	YOYODYNE_NEWS.ok2post

In YOYODYNE_NEWS.ok2post we find 2 addresses:

JohnH@yoyodyne.com
RobertH@yoyodyne.com

Either email account may post to the list, all others will be refused. If this file does
not exist, any member may post. NO non-member may post to a tinylist managed list, and
there is no provided way to circumvent this- TL does not service open lists, because
spam sucks.


SPECIAL FILES
(listname).footer - Although the default footer built in is a fairly decent thing, you
might want to customize it-  or supress it altogether. Create this file. In it, define
your footer, and it will be used instead. Want NO footer? Create this file, with NOTHING
in it- and that's what you will get, nothing for a footer. But look at the default footer
in a test message and see if it satisfies your needs.

(listname).archive - This stores the archive for the list. It is added to by TLpost.py,
and examined by the web archive viewer. If you do not want to offer an archive, do not
create it and TLpost will not write messages to anything, and the  list will not be
offered on the archive menu page on the web. When you start an archive, simply create
the file with nothing in it, and insure the permissions are 666. TLpost.py will add
messages for that list to it every time one passes through the server. The archive
viewer menuing script will detect that it exists, and if selected, the viewer script
will display the contents, nicely formatted to the existing screen space thanks to a
little tricky html coding.

(listname).digest - Not only stores the current batch of messages, but the message
count it is told to count to before sending the digest. Referred to by TLpost.py
alone. If you do not want to offer a digest of a list, do not create this file.
Digests are scheduled for release in V:1.7.0 of TinyList.

FUNCTION DEFAULTS
The default for the other files you can have is NO ACTION. so, if you do NOT have
(listname).random, there will NOT be a random item added to the footer of the list.
If there is NOT a 'global.footer', there will be NO footer appended to all lists you
serve. If there is NOT a '(listname).preface', there will NOT be a text prepended to
the body of the list's traffic. And so on.

LIST OF POSSIBLE FILES
(listname)         - subscribers to a list; this is the ONLY MANDATORY FILE.

OTHER OPTIONAL FILES
Other files you may care to use are:
(listname).footer  -  defines a footer for a list instead of the default
                      built in list function. If it is empty, you get NO
                      footer. Default: built in footer is generated.

(listname).preface -  contains text to prebend in the body before the body of
                      the message submitted by the member. Default: no
                      preface.

(listname).ok2post -  contains pure email address' of accounts permitted
                      to post to the list, all other posting shall be refused
                      if this file exists and the sender's email does not
                      exist within it. Used with moderated lists and with
                      read only lists (zines, bullitins, newsletters).
                      Default:any member may post.

(listname).nongrata - banned Email accounts go in here. Posts from that id
                      are simply refused, with no action or reply. Unpeople.
                      Default:Any member may post. Note that non grata people
                      may still receive email as members. Default:normal
                      membership.

(listname).replyto  - Activates and defines the Replyto: field in the list
                      traffic. can be the address of the list, or any other 
                      Email address you care to declare. Works well with
                      moderated lists, or with read only lists (zines, 
                      bullitins, newsletters) when you want to provide an
                      address for people to write to for inquiries.
                      Default: no header created, no data added.

(listname).random   - TLpost.py will read it, pick one line at ramdom, and
                      include that in the footer structure. Good for a
                      random link, quote, pithy saying, or a text ad from
                      one of your affiliate programs. Default:none.

SERVICE WIDE FUNCTIONS AND DATA
global.footer       - A footer applied to ALL lists you host. Default:none.
global.random       - As per (listname).random. Appplies to ALL lists you
                      host. Default:none.

Also, one data file is stored in the cgi-bin itself:
tinylist.cf         - exists in the web cgi-bin directory, alongside the
                      scripts. Contains your domain name, the service owner's
                      email address, and the service owner's password.
                      Default:dead MLM server. MANDATORY FILE.

THE BUILT IN INTELLIGENT FOOTER
There is a intelligent default footer in TLpost.py, it includes the email address for
the postmaster running tinylist, and the link to the membership admin page for that
list, and a link to post a new message to that list, all with the correct information
inserted in the correct place. Your install script will build a list called 'testlist',
with your email address subscribed to it, and no footer or any other files. Send it a
message, and look at the result. THAT FOOTER is the intelligent footer TLpost builds.
You can replace it with any text body you like with the (listname).footer file, if you
want to; most people find at first that the default is all they need. Eventually, you
may care to replace it with a better one when you have need- and better understanding.
Let the training wheels carry the load for you for now.

CREATING LISTS
TinyList is quite simple to compose lists for. For instance, the path to tinylist in
the tinylist.org website server is:

/www/www.tinylist.org (we have several domains in the server).

The alias in the aliases file for tinylist-users is:

tinylist-users:"|/www/www.tinylist.org/cgi-bin/TLpost.py tinylist-users"
^alias name      ^ path to the program         ^program  ^listname

The aliases file normally is found in /etc/mail. ALWAYS issue the command
'newaliases' after you create an alias and save the updated file. The install script
will do this for you when it creates the testlist list.

Feel free to email me at 'grumpy@tinylist.org'. Also, take notice of the list
'tinylist-users@tinylist.org'. You can join it at

http://www.tinylist.org/cgi-bin/TLwebform2.py?tinylist-users

and we welcome newbies.



WHY DID I BOTHER AT ALL?
1. I was fustrated in my efforts to mount a list service that was:
	reliable,
	easy for visitors to use,
	and would help me to earn my cohosting fees.

I finally decided the only way I would get what I wanted was to create it. 

I did. When I saw how challenging in general the state of the art is, I decided to do
something about it. Tinylist addresses both of these technical issues, and one other,
a SOCIAL issue. A free press, not dependant on large corperations and their intrests-
and owners.

2. Every computer with the correct software is a print press, every internet server
   is potentially a print press for Emagazines, Enewsletters, and other such. Man
   MUST be free; to be free, we must have access to information, as thought preceeds
   action. We must be able to share information freely, communicate without hinderance,
   talk to one another, and decide what to do.

"The tyrant's foe, the people's friend, a free press."
-Dr Benjamin Franklin, patriot, benefactor of all mankind.

Dr Franklin invented MANY things, and DONATED them to the common domain.
Besides the lightling rod, and his theoretical and experimental work with electricity,
he also invented bifocal glasses, the Franklin stove, and many other lesser things. ALL
of these he donated to the public domain. He also was a major player in the founding of
the greatest experiment in freedom the world has seen to date. This man is my hero and
inspiration.

Now, I COULD have simply placed TL in the public domain. Alas, these days if you place
some software in the public domain, another may come along, take it and make several
minor modifications, and COPYRIGHT IT, and they then own it. In self defense, I have
copyrighted TinyList, and issued it under the GNU GPL. This makes it free, but no one
can steal it, it's copyrighted. I choose to OFFER it to you for $FREE$, no cost,
although DONATIONS are accepted and appreciated.


Peace.

-Kirk Bailey <'grumpy@tinylist.org'>
 Largo Florida USA
 October 2002




ODD#10.13.02/kdb/TLforward.doc.shtml