aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorRob Funk <rfunk@funknet.net>2004-06-08 03:59:01 +0000
committerRob Funk <rfunk@funknet.net>2004-06-08 03:59:01 +0000
commitd78b61e3efaea197a6e5b2b72bf2981a9ed69461 (patch)
tree1704e13ce5d767d59868a2d5e834cb2e988ed90f /contrib
parentd9e84e176fe538e110d9612f9832d69846e8d3e7 (diff)
downloadfetchmail-d78b61e3efaea197a6e5b2b72bf2981a9ed69461.tar.gz
fetchmail-d78b61e3efaea197a6e5b2b72bf2981a9ed69461.tar.bz2
fetchmail-d78b61e3efaea197a6e5b2b72bf2981a9ed69461.zip
Add files from ESR's dev directory that weren't under version control
svn path=/trunk/; revision=3881
Diffstat (limited to 'contrib')
-rw-r--r--contrib/README179
-rw-r--r--contrib/README.getmail64
-rwxr-xr-xcontrib/debian_rc40
-rw-r--r--contrib/domino84
-rw-r--r--contrib/fetchmail-mode.el142
-rw-r--r--contrib/fetchmaildistrib29
-rwxr-xr-xcontrib/fetchmailnochda.pl131
-rw-r--r--contrib/fetchspool58
-rw-r--r--contrib/getfetchmail31
-rw-r--r--contrib/getfetchmail.pl61
-rwxr-xr-xcontrib/getmail73
-rwxr-xr-xcontrib/gotmail69
-rw-r--r--contrib/gotmail.awk62
-rw-r--r--contrib/gotmail.conf25
-rw-r--r--contrib/gotmail.html.awk99
-rw-r--r--contrib/ip-up70
-rwxr-xr-xcontrib/login16
-rwxr-xr-xcontrib/logout30
-rwxr-xr-xcontrib/maildaemon75
-rw-r--r--contrib/mailqueue.pl420
-rw-r--r--contrib/mold_remover.py92
-rw-r--r--contrib/multidrop236
-rw-r--r--contrib/novell57
-rw-r--r--contrib/poptest84
-rwxr-xr-xcontrib/preauth-harness53
-rw-r--r--contrib/redhat_rc60
-rw-r--r--contrib/runfetchmail182
-rw-r--r--contrib/sm-hybrid539
-rw-r--r--contrib/start_dynamic_ppp16
-rw-r--r--contrib/toprocmail46
-rw-r--r--contrib/zsh-completion20
31 files changed, 3143 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README
new file mode 100644
index 00000000..d81ebbf2
--- /dev/null
+++ b/contrib/README
@@ -0,0 +1,179 @@
+These are scripts to help you running fetchmail in special situations.
+Note: you're on your own using these -- I don't really understand them,
+I'm just passing them along.
+ --esr
+
+maildaemon:
+
+Larry Fahnoe wrote this for driving fetchmail from cron. It may be useful if
+you want to force a PPP link up and then poll for mail at specified times.
+I have rearranged it slightly to make it easier to configure.
+
+novell:
+
+Some mail from Dan Newcombe describing how to write a procmail rule that
+will domainify Novell server names.
+
+login & logout:
+
+These are intended to help if you typically have multiple logins active.
+Here's the script composer's original README:
+
+ Please find attached 2 files, ~/.bash_login & ~/.bash_logout
+ What these do is try to keep track of WHO is the process/tty
+ that ran fetchmail in daemon mode. I tried to use the bash
+ Variable PPID, but when using xterm the PPID is set to the
+ xterm's pid not the bash shell's pid so....
+
+ They have been lightly tested.
+
+ Any comments...
+
+ Hth, JimL <babydr@nwrain.net>
+
+Doug Carter <dougc@canus.com> suggests this instead:
+
+Add the following to your login script. (.ie .bash_profile, .profile, etc)
+
+LOGINS=`who | grep $USER | wc -l`
+if [ $LOGINS = 1 ]; then
+ /usr/bin/fetchmail > /dev/null 2>&1
+fi
+
+Then add the following to your logout script. (.ie .bash_logout, etc)
+
+LOGINS=`who | grep $USER | wc -l`
+if [ $LOGINS = 1 ]; then
+ /usr/bin/fetchmail -q > /dev/null 2>&1
+fi
+
+ip-up:
+
+A note from James Stevens about using fetchmail in an ip-up script without
+disabling timeouts.
+
+runfetchmail:
+
+A shellscript front end for fetchmail that mails you various statistics on
+the downloaded mail and the state of your folders. A good example of what
+you can do with your own front end.
+
+fetchspool:
+
+If you find that the speed of forwarding to port 25 is limited by the
+SMTP listener's speed, it may make sense to locally spool all the mail
+first and feed it to sendmail after you hang up the network link.
+This shellscript aims to do exactly that. It would be smarter to
+figure out why sendmail is slow, however.
+
+fetchsetup:
+
+This is a shell script for creating a $HOME/.fetchmailrc file, it will ask
+you some questions and based on your answers it will create a .fetchmailrc
+file, fetchsetup is linux specific so it may not work on another operating
+system.
+
+mailqueue.pl:
+
+This script will connect to your isp (if not already connected),
+send any outgoing mail and retrieve any incoming mail. If this
+program made the connection, it will also break the connection
+when it is done. By Bill Adams, <bill@evil.inetarena.com>. The
+latest version is carried at <http://evil.inetarena.com/>.
+
+redhat_rc:
+
+A fetchmail boot-time init file compatible with RedHat 5.1. It leaves
+fetchmail in background to get messages when you connect to your ISP.
+The invoked fetchmail expects to find its configuration in
+/etc/fetchmailrc, and must include the proper "interface" directive.
+
+debian_rc:
+
+A fetchmail boot-time init file compatible with Debian. It leaves
+fetchmail in background to get messages when you connect to your ISP.
+The invoked fetchmail expects to find its configuration in
+/root/.fetchmailrc, and must include the proper "interface" directive.
+
+start_dynamic_ppp:
+
+An admittedly scratchy ip-up script that Ryan Murray wrote to cope with
+dynamic PPP addressing. Will need some customizing.
+
+ http://www.inetarena.com/~badams/linux/programs/mailqueue.pl
+
+getfetchmail:
+
+Here's a script that gets Eric's most recent fetchmail source rpm,
+downloads it and (if the rpm's not broken) rebuilds it.
+
+With fairly simple changes it can be used to download the latest i386 rpm
+or tar.gz.
+
+Those who are addicted to having the latest of everything could filter mail
+from fetchmail announce through it and get new versions as they're
+announced. However, if we all did that, Eric's ftp server might feel a
+little stressed.
+
+The script as written works on bash 2. By John Summerfield
+<summer@os2.ami.com.au>.
+
+zsh-completion:
+
+These commands set up command completion for fetchmail under zsh.
+Jay Kominek <jay.kominek@colorado.edu>.
+
+getmail/gotmail:
+
+These scripts are front ends for fetchmail in daemon mode that can gather
+log statistics and generate text or HTML reports. See README.getmail for
+details. Scripts by Thomas Nesges <ThomaNesges@TNT-Computer.de>.
+
+fetchmaildistrib:
+
+This script resolves the issue where the sysadmin polls for mail with fetchmail
+only at set intervals, but where a user wishes to see his email right
+away. The duplication in /etc/fetchmailrc and ~/.fetchmailrc files is
+automated with this script; whenever /etc/fetchmailrc is changed, this
+script is run to distribute the stuff into all user's ~/.fetchmailrc
+files.
+
+multidrop:
+
+Martijn Lievaart's sendmail hacks to make multidrop reliable.
+
+domino:
+
+Gustavo Chaves <gustavo@cpqd.com.br> wrote this script to deal with
+the boundary-mismatch bug in Domino (see FAQ item X5). If you use
+this with --mda, the broken boundaries will be fixed and the result
+passed to procmail.
+
+toprocmail:
+
+John Lim Eng Hooi <jleh@mail.com> wrote this script, yet another
+mda plugin, to be used with fetchmail in foreground mode. It displays
+some header lines to stdout in color, passing them (and the rest of the
+message content) to procmail.
+
+preauth-harness:
+
+Emmanuel Dreyfus's Perl test script for exercising IMAP PREAUTH
+connections. You'll have to patch in your username and password.
+
+sm-hybrid:
+
+Peter 'Rattacresh' Backes sent this patch to improve the behavior of
+sendmail 8.11.0 with multidrop.
+
+fetchmailnochda.pl
+
+Watchdog script to check whether fetchmail is working in daemon mode.
+
+mold-remover.py
+
+A short python script to remove old read mail from a pop3 mailserver.
+Dovetails with fetchmail with keep option.
+Run it as a cron job...
+
+
diff --git a/contrib/README.getmail b/contrib/README.getmail
new file mode 100644
index 00000000..237889cd
--- /dev/null
+++ b/contrib/README.getmail
@@ -0,0 +1,64 @@
+-------------------------------------------------------------------------------
+
+ - GetMail - GotMail -
+
+ 1999 by Thomas Nesges <ThomaNesges@TNT-Computer.de>
+
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+Installation:
+-------------------------------------------------------------------------------
+The Installation is as simple as it could be. Just create the directory
+/usr/local/gotmail and copy all files to it. Ready.
+
+If you decide to choose an other directory to copy the files to, don't forget
+to change the path in the scripts.
+
+-------------------------------------------------------------------------------
+Usage:
+-------------------------------------------------------------------------------
+GetMail starts with: getmail <option>
+
+options:
+ clear - stops fetchmail and kills the logfile
+ fetch - starts fetchmail
+ got - starts gotmail
+ goth - starts gotmail html
+ send - sends all mail from the mailqueue
+ status - tails the logfile
+ start - starts fetchmail and tails the logfile
+ stop - stops fetchmail
+ -v - prints GetMails version number
+
+GotMail can be startet without any parameters. It then prints a statistic
+on the console. The only parameters so far are:
+
+ html - prints the output to an html file specified in gotmail.conf
+ -v - prints GotMails version number
+
+-------------------------------------------------------------------------------
+Configuration
+-------------------------------------------------------------------------------
+GotMail is configured by a file named gotmail.conf either in the user's home
+dir, in /etc or in /usr/local/gotmail. gotmail.conf itself is a shell script.
+It just exports some variables to the environment. So it's syntax is like this:
+
+ export <OPTION>=<VALUE>
+
+Remember not to put spaces between <OPTION>=<VALUE> !!
+You have the folllowing options:
+
+ GOTM_ERR yes|no print error messages?
+ GOTM_MSG yes|no print mail stats?
+ GOTM_TIM yes|no print start/stop stats?
+ GOTM_HED yes|no print a header?
+
+ Special HTML options:
+ GOTM_BGCOL hex color backgroundcolor
+ GOTM_TXCOL hex color textcolor
+ GOTM_ERRCOL hex color color of error messages
+ GOTM_TIMCOL hex color color of start/stop stats
+ GOTM_MSGCOL hex color color of mail stats
+ GOTM_HTMLFILE filename filename for html output
+-------------------------------------------------------------------------------
diff --git a/contrib/debian_rc b/contrib/debian_rc
new file mode 100755
index 00000000..7bbdbdc8
--- /dev/null
+++ b/contrib/debian_rc
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# To start fetchmail as a system service, copy this file to
+# /etc/init.d/fetchmail and run "update-rc.d fetchmail
+# defaults". A fetchmailrc file containg hosts and
+# passwords for all local users should be placed in /root
+# and should contain a line of the form "set daemon <nnn>".
+#
+# To remove the service, delete /etc/init.d/fetchmail and run
+# "update-rc.d fetchmail remove".
+
+DAEMON=/usr/bin/fetchmail
+
+set -e
+test -f $DAEMON || exit 0
+
+case "$1" in
+ start)
+ echo -n "Starting mail retrieval agent: "
+ if start-stop-daemon --start --quiet --exec $DAEMON; then echo "fetchmail."
+ else echo "fetchmail already running."; fi
+ ;;
+ stop)
+ echo -n "Stopping mail retrieval agent: "
+ start-stop-daemon --stop --quiet --exec $DAEMON
+ echo "fetchmail."
+ ;;
+ force-reload|restart)
+ echo -n "Restarting mail retrieval agent: "
+ start-stop-daemon --stop --quiet --exec $DAEMON
+ start-stop-daemon --start --quiet --exec $DAEMON
+ echo "fetchmail."
+ ;;
+ *)
+ echo "Usage: /etc/init.d/fetchmail {start|stop|restart}"
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/contrib/domino b/contrib/domino
new file mode 100644
index 00000000..a5802718
--- /dev/null
+++ b/contrib/domino
@@ -0,0 +1,84 @@
+#!/usr/bin/perl -w
+# correct-domino-mime-conversion - does it!
+# $Id: domino,v 1.1 2004/06/08 03:59:00 rfunk Exp $
+
+use strict;
+
+# Any arguments are expected to be an mda invocation.
+if (@ARGV) {
+ my $mda = join(' ', @ARGV);
+ open(MDA, "| $mda") or die "Can't exec $mda: $!\n";
+ select(MDA);
+}
+
+# Look for a Boundary declaration in the message header
+my $decltag;
+while (<STDIN>) {
+ print;
+ if (/boundary=\"(.*)\"$/i) {
+ $decltag = $1;
+ } elsif (/^$/) {
+ # An empty line marks the end of the headers.
+ last;
+ }
+}
+
+# If we didn't find a Boundary declaration just pipe the rest of the
+# message unchanged.
+if (!defined $decltag) {
+ while (<STDIN>) {
+ print;
+ }
+ exit 0;
+}
+
+# Substitute $decltag for every ocurrence of an outer-level boundary
+# string found in the body of the message.
+my $usedtag;
+while (<STDIN>) {
+ if (/^--(.*)$/) {
+ $usedtag = $1 unless defined $usedtag;
+ if ($1 eq $usedtag) {
+ $_ = "--$decltag\n";
+ } elsif ($1 eq "$usedtag--") {
+ $_ = "--$decltag--\n";
+ }
+ }
+ print;
+}
+
+=pod
+
+This script can be used to bypass a bug in the Domino-5.0.2b IMAP
+service that manifests itself when you use fetchmail as the IMAP
+client. The problem is that fetchmail (differently from other IMAP
+clients) fetches messages in two parts, first the headers and then the
+body. It seems that Domino converts the messages from its internal
+format into MIME twice. In doing so, it declared a boundary string in
+the messages Content-type header and uses another one to separate the
+parts in the body.
+
+This script should be used as a mda option for fetchmail. As
+arguments to it, pass the former mda you used. I, for example, use the following entry in my .fetchmailrc:
+
+ poll server ... mda "/usr/bin/procmail -d %T";
+
+To use this filter, I changed the above into the following:
+
+ poll server ... mda "/home/gustavo/bin/correct-domino-mime-conversion /usr/bin/procmail -d %T";
+
+If you do not use a mda normally, you can try the following to call sendmail directly:
+
+ poll server ... mda "/home/gustavo/bin/correct-domino-mime-conversion //wherever/is/your/sendmail -oem -f %F %T";
+
+Without argumets this script is a filter that reads from its stdin and
+outputs the result into its stdout.
+
+I should mention that this bug seems to be solved in Domino 5.0.3
+(http://www.notes.net/46dom.nsf/434e319a66960d8385256857005cd97b/4499e0db6e43732b852568b2006ef7e9?OpenDocument)
+but I have not checked it.
+
+Gustavo.
+<gustavo@cpqd.com.br>
+
+=cut
diff --git a/contrib/fetchmail-mode.el b/contrib/fetchmail-mode.el
new file mode 100644
index 00000000..d22ebcaf
--- /dev/null
+++ b/contrib/fetchmail-mode.el
@@ -0,0 +1,142 @@
+;; fetchmail-mode.el -*- Emacs-Lisp -*-
+;;
+;; Mode for editing .fetchmailrc files
+;;
+;; Created: <Mon Oct 30 20:13:15 EST 2000>
+;; Time-stamp: <17.02.2001 17:59:43>
+;; Version: 0.1
+;; Keywords: fetchmail,config
+;; Author: Alex Shinn <foof@debian.org>
+;;
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;; Commentary:
+;;
+;; This file provides a major mode for editing .fetchmailrc files.
+;; It offers syntax highlighting and indentation.
+;;
+;; To use it, put the following in your .emacs:
+;;
+;; (autoload 'fetchmail-mode "fetchmail-mode.el" "Mode for editing .fetchmailrc files" t)
+;;
+;; You may also want something like:
+;;
+;; (setq auto-mode-alist
+;; (append '(("\..fetchmailrc$" . fetchmail-mode))
+;; auto-mode-alist))
+
+;; Create mode-specific tables.
+(defvar fetchmail-mode-syntax-table nil
+ "Syntax table used while in fetchmail-mode" )
+(if fetchmail-mode-syntax-table
+ () ; Do not change the table if it is already set up.
+ (setq fetchmail-mode-syntax-table (make-syntax-table))
+ (modify-syntax-entry ?\\ "\\ " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\, "." fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\: "." fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\; "." fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\" "\"" fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\' "\"" fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\n "> " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\# "< " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\( "() " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\) ")( " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\[ "(] " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\] ")[ " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\{ "(} " fetchmail-mode-syntax-table)
+ (modify-syntax-entry ?\} "){ " fetchmail-mode-syntax-table)
+ )
+
+(defvar fetchmail-mode-map nil
+ "Keymap used in fetchmail-mode" )
+
+(if fetchmail-mode-map nil
+ (setq fetchmail-mode-map (make-sparse-keymap))
+ (define-key fetchmail-mode-map "\t" 'fetchmail-complete)
+ (define-key fetchmail-mode-map "\C-c\C-c" 'comment-region) )
+(defvar fetchmail-mode-hook nil
+ "Hooks to run in fetchmail-mode" )
+
+(defvar fetchmail-keywords nil
+ "Keywords used for fetchmail-mode" )
+
+(unless fetchmail-keywords
+ (setq fetchmail-keywords
+ '("poll" "skip" "via" "in" "proto" "protocol" "uidl" "no" "port" "auth" "authenticate" "timeout" "envelope" "qvirtual" "envelope" "aka" "localdomains" "interface" "monitor" "dns" "user" "username" "is" "folder" "pass" "password" "smtp" "smtphost" "smtpaddress" "antispam" "mda" "pre" "preconnect" "post" "postconnect" "keep" "flush" "fetchall" "rewrite" "forcecr" "stripcr" "pass8bits" "dropstatus" "limit" "fetchlimit" "batchlimit" "expunge" "pop2" "POP2" "pop3" "POP3" "imap" "IMAP" "imap-k4" "IMAP-K4" "apop" "APOP" "rpop" "RPOP" "kpop" "KPOP" "etrn" "ETRN" "login" "kerberos" "kerberos_v5" "logfile" "daemon" "syslog" "invisible" "and" "with" "has" "wants" "options" "here" "there" "aka" "set")))
+
+(defvar fetchmail-keyword-table nil
+ "Completion table for fetchmail-mode" )
+(unless fetchmail-keyword-table
+ (setq fetchmail-keyword-table (make-vector 8 0))
+ (mapcar (lambda (x) (intern x fetchmail-keyword-table))
+ fetchmail-keywords))
+
+(defvar fetchmail-font-lock-keywords nil
+ "Default expressions to highlight in fetchmail-mode" )
+
+(unless fetchmail-font-lock-keywords
+ (setq fetchmail-font-lock-keywords
+ (list (list (concat "\\b" (regexp-opt
+ fetchmail-keywords t) "\\b")
+ 0 'font-lock-keyword-face ))))
+
+(defun fetchmail-complete ()
+ "Tab completion for fetchmail-mode"
+ (interactive)
+ (let* ((end (point))
+ (beg (save-excursion
+ (skip-syntax-backward "w")
+ (point)))
+ (pattern (buffer-substring beg end))
+ (table fetchmail-keyword-table)
+ (completion (try-completion pattern table)))
+ (cond ((eq completion t))
+ ((null completion)
+ (error "Can't find completion for \"%s\"" pattern))
+ ((not (string-equal pattern completion))
+ (delete-region beg end)
+ (insert completion))
+ (t
+ (message "Making completion list...")
+ (let ((list (all-completions pattern table)))
+ (if (fboundp 'prettify)
+ (setq list (funcall 'prettify list)))
+ (with-output-to-temp-buffer "*Help*"
+ (display-completion-list list)))
+ (message "Making completion list...%s" "done")))))
+
+
+(defun fetchmail-mode ()
+ "Mode for editing .fetchmailrc files"
+ (interactive)
+ (kill-all-local-variables)
+ (use-local-map fetchmail-mode-map) ; This provides the local keymap.
+ (setq mode-name "Fetchmail") ; This name goes into the modeline.
+ (setq major-mode 'fetchmail-mode) ; Used by `describe-mode'
+ (run-hooks 'fetchmail-mode-hook) ; Run each time mode is called
+ (set-syntax-table fetchmail-mode-syntax-table)
+
+ ;; -cc-
+ ;; Font lock support
+ (make-local-variable 'font-lock-defaults)
+ (setq font-lock-defaults '(fetchmail-font-lock-keywords nil t))
+
+ (setq comment-start "#")
+ )
+
+
+
+(provide 'fetchmail-mode)
diff --git a/contrib/fetchmaildistrib b/contrib/fetchmaildistrib
new file mode 100644
index 00000000..00cc1910
--- /dev/null
+++ b/contrib/fetchmaildistrib
@@ -0,0 +1,29 @@
+#/bin/bash
+#
+# fetchmaildistrib --- Distribute central fetchmail knowledge.
+#
+# The central fetchmail database, /etc/fetchmail, contains all accounts that
+# are to be fetched by the root's daemon. Often, a user desires quicker
+# access (e.g., when testing some email path). In such cases, the destination
+# user (marked as is USER here in the poll lines) should set up a ~/.fetchmailrc
+# for himself. This scripts generates such lines from the central file.
+#
+# By Rick van Rein.
+
+# From stdin, select poll lines for user $1
+function selectuser () {
+ grep ^poll | grep "is $1 here"
+}
+
+
+for i in `cut -d: -f1 </etc/passwd`
+do homedir=`grep ^$i: /etc/passwd | cut -d: -f6`
+ fetchfile=`selectuser $i </etc/fetchmailrc`
+ if [ -z "$fetchfile" ]
+ then rm -f $homedir/.fetchmailrc
+ else cp /dev/null $homedir/.fetchmailrc
+ chmod go-rwx $homedir/.fetchmailrc
+ grep ^defaults /etc/fetchmailrc >>$homedir/.fetchmailrc
+ selectuser $i </etc/fetchmailrc >>$homedir/.fetchmailrc
+ fi
+done
diff --git a/contrib/fetchmailnochda.pl b/contrib/fetchmailnochda.pl
new file mode 100755
index 00000000..b0a89609
--- /dev/null
+++ b/contrib/fetchmailnochda.pl
@@ -0,0 +1,131 @@
+#!/usr/bin/perl
+
+# User contribution to fetchmail by Torsten Mueller torsten@archesoft.de
+# v1.1 22/may/2001
+
+# the reason for this script is to check, if fetchmail (in daemon mode) works
+# you should have perl and the perlmodule File::Compare installed
+# File::Compare you can find at http://www.cpan.org/
+
+# installation:
+# edit the config part of this script
+# create a cronjob , the time it should run should be higher than the pollintervall !!
+
+# possible problems:
+# you have set the cron intervall to short
+# the script doesn't have permissions to write to directories or to execute fetchmail
+# you didn't start fetchmail in daemon mode but use cron to fetch mail
+# you can't read my english
+
+# how does it work
+# really simple, the script checks, if there was a change to the logfile of fetchmail
+# to find this out, the script makes a backup of the original logfile and compares
+# the size of the original and the backup logfile
+# i know it's a dirty way, but hey, it works ...
+
+use File::Compare;
+
+# config
+# where lives fetchmail on your system
+$fetchmail = '/usr/bin/fetchmail';
+# where should be the logfile for fetchmail
+$fetchmaillog = '/var/log/fetchmail.log';
+# where could the script write the backup of the logfile
+$fetchmailwatch = '/var/log/fetchmailwatch';
+# after how many seconds fetchmail should get mail, the poll intervall
+$fetchmailtime = '3600';
+# which config file should fetchmail use for retrieval
+$fetchmailconf = '/root/.fetchmailrc';
+# where lives your cp program
+$copycp = 'cp';
+#end config
+
+if (!(-e "$fetchmaillog")) {
+# es existiert keine logdatei von fetchmail
+# there isn't a logfile of fetchmail
+print "There seems to be a problem with the fetchmail daemon\n
+I couldn't find a logfile of fetchmail.\n
+I try to stop and to start fetchmail in daemon mode.\n
+If you get this mail more then once, then check your system !\n
+------------------------------------------------------------\n
+Es ist ein Fehler aufgetreten bei der Ueberwachung des fetchmail Daemons\n
+Es existiert keine Logdatei. Ich versuche jetzt fetchmail zu stoppen und neu zu \n
+starten. Sollte das Problem nochmal auftreten, dann genaue Systeminspektion !\n
+------------------------------------------------------------\n
+Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n";
+
+system "$fetchmail -q";
+sleep 3 ;
+system "$fetchmail -f $fetchmailconf -d $fetchmailtime -L $fetchmaillog";
+sleep 2 ;
+
+}
+
+if (!(-e "$fetchmailwatch")) {
+# die kopie der logdatei existiert nicht
+# the copy of the original logfile doesn't exists
+print "There seems to be a problem with the fetchmail daemon\n
+I couldn't find the copy of the original logfile of fetchmail.\n
+If this is this the first run of this script, then this is no problem!\n
+If you get this mail more then once, then check your system !\n
+------------------------------------------------------------\n
+Es ist ein Fehler aufgetreten bei der Ueberwachung des fetchmail Daemons\n
+Es existiert keine Kopie der Logdatei. Wenn das Script das erste Mal aufgerufen wurde,\n
+dann ist dies kein Problem. Sollte dieses Problem nochmal auftreten, dann genaue Systeminspektion !\n
+------------------------------------------------------------\n
+Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n";
+&copylog;
+exit; }
+
+
+$vergleich = compare("$fetchmaillog","$fetchmailwatch");
+
+if ($vergleich == -1) {
+# irgendein fehler ist aufgetreten
+# unknown error
+print "There seems to be a problem with the fetchmail daemon or this script\n
+I don't know, why this error happens.
+Please check the script and your system
+------------------------------------------------------------\n
+Es ist ein Fehler aufgetreten bei der Ueberwachung des fetchmail Daemons\n
+Bitte die notwendigen Schritte unternehmen, z.B. Festplattenspeicherplatz pruefen\n
+noch eine kommt.\n
+------------------------------------------------------------\n
+Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n";
+}
+
+
+if ($vergleich == 0) {
+# dateien sind gleich also also eine aktion starten
+# the copy and the original logfile have the same size
+print "There seems to be a problem with the fetchmail daemon\n
+The logfile seems the be the same as the last logfile i have seen.
+That could mean, that fetchmail hangs, or permissionproblems or disk full.
+I try to stop and to start fetchmail in daemon mode.\n
+If you get this mail more then once, then check your system !\n
+------------------------------------------------------------\n
+Scheinbar gab es ein Problem mit dem Programm fetchmail\n
+Die Logdatei war identisch mit der Logdatei beim letzten Lauf diese Scriptes\n
+Daraus schlussfolgere ich, dass nichts mehr geloggt wurde -> fetchmail hat ein Problem\n
+Ich habe fetchmail versucht zu stoppen, und wieder neu zu starten.\n
+Sollte diese Mail heute noch mehrfach erscheinen, dann ist eine genauere Inspektion\n
+der Umstaende notwendig. Ist dies die erste Mail, dann einfach mal abwarten, ob\n
+noch eine kommt.\n
+------------------------------------------------------------\n
+Das fetchmail Ueberwachungsscript Copyright 2001 by T. Mueller torsten\@archesoft.de\n\n";
+
+system "$fetchmail -q";
+sleep 3 ;
+system "$fetchmail -f $fetchmailconf -d $fetchmailtime -L $fetchmaillog";
+sleep 2 ;
+
+}
+
+
+&copylog;
+
+sub copylog {
+system "$copycp $fetchmaillog $fetchmailwatch";
+}
+
+
diff --git a/contrib/fetchspool b/contrib/fetchspool
new file mode 100644
index 00000000..cd6c2c81
--- /dev/null
+++ b/contrib/fetchspool
@@ -0,0 +1,58 @@
+#!/bin/sh -
+#
+# Quick hack for fetchmail to locally spool messages.
+#
+# To spool:
+# fetchmail --mda "fetchspool -t %T %F"
+# To de-spool
+# fetchspool -f
+#
+# Robert de Bath <robert@mayday.cix.co.uk>
+# updated by william boughton <bill@xencat.demon.co.uk>
+# 4th/10/1998 and tested
+#
+# William Boughton comments:
+# Still has some potential problems, with using inline from address.
+# The use of _ is bad because fetchmails uses this if it notices
+# shell escapes.
+# 10th/11/1998
+# Changed to using 3 _@@s to delimit the message, i hope this is ok.
+# Whilst i have tested and used this script, with my demon account and
+# SDPS, it may still have serious problems, that i've not noticed etc.
+
+MAILSPOOL=/tmp/spool
+
+if [ "$1" != "-f" ]
+then
+ if [ "$1" = "-t" ]
+ then
+ ADDR="$2"
+ FROM="$3"
+ else
+ ADDR="$1"
+ FROM="$2"
+ fi
+
+ cat - > $MAILSPOOL/tmp.$$ || exit 1
+ mv $MAILSPOOL/tmp.$$ "$MAILSPOOL/msg.`date +%j%H%M%S`$$.to.${ADDR}_@@${FROM}" || exit 1
+
+ exit 0
+else
+ for i in $MAILSPOOL/msg.*.to.*
+ do
+ [ -f "$i" ] || continue
+ # TO="`echo \"$i\" | sed 's/^msg.[^.]*.to.//'`"
+ TO=$(basename $i | sed -e 's/^msg.[^.]*.to.//' -e 's/_@@.*$//')
+ FROM=$(basename $i | sed 's/^msg.[^.]*.to.*_@@//')
+# need the \<\> so for bounces to have a proper from addr
+echo the to was \<$TO\> and the from \<$FROM\>
+ /usr/lib/sendmail -f \<${FROM}\> -oem "$TO" < "$i" ||
+ {
+ echo "Sendmail failed on `basename \"$i\"`"
+ continue
+ }
+ rm -f "$i"
+ done
+ exit 0
+fi
+
diff --git a/contrib/getfetchmail b/contrib/getfetchmail
new file mode 100644
index 00000000..bcac9d3e
--- /dev/null
+++ b/contrib/getfetchmail
@@ -0,0 +1,31 @@
+#!/bin/bash
+RH=ftp.ccil.org
+p=`\
+echo dir /pub/esr/fetchmail/f\*src.rpm \
+ | ftp $RH \
+ | grep /pub/esr/fetchmail/fetchmail-[45] \
+ | tail -1`
+#p='-rw-r--r-- 1 23 wheel 478424 Dec 18 03:54 /pub/esr/fetchmail/fetchmail-4.7.1-1.src.rpm'
+#echo $p | sed -e "s=^.^/pub=pub="
+p1=`echo $p | sed -e "s=^.*/pub=pub="`
+#echo $p1
+#basename $p1
+#dirname $p1
+d=`dirname $p1`
+f=`basename $p1`
+cd /work/incoming
+email=$LOGNAME\@`hostname`
+ftp -n <<ZZ
+open $RH
+user anonymous $email
+cd /$d
+get $f
+bye
+ZZ
+rpm -K $f >/dev/null 2>&1 \
+ || {
+ rpm -K $f 2>&1 | mail $email -s "error getting $f"
+ exit
+ }
+rpm --rebuild $f 2>&1 |\
+ mail $email -s "Rebuilding $f"
diff --git a/contrib/getfetchmail.pl b/contrib/getfetchmail.pl
new file mode 100644
index 00000000..45bd3c65
--- /dev/null
+++ b/contrib/getfetchmail.pl
@@ -0,0 +1,61 @@
+#!/usr/bin/perl -w
+# Copyright 2001 John Summerfield, summer@summer.ami.com.au
+# GPL 2 applies.
+#
+($flags, $links, $owner, $gowner, $size, $month, $day, $timeOrDate, $name, $junk, $junk2, $junk1) ='';
+$RemoteHost="ftp.ccil.org";
+$LocalDir="/home/u03/incoming/";
+$FilePattern="/pub/esr/fetchmail/fetchmail\*src.rpm";
+$GrepArgs="fetchmail-[5-9]";
+$no=0;
+$TempFile=`mktemp /var/tmp/getfetchmail.XXXXXX`;
+@files=`echo dir $FilePattern | ftp $RemoteHost | egrep $GrepArgs`;
+chomp @files;
+open(FTP, "| ftp -d -v $RemoteHost | egrep '^213|MDTM' >$TempFile");
+foreach $L (@files)
+{
+ ++$no;
+ $L =~ s/ */,/g;
+ ($flags, $links, $owner, $gowner, $size, $month, $day, $timeOrDate, $name, $junk) = split /,/,$L;
+ next unless substr($timeOrDate,2,1) eq ':';
+ print FTP "modtime $name\n";
+# last if $no > 4;
+}
+close FTP;
+
+$SavedTime=0;
+$time=1;
+$SavedName='';
+open (FILES,$TempFile);
+while ($rec = <FILES>)
+{
+ chomp $rec;
+ ($junk1, $junk2, $filename) = split / /,$rec if substr($rec,0,4) eq '--->';
+ $time = substr($rec,4) if substr($rec,0,3) eq '213';
+ if (($time > $SavedTime) && (substr($rec,0,3) eq '213'))
+ {
+ $SavedTime=$time;
+ $SavedName=$filename;
+ }
+}
+close FILES;
+$LocalName = $SavedName; $LocalName =~ s=.*/==;
+$LocalName = $LocalDir . $LocalName;
+$Y=substr($SavedTime,0,4);
+$M=substr($SavedTime,4,2);
+$D=substr($SavedTime,6,2);
+$h=substr($SavedTime,8,2);
+$m=substr($SavedTime,10,2);
+$s=substr($SavedTime,12,2);
+print "I should get $SavedName and store it in $LocalName\n";
+open(SH,"|/bin/bash");
+print SH <<zz
+set -x
+echo get $SavedName $LocalName \| ftp $RemoteHost
+rpm -K $LocalName \|\| exit $?
+touch -t $Y$M$D$h$m.$s $LocalName
+rpm --rebuild $LocalName
+zz
+;
+close SH;
+
diff --git a/contrib/getmail b/contrib/getmail
new file mode 100755
index 00000000..eec5c6fb
--- /dev/null
+++ b/contrib/getmail
@@ -0,0 +1,73 @@
+#------------------------------------------------------------------------------
+#
+# GetMail - Fetchmail Daemon Controlling Script
+#
+# 1999 by Thomas Nesges <ThomaNesges@TNT-Computer.de>
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# GetMail starts/stops fetchmail in daemon mode and logs all actions to
+# /var/log/fetchmail.log. Output is done by tailing the logfile.
+#
+# Sendmail/Fetchmail has to be installed, and your fetchmailrc has to be
+# correctly configured. The option 'got' and 'goth' require a correctly
+# installed GotMail. If you didn't install it in /usr/local/gotmail you
+# must change the path given.
+#
+# If you have any changes/corrections in the script, please send me email.
+#------------------------------------------------------------------------------
+
+#!/bin/sh
+
+case "$1" in
+ start)
+ sendmail -q
+ date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ started >> /var/log/fetchmail.log
+ fetchmail -d 1 -L /var/log/fetchmail.log &
+ tail -f /var/log/fetchmail.log
+ ;;
+ stop)
+ fetchmail -q
+ date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ stoped >> /var/log/fetchmail.log
+ ;;
+ fetch)
+ date +%d.%m.%Y\ %H:%M:%S\ fetchmail\ started >> /var/log/fetchmail.log
+ fetchmail -d 1 -L /var/log/fetchmail.log &
+ tail -f /var/log/fetchmail.log
+ ;;
+ status)
+ tail -f /var/log/fetchmail.log
+ ;;
+ got)
+ /usr/local/gotmail/gotmail
+ ;;
+ goth)
+ /usr/local/gotmail/gotmail html
+ ;;
+ send)
+ /sendmail -q
+ ;;
+ clear)
+ fetchmail -q
+ rm /var/log/fetchmail.log
+ ;;
+ -v)
+ echo 'getmail version: 0.0.1'
+ ;;
+ *)
+ echo
+ echo 'Usage: getmail option'
+ echo
+ echo 'options:'
+ echo ' clear - stops fetchmail and kills the logfile'
+ echo ' fetch - starts fetchmail'
+ echo ' got - starts gotmail'
+ echo ' goth - starts gotmail html'
+ echo ' send - sends all mail from the mailqueue'
+ echo ' status - tails the logfile'
+ echo ' start - starts fetchmail and tails the logfile'
+ echo ' stop - stops fetchmail'
+ echo ' -v - print the version number'
+ echo
+esac
diff --git a/contrib/gotmail b/contrib/gotmail
new file mode 100755
index 00000000..8580da6d
--- /dev/null
+++ b/contrib/gotmail
@@ -0,0 +1,69 @@
+#------------------------------------------------------------------------------
+#
+# GotMail - Statistics Printing Script for GetMail
+#
+# 1999 by Thomas Nesges <ThomaNesges@TNT-Computer.de>
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# GotMail reads a GetMail logfile (/var/log/fetchmail.log) and prints
+# statistics from all sessions logged in it, either as normal text on the
+# Console, or as an html-file. The parsing is done with the awk-scripts
+# gotmail.awk and gotmail.html.awk.
+# You can configure its output with a file gotmail.conf either in your home,
+# /etc, or in /usr/local/gotmail.
+#
+# GetMail has to be properly installed. For HTML output the htmllib has to be
+# installed in /usr/local/htmllib.
+#
+# If you have any changes/corrections in the script, please send me email.
+#------------------------------------------------------------------------------
+
+
+#!/bin/sh
+
+# Gotmail
+# 1999 by Thomas Nesges <ThomasNesges@TNT-Computer.de>
+
+# read the configuration
+# the configuration can either be
+# ~/.gotmail.conf
+# /etc/gotmail.conf
+# /usr/local/gotmail/gotmail.conf
+if { test -e ~/.gotmail.conf; };
+ then { source ~/.gotmail.conf; };
+ else { if { test -e /etc/gotmail.conf; };
+ then { source /etc/gotmail.conf; };
+ else { if { test -e /usr/local/gotmail/gotmail.conf; };
+ then { source /usr/local/gotmail/gotmail.conf; };
+ else { echo 'Error: gotmail.conf could not be read';
+ echo 'gotmail exits now..';
+ exit; };
+ fi; };
+ fi; };
+fi;
+
+
+# grep the fetchmail.log for relevant messages and save them in
+# gotmails tempfile
+cat /var/log/fetchmail.log | grep 'message' >> /tmp/gotmail.log.tmp
+cat /var/log/fetchmail.log | grep 'Authorization' >> /tmp/gotmail.log.tmp
+cat /var/log/fetchmail.log | grep 'fetchmail st' >> /tmp/gotmail.log.tmp
+
+
+# parse the gotmail tempfile and prints a statistiks-screen
+case "$1" in
+ html)
+ awk -f /usr/local/htmllib/htmllib.awk -f /usr/local/gotmail/gotmail.html.awk /tmp/gotmail.log.tmp > /dev/null
+ ;;
+ -v)
+ echo 'gotmail version: 0.0.1'
+ ;;
+ *)
+ awk -f /usr/local/gotmail/gotmail.awk /tmp/gotmail.log.tmp
+ ;;
+esac
+
+# remove the gotmail tempfile
+rm /tmp/gotmail.log.tmp
diff --git a/contrib/gotmail.awk b/contrib/gotmail.awk
new file mode 100644
index 00000000..9c967ade
--- /dev/null
+++ b/contrib/gotmail.awk
@@ -0,0 +1,62 @@
+#-----------------------------------------------------------------------------
+#
+# Gotmail - gotmail.awk
+#
+# 1999 by Thomas Nesges <ThomasNesges@TNT-Computer.de>
+#
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+# This script is part of GotMail. It gives back normal text to the console
+#-----------------------------------------------------------------------------
+
+{
+ if($2!="reading")
+ {
+ if(($3=="message") || ($3=="messages"))
+ {
+ Mails = Mails sprintf(" %- 40s ",substr($5,1,40))
+ Mails = Mails sprintf(" %- 5s ",substr($2,1,5))
+ Mails = Mails sprintf(" %- 30s\n",substr($7,1,30))
+ }
+ else if($3=="fetchmail")
+ {
+ Started = Started " " $0 "\n"
+ }
+ else
+ {
+ Errors = Errors $0 "\n"
+ }
+ }
+}
+
+END {
+ Separator = "-------------------------------------------------------------------------------"
+ if(ENVIRON["GOTM_HED"]=="yes")
+ {
+ print "\n\t\t---------------------------------------"
+ print "\t\t| ** GotMail - Stats for fetchmail ** |"
+ print "\t\t---------------------------------------"
+ }
+ if(ENVIRON["GOTM_MSG"]=="yes")
+ {
+ print Separator
+ print "| Fetched Mails:"
+ print Separator
+ print Mails
+ }
+ if(ENVIRON["GOTM_ERR"]=="yes")
+ {
+ print Separator
+ print "| Error Messages:"
+ print Separator
+ print Errors
+ }
+ if(ENVIRON["GOTM_TIM"]=="yes")
+ {
+ print Separator
+ print "| Fetchmail started/stoped:"
+ print Separator
+ print Started
+ }
+ }
diff --git a/contrib/gotmail.conf b/contrib/gotmail.conf
new file mode 100644
index 00000000..08087936
--- /dev/null
+++ b/contrib/gotmail.conf
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+# Print Statistiks for Error-Messages
+ export GOTM_ERR="yes"
+# Print Statistiks for fetched Messages
+ export GOTM_MSG="yes"
+# Print Statistiks for Start/Stop-Messages
+ export GOTM_TIM="yes"
+# Print Statistiks with Header
+ export GOTM_HED="yes"
+
+# Special HTML Options
+
+# Background Color
+ export GOTM_BGCOL="#FFFFFF"
+# Text Color
+ export GOTM_TXCOL="#000000"
+# Error-Messages Color
+ export GOTM_ERRCOL="#DD3030"
+# Start/Stop-Messages Color
+ export GOTM_TIMCOL="#30FF30"
+# Normal Messages Color
+ export GOTM_MSGCOL="#FDFCCC"
+# Ouput File
+ export GOTM_HTMLFILE="/usr/local/gotmail/gotmail.html"
diff --git a/contrib/gotmail.html.awk b/contrib/gotmail.html.awk
new file mode 100644
index 00000000..ba111a64
--- /dev/null
+++ b/contrib/gotmail.html.awk
@@ -0,0 +1,99 @@
+#-----------------------------------------------------------------------------
+#
+# Gotmail - gotmail.awk
+#
+# 1999 by Thomas Nesges <ThomasNesges@TNT-Computer.de>
+#
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+# This script is part of GotMail. It emits html to a specified File
+# The AWK-Library htmllib has to be properly installed.
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+function init_environ()
+{
+ TextColor = ENVIRON["GOTM_TXCOL"]
+ BackColor = ENVIRON["GOTM_BGCOL"]
+ MsgColor = ENVIRON["GOTM_MSGCOL"]
+ ErrColor = ENVIRON["GOTM_ERRCOL"]
+ TimColor = ENVIRON["GOTM_TIMCOL"]
+ OutFile = ENVIRON["GOTM_HTMLFILE"]
+ PrintMsg = toupper(ENVIRON["GOTM_MSG"])
+ PrintErr = toupper(ENVIRON["GOTM_ERR"])
+ PrintTim = toupper(ENVIRON["GOTM_TIM"])
+ PrintHed = toupper(ENVIRON["GOTM_HED"])
+
+}
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+{
+ init_environ()
+ if($2!="reading")
+ {
+ if($3=="messages")
+ {
+ Mails = Mails TableRow("start", MsgColor)
+ Mails = Mails TableItem($5) TableItem($7)
+ Mails = Mails TableItem(Align($2,0))
+ Mails = Mails TableRow("stop")
+ }
+ else if($3=="fetchmail")
+ {
+ Times = Times TableRow("start", TimColor)
+ Times = Times TableItem($0)
+ Times = Times TableRow("stop")
+ }
+ else
+ {
+ Errors = Errors TableRow("start", ErrColor)
+ Errors = Errors TableItem($0)
+ Errors = Errors TableRow("stop")
+ }
+ }
+}
+#-----------------------------------------------------------------------------
+END {
+ Stats = StartPage(Title("Gotmail Stats") Body(BackColor, TextColor))
+ if(PrintHed == "YES")
+ {
+ Stats = Stats Align(Headline("Gotmail Stats",1),0)
+ Stats = Stats Divider Newline
+ }
+ if(PrintMsg == "YES")
+ {
+ Stats = Stats TableStart(1)
+ Stats = Stats TableRow("start", MsgColor)
+ Stats = Stats TableItem(Bold("Account"))
+ Stats = Stats TableItem(Bold("Server"))
+ Stats = Stats TableItem(Bold("Mails fetched"))
+ Stats = Stats TableRow("stop")
+ Stats = Stats Mails TableEnd Newline Divider Newline
+ }
+
+ if(PrintErr == "YES")
+ {
+ Stats = Stats TableStart(1)
+ Stats = Stats TableRow("start", ErrColor)
+ Stats = Stats TableItem(Bold("Error Messages"))
+ Stats = Stats TableRow("stop")
+ Stats = Stats Errors TableEnd Newline Divider
+ }
+
+ if(PrintTim == "YES")
+ {
+ Stats = Stats TableStart(1)
+ Stats = Stats TableRow("start", TimColor)
+ Stats = Stats TableItem(Bold("Start/Stop Times"))
+ Stats = Stats TableRow("stop")
+ Stats = Stats Times TableEnd Newline Divider
+ }
+
+ Stats = Stats Center("start") "GotMail - 1999 by Thomas Nesges "
+ Stats = Stats "<ThomasNesges@TNT-Computer.de>" Center("stop") EndPage
+
+ print Stats > OutFile
+ }
+#-----------------------------------------------------------------------------
diff --git a/contrib/ip-up b/contrib/ip-up
new file mode 100644
index 00000000..542448d9
--- /dev/null
+++ b/contrib/ip-up
@@ -0,0 +1,70 @@
+From James.Stevens@jrcs.co.uk Mon Aug 25 18:11:36 1997
+Return-Path: <James.Stevens@jrcs.co.uk>
+Received: from locke.ccil.org (snark [10.0.2.15])
+ by snark.thyrsus.com (8.8.5/8.8.5) with ESMTP id SAA10394
+ for <esr@snark.thyrsus.com>; Mon, 25 Aug 1997 18:11:34 -0400
+Received: (from slist@localhost)
+ by locke.ccil.org (8.8.5/8.8.5) id GAA17071
+ for esr; Mon, 18 Aug 1997 06:17:07 -0500 (EST)
+Resent-Date: Mon, 18 Aug 1997 06:17:07 -0500 (EST)
+X-Authentication-Warning: locke.ccil.org: slist set sender to fetchmail-friends-request@ccil.org using -f
+X-NiNLog: [James.Stevens@jrcs.co.uk] [<fetchmail-friends@locke.ccil.org>] [199708180955.KAA04988]
+Message-ID: <33F81C2D.AB822BBB@jrcs.co.uk>
+Date: Mon, 18 Aug 1997 10:55:57 +0100
+From: James Stevens <James.Stevens@jrcs.co.uk>
+Reply-To: James.Stevens@jrcs.co.uk
+Organization: JRCS Ltd
+X-Mailer: Mozilla 4.01 [en] (Win95; I)
+MIME-Version: 1.0
+To: "fetchmail-friends@locke.ccil.org" <fetchmail-friends@locke.ccil.org>
+Subject: A Little Tip...
+X-Priority: 3 (Normal)
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+Resent-Message-ID: <"lhVgRB.A.FFE.bxC-z"@locke.ccil.org>
+Resent-From: fetchmail-friends@ccil.org
+X-Mailing-List: <fetchmail-friends@ccil.org> archive/latest/725
+X-Loop: fetchmail-friends@ccil.org
+Precedence: list
+Resent-Sender: fetchmail-friends-request@ccil.org
+Status: RO
+
+Seeing Eric tip us that we could run a "fetchmail -quit" in the
+"ip-down" script, I thougt it would be neat to run a fetchmail
+collection in the "ip-up" script. That way mail is collected
+automatically every time I am connecting to Internet for whatever reason
+(I use "diald" to automatically manage my connection).
+
+However, it did not work. It hung right after the POP3 login. I tracked
+this down to the fact that the "pppd" masks a wide range of signals and
+this means a time-out does not kick in. As I run the "ip-up" script in
+"bash" this masking is inheritied by "fetchmail".
+
+So, I wrote a silly little "C" program that unmasks all signals and then
+runs a command of you choice (in this case fetchmail). This is the code
+for that program :-
+
+#include <stdio.h>
+#include <signal.h>
+
+main(int argc,char * argv[])
+{
+sigset_t set;
+
+ if (argc>1)
+ {
+ sigfillset(&set);
+ sigprocmask(SIG_UNBLOCK,&set,NULL);
+ system(argv[1]);
+ }
+}
+
+I call it "allsigs". So, now in my "ip-up" I have the line :-
+
+allsigs "fetchmail -f /etc/fetahmail"
+
+Note the quotes as "allsigs" only looks at argv[1]. I guess this
+unmasking of all signals could be added into "fetchmail" ?
+
+James
+
diff --git a/contrib/login b/contrib/login
new file mode 100755
index 00000000..952594af
--- /dev/null
+++ b/contrib/login
@@ -0,0 +1,16 @@
+# ~/.bash_login
+#
+
+# Start Fetchmail up when I Login.
+#
+# TDEV=my PRESENT terminal device IE: ttyp2, tty5, ....
+#
+export TDEV=`tty | sed -n -e "s#/dev/##p"`
+#
+if [ ! -s ~/.fetchmail ]; then
+ /usr/local/bin/fetchmail -d 300
+ echo "owner" >.fetchmail.$TDEV
+else
+ echo "notowner" >.fetchmail.$TDEV
+fi
+# END of Fetchmail startup
diff --git a/contrib/logout b/contrib/logout
new file mode 100755
index 00000000..96c9111d
--- /dev/null
+++ b/contrib/logout
@@ -0,0 +1,30 @@
+# ~/.bash_logout
+# Clean things up when I Exit.
+
+# Below is for Fetchmail clean up
+#
+# TDEV=my PRESENT terminal device IE: ttyp0, tty5, .....
+#
+export TDEV=`tty | sed -n -e "s#/dev/##p"`
+#
+if [ -s ~/.fetchmail ]; then
+#
+ if [ -s ~/.fetchmail.$TDEV ]; then
+ TEST=`/usr/bin/grep 'notowner' ~/.fetchmail.$TDEV`
+#
+ if [ ! -z $TEST ]; then
+ /bin/rm -rf ~/.fetchmail.$TDEV
+ elif [ -z $TEST ]; then
+ /bin/rm -rf ~/.fetchmail.$TDEV
+ /usr/local/bin/fetchmail -q >/dev/null 2>&1
+ fi
+#
+ else
+ echo "WARNING: A process either did not record a ~/.fetchmail.$TDEV" >> ~/.fetchmail.warning.$TDEV
+ echo "WARNING: Or removed the file manually ." >> ~/.fetchmail.warning.$TDEV
+ fi
+#
+else
+ echo "WARNING: parent process has exit'ed & removed primary ~/.fetchmail.$TDEV " >> ~/.fetchmail.warning.$TDEV
+fi
+# END of Fetchmail clean up
diff --git a/contrib/maildaemon b/contrib/maildaemon
new file mode 100755
index 00000000..3728c333
--- /dev/null
+++ b/contrib/maildaemon
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+# maildaemon, fetchmail driver intended to be invoked hourly by cron.
+#
+# Script by Larry Fahnoe <fahnoe@kegworks.mn.org>, who writes:
+#
+# This is intended to support a standalone system (NeXTSTEP in this case)
+# which makes manual, on-demand PPP connections to the outside world. The
+# script is run as the target user from cron on an hourly basis. If it
+# finds a PPP link is up (it sees routes on a PPP interface), fetchmail is
+# invoked. If the link is not up, and the hour is in the list of hours that
+# connections should be made, the link is brought up and fetchmail is
+# invoked. The program or script used to bring up the link should return an
+# exit status which reflects whether the link actually came up.
+#
+# I wrote this because I wanted to be able to have control over the amount
+# of time spent connected to an ISP and yet still be able to poll for mail
+# at intervals that made sense to me. One limitation of this script is that
+# it does not take into account that an existing PPP link might be going to
+# a different ISP or network.
+#
+
+# You'll have to configure these
+USER=fahnoe # your name
+HOME=/Users/fahnoe # home directory (for the logfile)
+FORCEHOURS="05 09 13 17" # when to bring the link up if it's not already
+SERVER=mailserver.isp.com # mailserver host name
+
+# Link initialization and wrapup scripts (you may have to configure these)
+PPPUP="/usr/local/bin/pppup $SERVER"
+PPPDOWN=/usr/local/bin/pppdown
+
+PATH=/usr/local/bin:/bin:/usr/ucb:/usr/bin:/usr/etc
+export PATH USER HOME
+
+LOG=$HOME/log/maildaemon.log
+
+# get the mail, depends on $HOME/.fetchmailrc and $USER
+FETCHMAIL( ) {
+ ( echo "`date` $SERVER"
+ fetchmail $SERVER
+ if [ $? -gt 1 ]
+ then
+ echo "`date` $SERVER (evil things happened in fetchmail)"
+ fi
+ ) >> $LOG 2>&1
+}
+
+# if the link is already up, check for mail.
+# if the hour is in FORCEHOURS, force the link up and check for mail.
+(netstat -rn | awk '{ print $6 }' | grep ppp[0-9] > /dev/null)
+if [ $? -eq 0 ]
+then
+ FETCHMAIL
+else
+ hour=`date | sed -e 's/:/ /g' | awk '{ print $4 }'`
+ for x in $FORCEHOURS
+ do
+ if [ $hour = $x ]
+ then
+ $PPPUP
+ if [ $? -eq 0 ]
+ then
+ FETCHMAIL
+ $PPPDOWN
+ else
+ echo "`date` $SERVER (link establishment failure)" >> $LOG
+ exit 1
+ fi
+ fi
+ done
+fi
+
+exit
+
diff --git a/contrib/mailqueue.pl b/contrib/mailqueue.pl
new file mode 100644
index 00000000..50acb831
--- /dev/null
+++ b/contrib/mailqueue.pl
@@ -0,0 +1,420 @@
+#!/usr/bin/perl
+# This is script will connect to your isp (if not already connected),
+# send any outgoing mail and retrieve any incoming mail. If this
+# program made the connection, it will also break the connection
+# when it is done.
+#
+# Bill Adams
+# bill@evil.inetarena.com
+#
+# Revision History
+# 1.0.1 05 Sep 1998 baa Massive updates to work with fetchmail.
+#
+# Get the latest version from my home-page:
+# http://www.inetarena.com/~badams/computerstuff.html
+# following the 'Stuff I Have Written' link.
+#
+# License: GNU, but tell me of any improvements or changes.
+#
+use strict;
+
+my $suck;
+my $rdate;
+my ($my_syslog, $debug, $verbose);
+
+my $start_time = time;
+my $mailhost = 'mail';
+my $sendmail_queue_dir = '/var/spool/mqueue/'; #Need trailing slash!
+my $interface = 'ppp0'; #Watch this interface
+my $max_tries = 1; #How many times to try and re-dial
+my $retry_delay = 300; #How long to wait to retry (in seconds)
+my $connect_timeout = 45; #How long to wait for connection
+
+#For the log file, be sure to put the >, >>, or | depending on
+# what you want it to do. I have also written a little program
+# called simple_syslog that you can pipe the data to.
+my $log_file = '>/dev/null'; #Where to put the data.
+$log_file = '>>/var/log/mailqueue.pl';
+#$log_file = '>/dev/console';
+
+my $this_hour = +[localtime()]->[2];
+
+#Define this to get mail between midnight and 5 am
+#$suck = '/var/spool/suck/get.news.inn';
+
+#Define this to set the time to a remote server
+#$rdate = '/usr/bin/rdate -s clock1.unc.edu';
+
+#Where are the programs are located. You can specify the full path if needed.
+my $pppd = 'pppd';
+my $fetchmail = 'fetchmail'; #'etrn.pl';
+my $sendmail = 'sendmail';
+
+#Where is the etrn/fetchmail pid
+my $fetchmail_pid = '/var/run/fetchmail.pid';
+
+
+#Set the path to where we think everything will live.
+$ENV{'PATH'} = ":/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:";
+my $lockfile = "/var/run/mailqueue.lock"; #lockfile for this program
+my $space = ' '; #Never know when you might need space
+my $program_name = $0;
+$program_name = substr ($program_name, (rindex ($program_name, '/') + 1));
+open SYSLOG, $log_file or die "Could not open $log_file\n\t";
+
+sys_log ("Started by UID $<");
+#$< = 0; #suid root
+
+#Other global vars
+my $pppd_pid;
+
+#Make sure we are root. This has to be the case for everything
+# to work properly.
+if ($< != 0) {
+ sys_log ("Not root...exit");
+ print STDERR "You are not root...sorry cannot run.\n";
+ exit (1);
+}
+
+sub sys_log {
+ #Writes a message to the log file.
+ my ($message) = @_;
+ print SYSLOG join(' ',
+ $program_name,
+ ''.localtime(), #The '' puts it in a scaler context.
+ $message)."\n";
+ print STDERR $message, "\n" if $debug;
+}
+
+#Get the command line args.
+$verbose = 1;
+for (my $i = 0; $i <= $#ARGV; $i++) {
+ if ($ARGV[$i] eq '-v' || $ARGV[$i] eq '-verbose') {
+ $verbose++;
+ print "Running in verbose mode level ($verbose).\n";
+ } elsif ($ARGV[$i] eq '-d' || $ARGV[$i] eq '-debug') {
+ $debug++;
+ $verbose = 10; #Some high value so everything gets printed
+ print STDERR "Running in debug mode.\n";
+ } elsif ($ARGV[$i] eq '-q' || $ARGV[$i] eq '-quiet') {
+ $debug = 0;
+ $verbose = 0;
+ } elsif ($ARGV[$i] eq '-max_tries') {
+ if (not defined $ARGV[$i + 1]) {
+ printf STDERR "$0: Error: option -max_tries requires a value.\n";
+ &usage;
+ } else {
+ $max_tries = $ARGV[$i + 1];
+ }
+ } elsif ($ARGV[$i] eq '-retry_delay') {
+ if (not defined $ARGV[$i + 1]) {
+ printf STDERR "$0: Error: option -retry_delay requires a value.\n";
+ &usage;
+ } else {
+ $max_tries = $ARGV[$i + 1];
+ }
+ } elsif ($ARGV[$i] eq '-interface') {
+ if (not defined $ARGV[$i + 1]) {
+ printf STDERR "$0: Error: option -interface requires a value.\n";
+ &usage;
+ } else {
+ $max_tries = $ARGV[$i + 1];
+ }
+ } elsif ($ARGV[$i] eq '-mailhost') {
+ if (not defined $ARGV[$i + 1]) {
+ printf STDERR "$0: Error: option -mailhost requires a value.\n";
+ &usage;
+ } else {
+ $mailhost = $ARGV[$i + 1];
+ }
+ } else {
+ print STDERR "Unknown command line option: [". $ARGV[$i]."]\n";
+ &usage;
+ }
+}
+
+
+$| = 1 if $verbose; #Output un-buffered if we are verbose
+
+
+#Do some checking for programs
+&check_program ($my_syslog) || die "$0 -> Error: $my_syslog is required\n";
+($fetchmail = &check_program ($fetchmail))
+ || die "$0 -> Error: Could not find fetchmail/etrn\n";
+($pppd = &check_program ($pppd))
+ || die "$0 -> Error: Could not find pppd\n";
+(-d $sendmail_queue_dir) || die "$0 -> Error: The sendmail queue directory\n\t[$sendmail_queue_dir] does not exist or is not a directory.\n";
+($sendmail = &check_program ($sendmail))
+ || die "$0 -> Error: Could not find $sendmail\n";
+
+
+#Do some process locking. This kills any already running processes.
+if (-s $lockfile) {
+ my $pid = `cat $lockfile`; chop $pid;
+ if (not &process_is_dead ($pid)) {
+ print STDERR "$0 -> Process locked by pid $pid killing it.\n"
+ if $verbose;
+ kill 15, $pid;
+ waitpid ($pid, 0); #This has no effect.
+ }
+ sys_log ("Removing stale lock for pid $pid") if $verbose;
+ unlink ($lockfile) || die $!;
+}
+open (LOCK, '>'.$lockfile) || die "$0: Could not create lockfile $lockfile\n";
+print LOCK $$, "\n";
+close LOCK;
+
+#print out some info if needed.
+if ($debug) {
+ print STDERR " Max tries: $max_tries\n";
+ print STDERR " Dial Retry Delay: $retry_delay seconds.\n";
+ print STDERR "Interface set to watch: $interface\n";
+ print STDERR " Mailhost set to watch: $mailhost\n";
+ print STDERR " Connection timeout: $connect_timeout\n";
+ print STDERR " Sendmail: $sendmail\n";
+ print STDERR " pppd: $pppd\n";
+ print STDERR " fetchmail/etrn.pl: $fetchmail\n";
+ print STDERR "\n\n";
+}
+((-x $pppd) && (-x $sendmail) && (-x $fetchmail))
+ || die "Still some problem with programs.\n\tRun with -d to see if the path is specified for sendmail,\n\tpppd and fetchmail/etrn.pl";
+
+while ($max_tries--) {
+ my $child_pid;
+ unless ($child_pid = fork) {
+ #This is the child process that waits for a connection to be made
+ # and then sends the local mail queue and then sends a request to
+ # get the remote mail queue
+ my $count = $connect_timeout;
+ while (&interface_is_down ($interface) && $count--) {sleep (1)}
+ if ($count < 1) {exit (1)}
+
+ #Send any queued mail. I had another routine that would
+ # fork and watch sendmail with a timeout, but that is kinda
+ # flaky depending on how big your queue size is. So
+ # now just call it and wait for it to return. If you have bad
+ # messages in your queue, this can hang.
+ sys_log ("Have connection->sending any local mail.") if $verbose;
+ system("$sendmail -q");
+
+ sys_log ("Checking remote queue on ($mailhost)");
+
+ my $result;
+ my $daemon = 0;
+ my $pid;
+ #In case we have a pid, read it and find out if it is
+ # still valid or not.
+ if (defined $fetchmail_pid and -f $fetchmail_pid) {
+ if (not open PID, $fetchmail_pid) {
+ sys_log("Could not open $fetchmail_pid");
+ die}
+ $pid = <PID>;
+ if ($pid =~ m|([0-9]+)\s+([0-9]*)|) {
+ $pid = $1;
+ $daemon = $2;
+ }
+ close PID;
+ sys_log("Have PID file ($fetchmail_pid) with PID $pid $daemon");
+ #In the case of fetchmail, we need to see if it is
+ # still running in case there is a stale lock file.
+ if (&process_is_dead($pid)) {
+ sys_log(" It is no longer running");
+ $daemon = 0; $pid = 0}
+ }
+ if (not $pid or ($pid and $daemon)) {
+ #Either it is not running or it is running and a daemon.
+ sys_log("Running $fetchmail [$daemon]");
+ my $result = (system ($fetchmail))/256;
+ sys_log($fetchmail.' exited with status '.$result) if $debug;
+ } else {
+ sys_log("$fetchmail already running...");
+ }
+
+ #Watch the directory for n seconds of inactivity.
+ sys_log("Fetchmail done...watching $sendmail_queue_dir");
+ &watch_dir ($sendmail_queue_dir, 10);
+ sys_log ("Done polling for mail");
+
+ if (-f $fetchmail_pid and not $daemon) {
+ #In case something went wrong and the fetchmail is still
+ # running (and not a daemon)....
+ my $result = `$fetchmail -q`; chop $result;
+ sys_log($result);
+ }
+ exit (0);
+ }
+ #If a connection is needed, make it.
+ if (&interface_is_down ($interface) && $pppd_pid == 0) {
+ sys_log ("Try to connect with pppd") if $debug;
+ # Fork pppd with a pid we can track.
+ unless ($pppd_pid = fork) {
+ exec ($pppd.' -detach');
+ }
+ }
+ #Wait for the child to exit and check for errors
+ waitpid ($child_pid, 0);
+ my $child_status = ($? / 256);
+ my $child_kill = $? % 256;
+ if ($child_status == 0) {
+ if ($this_hour <= 4 and defined $suck) {
+ sys_log ("Calling suck...");
+ print `$suck`;
+ }
+ if (defined $rdate) {
+ sys_log ("Calling rtime...");
+ print `$rdate`;
+ }
+ if ($pppd_pid) { #If we ran pppd, kill it
+ sys_log ("Killing pppd (pid $pppd_pid)");
+ kill 15, $pppd_pid;
+ waitpid ($pppd_pid, 0); #Wait for clean exit of child
+ }
+ sys_log ("Finished with cycle.");
+ unlink ($lockfile);
+ sys_log ("Total time: ".(time-$start_time)." seconds") if $debug;
+ exit (0);
+ }
+ # Reset to pppp_pid to zero if pppd is not running.
+ if ($pppd_pid && &process_is_dead ($pppd_pid)) {$pppd_pid = 0}
+ sys_log (join ('', "Warn: Did not connect -> Try ",
+ $max_tries, " more times...after ",
+ $retry_delay, " seconds"));
+ if (not $max_tries) {
+ sys_log ("Giving up...");
+ exit (1);
+ }
+ sleep ($retry_delay);
+ sys_log ("ok...trying again.");
+}
+
+sub check_program {
+ #See if a program is in the path
+ my ($program) = @_;
+ my $exists = 0;
+ my $path_specified = 0;
+ my $path;
+
+ #catch the case where there is already a slash in the argument.
+
+ if ($program =~ /\//) {
+ $path_specified = 1;
+ if (-x $program) {$exists = $program}
+ }
+
+ my $exists;
+ foreach $path (split(/:/, $ENV{'PATH'})) {
+ next if length ($path) < 3; #skip bogus path entries
+ #be sure the there is a trailing slash
+ if (substr ($path, -1, 1) ne '/') {$path .= '/'}
+ #Check to see if it exists and is executable
+ if (-x $path.$program) {$exists = $path.$program; last}
+ }
+ if (not $exists) {
+ if ($path_specified) {
+ print STDERR "$0 -> Warn: ". $program.
+ " is not executable or does not exist.\n";
+ } else {
+ print STDERR "$0 -> Warn: [$program] was not found in path\n\t".
+ $ENV{'PATH'}."\n";
+ }
+ }
+ return ($exists);
+}
+
+
+sub process_is_dead {
+ #This is a cheap way to check for running processes. I could use
+ # the /proc file-system in Linux but that would not be very
+ # friendly to other OS's.
+ #
+ #return 1 if pid is not in process list
+ # This expects ps to return a header line and then another line if
+ # the process is running. Also check for zombies
+ my ($pid) = @_;
+ my @results = split (/\n/, `ps $pid 2>/dev/null`);
+ if (not defined $results[1]) {return 1}
+ if ($results[1] =~ /zombie/i) {return 1}
+ return 0;
+}
+
+
+sub interface_is_down {
+ # return 1 (true) if the ip is down
+ my ($interface) = @_;
+ if (`ifconfig $interface` =~ /UP/) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+sub watch_dir {
+ #Watch the mailqueue directory for incoming files.
+ # The 'xf' files are the transfer (xfer) files on my system.
+ # If you find this is not the case, please email me. To be safe,
+ # I check the latest mod time as long as xf files exist. If no
+ # data has made it over in n seconds, we will assume that an
+ # error has occured and give up.
+
+ my $files_like = '^(xf.*)'; #Regexp
+ my $dir_to_watch = shift;
+ my $delay = shift;
+ my $timeout = 120; #Give it 120 seconds to get data.
+ my $loop_delay = 1; #How long between each loop. Do not make 0!
+
+ #Make sure there is a trailing slash.
+ if ($dir_to_watch !~ m|/$|) {$dir_to_watch .= '/'}
+
+ #How long to wait for transfer of data. This gets reset
+ # each time the mod time falls below a certain time.
+ my $flag = $delay;
+ my $last_total = 0;
+
+ while (($flag -= $loop_delay) > 0) {
+ sleep $loop_delay;
+ opendir (DIR, $dir_to_watch);
+ my $file_count = 0;
+ my $last_data_dl = 500000; #Big Number
+ foreach my $file (readdir (DIR)) {
+ next if not -f $dir_to_watch.$file; #Only files.
+ my @stats = stat($dir_to_watch.$file);
+ my $m_time = time - $stats[9];
+ #Here, if we have a recent file, reset the timeout.
+ if ($m_time < $last_data_dl) {$last_data_dl = $m_time}
+
+ #If we have an xfer file, up the delay.
+ if ($file =~ m|$files_like|) {
+ sys_log("$file is like $files_like");
+ $flag = $delay;
+ }
+ }
+ closedir (DIR);
+ sys_log ("Watch_dir: $flag ($last_data_dl)") if $debug;
+
+ #In the case of now data downloaded...
+ if ($last_data_dl > $timeout and $flag == $delay) {
+ sys_log("Watch_dir: Timed out after $timeout seconds.");
+ $flag = 0;
+ }
+ }
+ sys_log ("Watch_dir: Done.");
+}
+
+sub usage {
+ #print the usage
+ print join ("\n",
+ 'mailqueue.pl -- A program to send and receive mail form a sendmail spooler.',
+ ' Requires that you ISP is running sendmail, at lease version 8.6.?.',
+ ' Also requires that you have fetchmail or etrn.pl installed on this system.',
+ '', 'Command line args (Default in parrens):',
+ ' -v -verbose Run in verbose mode. Can use this arg multiple times.',
+ ' -d -debug Run in debug mode. Sets verbose level to 10',
+ ' -max_tries N Sets the maximum number of connect retries to N. ('.$max_tries.')',
+ ' -retry_delay N Sets the delay between retrying to N seconds. ('. $retry_delay.')',
+ " -connect_timeout N Sets the connection timeout to N seconds. (". $connect_timeout. ')',
+ ' -interface STR Sets the default interface to STR. ('. $interface. ')',
+ ' -mailhost STR Sets the mailhost to STR. ('. $mailhost.')',
+ '');
+ exit (1);
+}
+
diff --git a/contrib/mold_remover.py b/contrib/mold_remover.py
new file mode 100644
index 00000000..1ccba7c3
--- /dev/null
+++ b/contrib/mold_remover.py
@@ -0,0 +1,92 @@
+# Mold Remover
+# A short python script to remove old read mail from a pop3 mailserver.
+# Dovetails with fetchmail with keep option.
+# Run it as a cron job...
+# Version 0.1 by James Stone (stone1@btinternet.com)
+# please submit bug reports and code optimisations as you see fit!
+
+import string
+import poplib
+import time
+
+#user editable section
+mailserver=["mail.server1","mail.server2"] #list of mailservers
+login=["login1","login2"] #list of logins for corresponding mailserver
+password=["pass1","pass2"] #list of passwords (note: chmod 700 for this script)
+days=2 #number of days to keep on server.
+localuidlcache="/var/mail/.fetchmail-UIDL-cache" #fetchmail's UIDL cache
+localuidldate="/var/mail/.UIDLDate" #mold remover's UIDL datefile
+#end of user editable section
+
+readfile=open(localuidlcache, 'r')
+datefile=open(localuidldate, 'a+')
+tempfile=open("/tmp/uidltmp", 'w+')
+popuidllist=[] #list of undeleted uidls on all servers
+totnum=0 #number of undeleted messages on all servers
+connectedto=-1
+
+#connect to each mailserver get all the new message UIDLs and delete any
+#expired messages.
+
+for a in range(len(mailserver)):
+ connect=poplib.POP3(mailserver[a])
+ connect.user(login[a])
+ connect.pass_(password[a])
+ connectedto=a
+ number,size=connect.stat()
+ totnum+=number
+ for mesnum in range(number):
+ messagedeleted=0
+ datefile.seek(0)
+ for uidldate in datefile:
+ uidldatesplit=uidldate.split(' ')
+ if(connectedto==int(uidldatesplit[2])):
+ if (time.time()-float(uidldatesplit[1]))>(86400*days):
+ try:
+ recheckuidl=connect.uidl(mesnum+1)
+ recheckuidlsplit=recheckuidl.split(' ')
+ if (recheckuidlsplit[2]==uidldatesplit[0]):
+ print('deleting'+recheckuidlsplit[1])
+ print(connect.dele(recheckuidlsplit[1]))
+ messagedeleted=1
+ totnum-=1
+ except poplib.error_proto:
+ pass #skip over messages that have already been deleted.
+ if not(messagedeleted):
+ popuidllist.append(connect.uidl(mesnum+1)+' '+str(a))
+ connect.quit()
+
+
+#get rid of lines in uidldate file corresponding to the messages that have been
+#expired (and hopefully been deleted)
+
+datefile.seek(0)
+for uidldate in datefile:
+ uidldatesplit=uidldate.split(' ')
+ if not(time.time()-float(uidldatesplit[1]))>(86400*days):
+ tempfile.write(uidldate)
+datefile.close()
+datefile=open(localuidldate,'w+')
+tempfile.seek(0)
+for line in tempfile:
+ datefile.write(line)
+datefile.close()
+datefile=open(localuidldate,'a+')
+
+#add date to uidl for any messages still on the server which have been read
+#(check in readfile) and store in local datefile.
+
+for mesnum in range(totnum):
+ popuidl=popuidllist[mesnum]
+ popuidlsplit=popuidl.split(' ')
+ readfile.seek(0)
+ for localuidl in readfile:
+ if(localuidl.find(popuidlsplit[2])<>-1):
+ foundindatefile=0
+ datefile.seek(0)
+ for stored in datefile:
+ if (stored.find(popuidlsplit[2])<>-1):
+ foundindatefile=1
+ if not(foundindatefile):
+ datefile.write(popuidlsplit[2]+' '+str(time.time())+' '
+ +popuidlsplit[3]+'\n')
diff --git a/contrib/multidrop b/contrib/multidrop
new file mode 100644
index 00000000..37f87b4c
--- /dev/null
+++ b/contrib/multidrop
@@ -0,0 +1,236 @@
+From mlievaart@orion.nl Mon Jan 10 10:46:33 2000
+From: Martijn Lievaart <mlievaart@orion.nl>
+To: Eric S. Raymond <esr@thyrsus.com>
+Date: zondag 9 januari 2000 0:38
+Subject: Re: Thanks for fetchmail and a solution to the multidrop problem (I
+Status: O
+Content-Length: 8086
+Lines: 226
+
+think)
+
+Hello Eric,
+
+Let me first state that I'm no sendmail nor unix guru, so although this
+seems to work, I certainly would not say this is the "best" solution. In
+fact I would welcome all comments to make this better. In particular, it
+seems that that the mailertable feature was made just for this, but I'm
+still studying that.
+
+Also, This mail will have lines wrapped. I will put up this on a website
+asap, so people can download the relevant portions. In the meantime, I'm
+using (stuck on) Outlook, so I won't even attempt to format this mail.
+Accept my apoligies and try to mentally reconnect the lines.
+
+Finally, this mail is a bit lengthy, but I guess it is better to get all
+information in, so please bear with me.
+
+After some very frustrating attempts to get multidrop to work reliably, it
+suddenly hit me. When sendmail has translated the recipient to the mailbox,
+the recipient is gone (in the cases we're talking about). So the solution is
+not to let sendmail do this translation (completely).
+
+The trick is to let a custom MDA be called with both the mailbox and the
+full recipient name. This MDA then just stuffs it in the correct mailbox
+after adding the appropriate headers. Luckily I hit on the formail utility.
+It reformats a mailmessage and does just what I wanted. Specifically my
+script uses it to:
+- add a custom header (default: "Delivered-To:") with the recipient
+- rewrite the message-ID, so fetchmail will download the same message
+multiple times.
+- add another header, just for fun.
+
+The rewriting of the message-ID is needed because fetchmail will suppress
+multiple messages with the same ID, normally a good idea, but now it gets in
+the way. A switch on fetchmail to suppress this behaviour would be great.
+
+At first I hardcoded the domains in the sendmail.cf, but I quickly set out
+to do one better and came up with the following solution. In sendmail.cf,
+add the following line somewhere at the top.
+
+Kmultidroptable hash -o /etc/mail/multidroptable
+
+this defines a table for all domains we want to use multidrop for. The
+format of this file is multiple lines of the format:
+<domain> <mailbox>
+
+e.g:
+mailtest.orion.nl mailtest
+mailtest2.orion.nl mailtest
+mailtest3.orion.nl mailtest
+bvh-communicatie.nl b.bvh
+krakatau.nl b.bvh
+personeelzaak.nl b.bvh
+maslowassociates.nl b.bvh
+rtij.nl rtij
+
+Of course, create a .db file with makemap. Also, the domains must be added
+to class w, so they should be added to your sendmail.cw or RelayTo file, or
+whatever you use.
+
+Now add to sendmail.cf:
+
+R$+ < @ $* . > $: <MULTIDROP> $(multidroptable $2
+$: <NO> $) <?> $1 < @ $2 . >
+R<MULTIDROP> <NO> <?> $* $: $1
+R<MULTIDROP> $+ <?> $+ < @ $* . > $#drop $@ $2 @ $3 $: $1
+
+These lines should be above the existing lines that read:
+
+# short circuit local delivery so forwarded email works
+R$=L < @ $=w . > $#local $: @ $1 special local names
+R$+ < @ $=w . > $#local $: $1 regular local name
+
+This works as follows (in fact these comments are above my modification in
+our sendmail.cf).
+#
+# MLI. Any drop host gets passed to the drop script
+#
+# The first rule looks up the domain in the multidrop table.
+# The input at this point is always:
+# user@<dom.ain.>
+# If found, the resulting line looks like this:
+# <MULTIDROP> mailbox <?> user@<dom.ain.>
+# if not found, the resulting line will be:
+# <MULTIDROP> <NO> <?> user@<dom.ain.>
+# The second line restores the "not found" case back to user@<dom.ain.>
+# So if this domain was found in the multidroptable, we still have a line
+starting with <MULTIDROP>
+# as shown above. The third line hands this to the drop script.
+#
+# Note that the user ($:) is the mailbox this message should be stuffed in,
+the host ($@) is the full
+# user@<dom.ain>. This is how the dropscript expects it.
+#
+
+I guess sendmail guru's are now laughing their pants off, and I hope someone
+will show me a better way to achieve this. For now, it works.
+
+Next, we need to define mailer drop (somewhere in the sendmail.cf)
+
+#
+# multidrop pop3 support.
+#
+
+Mdrop, P=/usr/local/bin/dropmail, F=lFS,
+ T=X-Unix,
+ A=dropmail $u $h
+
+The S flag here is crucial, otherwise the dropmail script won't run as root,
+and under linux (==bash) suid scripts are not permited. I gather most unices
+now disalow suid scripts, so this would be necessary on most unices. There
+probably are other flags that would make this better, but this works, so I
+decided to divert my attention to other tasks at hand (busy, busy, busy....
+;^>).
+
+Now we only need the dropmail script, /usr/local/bin/dropmail, mode 700. It
+looks big, but effectively one pipeline does the real work. The rest is
+configuration, error checking and locking the mailbox.
+
+#!/bin/bash
+
+#
+# Script to force a mail message in a format that fetchmail will recognise.
+# use as a MDA from sendmail. Must be executed with F=S.
+#
+
+#
+# Configuration:
+#
+maildir=/var/spool/mail
+envelope=Delivered-To:
+
+#
+# set PATH to a known value to avoid some security issues
+#
+export PATH=/bin:/usr/bin
+
+#
+#
+#
+to=$2
+user=$1
+mbox=$maildir/$user
+
+#
+# If the mailbox does not exist, create it. Note that we act pretty
+paranoid, this is hopefully
+# resistant to symlink attacks
+#
+if [ ! -f $mbox ]
+then
+ oldumask=`umask`
+ umask 077
+ touch $mbox
+ chmod 660 $mbox || exit 1
+ chown $user $mbox || exit 1
+ chgrp mail $mbox || exit 1
+ umask $oldumask
+fi
+
+# First lock the mailbox, if this doesn't succeed in 64 seconds, give up and
+send
+# mail to postmaster.
+# If this period is to short, increase the retries (-r flag to lockfile)
+#
+# Then run the message through formail to get it into the right mailbox
+format with the
+# right headers added.
+#
+# Delivered-To will make fetchmail propagate this mail to the correct user
+when
+# run with '-E "Delivered-To"'. Set this in the advanced settings of the
+TeamInternet f.i.
+# (if you changed the envelope at the start of this script, adapt this
+accordingly)
+#
+# We also muck up the messageid, so fetchmail will never skip a message on
+the basis of
+# duplicate messageIDs. The -i "Message-ID" will rename the old message ID,
+the -a will
+# add a new one.
+#
+# Lastly, we add a header indicating which host did the rewriting.
+#
+
+if lockfile -r 8 $mbox.lock >/dev/null 2>&1
+then
+ cat - | formail -i "$envelope <$to>" -i "Message-ID:" -a
+"Message-ID:" -i "X-Multidrop-Processing: <`hostname`>" >>$mbox
+ rm -f $mbox.lock
+else
+ (echo "Subject: Cannot lock mailbox for $user" & cat -) |
+/usr/lib/sendmail postmaster
+fi
+
+#
+# EOF
+#
+
+This obviously is very Linux (even RedHat?) dependant, locking mailboxes,
+creating mailboxes with the right permissions, probably even bash dependent.
+I would say that it should be fairly easy to port to other systems, but
+alas, my unix knowledge is lacking for that. I'll also rewrite it someday,
+a.o. that umask handling can be done much better and the location of the
+sendmail binairy should not be fixed.
+
+Now the only thing left to do is to retrieve the mail with fetchmail, using
+'envelope "Delivered-To:"' in the poll line. The above script has added this
+line, so this is all that fetchmail needs.
+
+All parts of this solution need carefull examination. In particular I think
+the new rule lines may not catch all cases, although they worked for
+everything I threw at them and work satisfactorily in production. I'm also
+wondering if there is a more standard way to drop something in a mailbox. I
+yet have to investigate procmail, but all other MDA's mucked with the
+message and effectively undid my carefully added header. I'll experiment
+some more and rethink it all as I learn more.
+
+I'm still wondering, if I can get formail to include another received
+line.... "Received from localhost by dropmail for <user>...." to make it
+work without the envelope flag. Well I'll have to experiment. Do you know if
+there is a header I can add so fetchmail works out-of-the-box?
+
+Regards,
+Martijn Lievaart
+
diff --git a/contrib/novell b/contrib/novell
new file mode 100644
index 00000000..1e549aed
--- /dev/null
+++ b/contrib/novell
@@ -0,0 +1,57 @@
+From newcombe@mordor.clayton.edu Thu Jun 12 15:56:44 1997
+Return-Path: <newcombe@mordor.clayton.edu>
+Received: from imap.ccil.org (snark [10.0.2.15])
+ by snark.thyrsus.com (8.8.5/8.8.5) with ESMTP id PAA11433
+ for <esr>; Thu, 12 Jun 1997 15:56:43 -0400
+Received: from thrush.clayton.edu (thrush.clayton.edu [168.28.242.117])
+ by locke.ccil.org (8.8.5/8.8.5) with ESMTP id LAA17702
+ for <esr@snark.thyrsus.com>; Thu, 12 Jun 1997 11:29:02 -0400 (EDT)
+Received: from mordor.clayton.edu (root@mordor.clayton.edu [168.28.241.16]) by thrush.clayton.edu (8.8.5/8.7.6) with SMTP id LAA22880 for <esr@snark.thyrsus.com>; Thu, 12 Jun 1997 11:11:51 -0400 (EDT)
+Date: Thu, 12 Jun 1997 11:28:05 -0400 (EDT)
+From: Dan Newcombe <newcombe@mordor.clayton.edu>
+X-Sender: root@mordor.clayton.edu
+Reply-To: newcombe@mordor.clayton.edu
+To: esr@snark.thyrsus.com
+Subject: Novell Procmail recipie/problem
+Message-ID: <Pine.LNX.3.96.970612112225.14988A-100000@mordor.clayton.edu>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+Status: RO
+
+Eric,
+
+ As per your request, here is my recipie for dealing with e-mail popped
+off of a Novell server and told to be domanified.
+And example of the problem I used to have when I popped mail off of
+aa.clayton.edu From: User <AA/USER@aa.clayton.edu>
+Sendmail did not like that. Now it converts the above to
+From: User <USER@AA.clayton.edu>
+
+However, the To: and CC: lines still can get messed up
+To: aa/user2,@aa.clayton.edu aa/newcombe
+
+I'm not going to worry about that!!!
+
+I fixed it with this recipie in my .procmailrc
+:0
+* ^From:.*<.*/.*@
+{
+:0 fhw
+|sed -e 's/^From:\(.*\)<\(.*\)\/\(.*\)@.*/From:\1<\3@\2.clayton.edu>/'
+}
+
+It may not be the best, prettiest, or most efficient, but it works.
+
+Also, you'd asked me to send you the sometimes error message I get
+from fetchmail. I don't see one in my Mail/From file, so it must not
+have happened for a while. It looked something like
+Subject: Cron <root@mordor> /usr/local/bin/fetchmail: 29483
+
+Hope your flight back was good.
+ -Dan
+
+--
+Dan Newcombe newcombe@mordor.clayton.edu
+"The fool who escaped from paradise will look over his shoulders and cry...So
+I'll hold my peace forever when you wear your bridal gown." -Marillion
+
diff --git a/contrib/poptest b/contrib/poptest
new file mode 100644
index 00000000..3f74cffa
--- /dev/null
+++ b/contrib/poptest
@@ -0,0 +1,84 @@
+#!/usr/bin/perl
+# Copyright 2000 john Summerfield ,summer@os2.ami.com.au>
+# Your choice of licence: GPL 2 or later, or same licence as Perl.
+#
+# Warranty? None
+# If it breaks? The pieces are yours
+# If it breaks something? You drove it.
+# Bugs? At least one.
+
+# now we've cleared the air;
+# This supposed to allow one to talk pop-3 to a mail server. If you're lucky (and know how)
+# you might also be able to talk a few other Internet protocols with it.
+# Typically, it's run thus:
+# pop2test.1 <mailserver> [<mailport>]
+# mailport's optional; default is 110 (pop-3).
+#
+# Having started, you type away much as you would with telnet.
+#
+#
+#
+# It has this great advantage over telnet: it reads its input from stdin and writes to stdout;
+# you can prepare the entire sequence in a file, then run it this:
+# pop2test.1 <thefileyoujustcreated >theresultsyouwanttoperuse host port
+#
+#
+# uses:
+# 1 Debugging POP3 (and maybe imap does anyone know?) mail problems
+# 2 Deleting the occasional piece of mail that's too big or stuffs fetchmail.
+# 3 Talking to sendmail
+#
+use Socket;
+sub hx;
+sub getreply;
+$timeout=1;
+$RemoteHost = $ARGV[0];shift;
+$RemotePort = $ARGV[0] || 110;shift;
+($PRname,$PRaliases,$PRport,$PRproto) = getservbyname($RemotePort,'tcp');
+$PRport=$RemotePort unless $PRport;
+$proto=getprotobyname($PRproto);
+$RemoteIP = inet_aton $RemoteHost or die "Can't resolve $RemoteHost";
+$that = pack 'Sna4x8',AF_INET, $PRport, $RemoteIP;
+socket(REMOTESITE,AF_INET,SOCK_STREAM,$proto)
+ or die "Can't create socket to $RemoteHost: $!\n";;
+connect(REMOTESITE, $that) or die "Can't connect: $!\n";
+select(REMOTESITE);$|=1;select STDOUT;
+$rin = $win = $ein = '';
+vec($rin,fileno(REMOTESITE),1) = 1;
+#vec($win,fileno(REMOTESITE),1) = 1;
+$ein = $rin | $win;
+getreply;
+while ($L=<STDIN>)
+{
+ chomp $L;
+ print REMOTESITE $L . "\r\n";
+ print "send: " . $L . "\n";
+ getreply;
+}
+print REMOTESITE "Quit\r\n";
+getreply;
+#print <REMOTESITE>;
+close REMOTESITE;
+exit;
+# P
+sub hx
+{
+ $N=$_[0];shift;
+ $S=$_[0];shift;
+ return "$N(" . unpack("h", $S) . ") ";
+}
+sub getreply
+{
+ while ('x')
+ {
+ ($nfound,$timeleft) = select($rout=$rin, undef, $eout=$ein, $timeout);
+ last if $nfound == 0;
+# print "nf($nfound) tl($timeleft) " . hx("rin",$rin) . hx("rout", $rout) . hx("ein",$ein) . hx("eout",$eout) . "\n";
+ $Reply= <REMOTESITE>;
+ print "recv: " . $Reply;
+ last if $Reply eq '';
+ $Reply =~ s/[\r\n]*//;
+ last if $Reply eq '.';
+ }
+}
+
diff --git a/contrib/preauth-harness b/contrib/preauth-harness
new file mode 100755
index 00000000..0bd0d842
--- /dev/null
+++ b/contrib/preauth-harness
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+
+BEGIN { $SIG{'__WARN__'} = sub {};};
+
+$hostname = "criens.u-psud.fr";
+$username = "p99dreyf";
+$passwd = "xxxxxxxx";
+$command = "exec ~/bin/imapd";
+
+use Net::Telnet ();
+$host = new Net::Telnet (Timeout => 10,
+ Port => 23,
+ Prompt => '/p99dreyf>\s?$/',
+ Cmd_remove_mode => 1);
+
+$host->option_accept(Dont => &Net::Telnet::TELOPT_ECHO,
+ Wont => &Net::Telnet::TELOPT_ECHO);
+ open (FILE,">log");
+$host->dump_log("log2");
+$host->input_log("log3");
+## Issue some commands.
+$host->open($hostname);
+#$host->login($username, $passwd);
+$host->waitfor('/login:\s?$/');
+$host->print("$username");
+$host->waitfor('/Password:\s?$/');
+$host->print("$passwd");
+$host->waitfor('/p99dreyf>\s?$/');
+
+$host->print("$command");
+$strip=1;
+while ($strip) {
+ $greeting=$host->getline();
+ if ($greeting=~/^\* PREAUTH.*$/) { print "$greeting"; $strip=0;};
+}
+ do {
+ do {
+ $cmd=<STDIN>;
+ chop $cmd;
+ } while ($cmd !~/[A-Za-z0-9]/);
+ $host->print("$cmd");
+ print FILE ">>$cmd<<\n";
+ do {
+ $line=$host->getline();
+ chop($line);
+ print "$line\n";
+ print FILE "<<$line<<\n";
+ } while (($line!~/^[A-Za-z0-9]+ (OK|BAD|Expunge).*$/) &&
+ ($line!~/^\* BAD.*$/));
+ print FILE "--next cmd\n";
+ } while ($line!~/^[A-Za-z0-9]+ OK LOGOUT.*$/);
+
+exit;
diff --git a/contrib/redhat_rc b/contrib/redhat_rc
new file mode 100644
index 00000000..d94f95c8
--- /dev/null
+++ b/contrib/redhat_rc
@@ -0,0 +1,60 @@
+#!/bin/sh
+#
+# fetchmail This shell script takes care of starting and stopping
+# fetchmail.
+#
+# chkconfig: 2345 81 45
+# description: The Fetchmail daemons allows to retrieve mail using various
+# mail protocols and route them to the local MTA just as if
+# the mail was sent directly to the local MTA. This is
+# specially useful on intermittent dial-up connections.
+# processname: fetchmail
+# config: /etc/fetchmailrc
+# author[s]:
+# Andrea Sterbini <a.sterbini@itelcad.it>
+# ObiTuarY <obituary@freshmeat.net>
+
+. /etc/rc.d/init.d/functions
+
+# Source networking configuration.
+. /etc/sysconfig/network
+
+# Check that networking is up.
+if [ ${NETWORKING} = "no" ]
+then
+ exit 0
+fi
+
+# See how we were called.
+case "$1" in
+ start)
+ if [ -s /etc/fetchmailrc ]; then
+ echo -n "Loading fetchmail: "
+ daemon /usr/bin/fetchmail -f /etc/fetchmailrc
+ echo
+ touch /var/lock/subsys/fetchmail
+ else
+ exit 1
+ fi
+ ;;
+ stop)
+ echo -n "Shutting down fetchmail: "
+ /usr/bin/fetchmail -q >/dev/null 2>&1 && echo fetchmail
+# killproc fetchmail
+ rm -f /var/lock/subsys/fetchmail
+ ;;
+ status)
+ status fetchmail
+ ;;
+ restart|reload)
+ $0 stop
+ $0 start
+ ;;
+ *)
+ echo "Usage: fetchmail {start|stop|status|restart|reload}"
+ exit 1
+esac
+
+exit 0
+
+# === End of File ===
diff --git a/contrib/runfetchmail b/contrib/runfetchmail
new file mode 100644
index 00000000..2b40f511
--- /dev/null
+++ b/contrib/runfetchmail
@@ -0,0 +1,182 @@
+#!/bin/sh
+# Runfetchmail 1.1
+#
+# Copyright (c) 1997 Doug Muth, Wescosville, Pennsylvania USA
+# All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# Please send bug reports, suggestions, and flames to: dmuth@ot.com
+#
+# This shell script is used as a "frontend" for running fetchmail. It will
+# start up fetchmail and save the session to disk, generate statistics
+# of the e-mail that you downloaded, and tell you how many messages
+# you have in various folders. A copy of these results are also
+# e-mailed to you.
+#
+# An rc file is also supported. If the file $HOME/.runfetchmailrc
+# exists, it will be sourced. This way, you can place runfetchmail
+# into /usr/local/bin, and individual users can have their own settings.
+#
+# Pre-requisites: You must have procmail, or at least `mailstat', a
+# utility that comes with procmail, running on your system. You must
+# also have `timer', a shell script written by me, if you would like the
+# total time that the transfer took to be displayed.
+#
+# Syntax: runfetchmail [-every]
+# -every Downloads all messages from the mailserver, regardless of
+# their size and whether they have been previously downloaded.
+#
+# Changes in version 1.1: The argument "-every" is supported. I removed the
+# $EXIT_CODE variable since I had problems assigning the exit code from
+# fetchmail to it.
+
+# Command line to run fetchmail
+FETCHMAIL="/usr/local/bin/fetchmail"
+
+# Your procmail logfile
+LOG=$HOME/procmail/log
+
+# Do we want to use timer? Set to 0 to disable.
+TIMER=1
+
+# Our path to sendmail with parameters
+SENDMAIL="/usr/bin/sendmail -oi -t"
+
+# Who am I?
+SELF="dmuth@ot.com"
+
+# The folders that I should check for the number of messages
+FOLDERS="$MAIL $HOME/mail/lists"
+
+# Number of seconds to "sleep" for while procmail finishes up, increase
+# this if you have a really slow system
+LATENT=10
+
+# Do we want to use mailstat? Set to 0 to disable
+MAILSTAT=1
+
+# Do we want to e-mail the output to myself? Set to 0 to disable.
+# I strongly suggest doing this so that if you lose your connection to
+# the net part of the way through a download, you can see how much
+# progess was made
+E_MAIL=1
+
+###
+# End of user defined variables
+###
+
+# The temp file, and ensure my privacy!
+TMP=/tmp/fetchmail.sh.$$
+
+# The version of this program
+VERSION="Runfetchmail 1.1"
+
+# Trap errors
+trap "rm -f $TMP; echo ""Exiting at user request"" ; \
+test $TIMER -eq 1 &amp;&amp; timer -stop -id $$ &gt;/dev/null; exit 1" \
+2 3 4 15
+
+# Source the user's rc file if it exists
+test -e $HOME/.runfetchmailrc &amp;&amp; . $HOME/.runfetchmailrc
+
+num_mail()
+{ # This procedure tells me how many messages there are in each folder
+for D in $*
+do
+ if test -f $D
+ then
+ echo "There are `frm $D |wc -l` messages in $D"
+ fi
+done
+}
+
+getmail()
+{ # Fetch the mail!
+
+test $TIMER -eq 1 &amp;&amp; timer -start -id $$ -quiet
+
+$FETCHMAIL $@
+
+# pause for a short while
+echo "Now sleeping for $LATENT seconds..."
+echo -n "Zzz...Zzz...Zzz..."
+sleep $LATENT
+echo "wakeup time! &lt;yawn&gt;"
+}
+
+stats()
+{ # Prepare the statistics
+
+# Ensure we have a log file
+test ! -e $LOG &amp;&amp; touch $LOG
+
+echo -e "\n\t\t\t $VERSION Statistics"
+test $MAILSTAT -eq 1 &amp;&amp; mailstat -k &lt;$LOG
+echo ""
+num_mail $FOLDERS
+test $TIMER -eq 1 &amp;&amp; echo -e "\n`timer -stop -id $$ -quiet` have elapsed."
+}
+
+prepmail()
+{ # Let's prepare our e-mail
+cat &lt;&lt;EOF &gt;$TMP
+From: $LOGNAME ($VERSION)
+To: $LOGNAME
+X-Loop: $SELF
+Subject: Mail stats from `date "+%D %X"`
+
+EOF
+}
+
+### Main Program
+
+# Let's have some initial cleanup
+rm -f $LOG
+clear
+
+# Create and secure the temporary file
+test $E_MAIL -eq 1 &amp;&amp; { cat /dev/null &gt;$TMP; chmod 600 $TMP }
+
+# Prepare the e-mail before the logs are added to it
+test $E_MAIL -eq 1 &amp;&amp; prepmail
+
+# See if we are downloading every message or not
+if test "$1" = "-every"
+then
+ FETCHMAIL="$FETCHMAIL -a -l 0"
+ shift
+fi
+
+# Fetch the mail and have the output written to stdout and (optionally) $TMP
+test $E_MAIL -eq 1 &amp;&amp; getmail $@ 2&gt;&amp;1 |tee -a $TMP || getmail $@
+
+clear
+
+# Do the same thing with the statistics
+test $E_MAIL -eq 1 &amp;&amp; stats $@ 2&gt;&amp;1 |tee -a $TMP || stats $@
+
+# Now send $TMP to myself and clean up the mess
+test $E_MAIL -eq 1 &amp;&amp; { cat $TMP |$SENDMAIL; rm -f $TMP }
+
+# cleanup the log file for next time
+rm -f $LOG
+
+# The End
+
diff --git a/contrib/sm-hybrid b/contrib/sm-hybrid
new file mode 100644
index 00000000..ceecfeee
--- /dev/null
+++ b/contrib/sm-hybrid
@@ -0,0 +1,539 @@
+From: Peter 'Rattacresh' Backes <rtc@helen.PLASMA.Xg8.DE>
+Subject: Sendmail-8.11.0+hybrid
+
+Hello,
+
+This is the hybrid patch against sendmail-8.11.0. To make the binary
+RPMs, type:
+
+cd /usr/src
+tar xzvf /path/to/sendmail+hybrid.tgz
+cd redhat/SOURCES
+wget ftp://your.favourite.mirror/path/to/sendmail.8.11.0.tar.gz
+cd ../SPECS
+rpm -bb sendmail.spec
+
+This patch includes MySQL support so you need the libraries to
+compile. If you don't have them you need to change two lines in
+sendmail.spec before running rpm:
+
+ Change
+Patch8: sendmail-8.11.0-mysqlmap.patch
+ to
+#Patch8: sendmail-8.11.0-mysqlmap.patch
+ and
+%patch8 -p1 -b .mysqlmap
+ to
+#%patch8 -p1 -b .mysqlmap
+
+----------------------------------------------------------------
+begin 644 sendmail+hybrid.tgz
+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
+$`.`!````
+`
+end
diff --git a/contrib/start_dynamic_ppp b/contrib/start_dynamic_ppp
new file mode 100644
index 00000000..7ceeddb3
--- /dev/null
+++ b/contrib/start_dynamic_ppp
@@ -0,0 +1,16 @@
+#!/bin/sh
+# setup hostname in /etc/hosts. use IP if no name available.
+echo cyberhq > /tmp/local_name
+echo $4 > /tmp/ip
+host $4 | fgrep Name | cut -c7- > /tmp/ip_name
+if [ ! -s /tmp/ip_name ]; then
+ echo $4 > /tmp/ip_name
+fi
+cat /tmp/ip_name > /etc/sendmail.cw
+paste /tmp/ip /tmp/ip_name /tmp/local_name > /tmp/host_bottom
+cat /etc/hosts.top /tmp/host_bottom > /etc/hosts
+rm /tmp/ip /tmp/ip_name /tmp/host_bottom /tmp/local_name
+# Restart sendmail with new name.
+kill -HUP `head -1 /var/run/sendmail.pid`
+# Start fetchmail as root to fetch our mail.
+fetchmail
diff --git a/contrib/toprocmail b/contrib/toprocmail
new file mode 100644
index 00000000..159c0b38
--- /dev/null
+++ b/contrib/toprocmail
@@ -0,0 +1,46 @@
+#!/usr/bin/perl
+
+# fetchmail -> procmail pretti-fier proxy thingamajig
+# ver. 2000-04-01
+#
+# John Lim Eng Hooi <jleh@mail.com>
+#
+
+# Where's procmail located?
+$proc_path = '/usr/bin/procmail';
+
+# Define your ANSI color codes here, I've only bothered to define
+# those I use :)
+$ANSI_green = "\e[0;32m";
+$ANSI_b_white = "\e[1;37m";
+$ANSI_normal = "\e[0;39m";
+
+# Open up procmail
+open (PROCPIPE, "|$proc_path") || die "Can't open procmail pipe!";
+
+# Analyze the message line by line
+while (<STDIN>) {
+
+ # Suck up the lines we want, in this case I just want From: and Subject:
+ if (/^From:/) {
+ $from = $_;
+ }
+
+ if (/^Subject:/) {
+ $subj = $_;
+ }
+
+ # Stuff it out to the pipe too
+ print PROCPIPE;
+}
+
+# Print it out
+print "\n";
+print $ANSI_green, " ", $from;
+print $ANSI_b_white, " ", $subj, $ANSI_normal;
+
+# fetchmail's status is appended after this
+print " -->";
+
+# We're done
+close (PROCPIPE);
diff --git a/contrib/zsh-completion b/contrib/zsh-completion
new file mode 100644
index 00000000..c5e653f4
--- /dev/null
+++ b/contrib/zsh-completion
@@ -0,0 +1,20 @@
+# Set up command completion for zsh
+#
+fetchmailauthtypes=(password kerberos kerberos_v5)
+fetchmailprotocols=(auto pop2 pop3 apop rpop kpop sdps imap imap-k4 imap-gss etrn)
+function fetchmailformattedinterfaces ()
+{ reply=(`ifconfig|perl -e '$/="";while(<>){s/[\r\n]//g;if(/^(\w+\d*).*inet addr:([\d\.]+)/){print "$1/$2\n";}}'`) }
+function fetchmailcompctl ()
+{ reply=(`awk '{ print $2 }' < ~/.fetchmailrc` `fetchmail --help 2>&1| cut -c 7-19 | sed "s/,//g"`) }
+compctl -K fetchmailcompctl \
+ -x "C[-1,-L|--logfile]" -f \
+ - "C[-1,-f|--fetchmailrc]" -f \
+ - "C[-1,-i|--idfile]" -f \
+ - "C[-1,-I|--interface]" -K fetchmailformattedinterfaces \
+ - "C[-1,-M|--monitor]" -K fetchmailformattedinterfaces \
+ - "C[-1,-p|--protocol]" -k fetchmailprotocols \
+ - "C[-1,-A|--auth]" -k fetchmailauthtypes \
+ - "c[-1,--plugin]" -m \
+ - "c[-1,--plugout]" -m \
+ -- fetchmail
+