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