aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/README
blob: 7c6e6e8f859c0d88369c5c8c4c3634aba0fa317c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
These are scripts or configuration snippets to help you running
fetchmail in special situations.

Note: you're on your own using these -- the fetchmail team undertakes no
efforts in understanding them, they are just passing them along.
								--esr, ma

This file is currently unsorted. Use your pager's search function when
looking for the description of a particular file in this directory.  --ma

### 0*.html:
Messages from the archives of the old fetchmail-friends mailing list,
for off-line reading.

### 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.

Matthias Andree adds: note that current Debian packages (as of January
2007) ship with their own init files.

### 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.

### PopDel.py

PopDel stands for Pop Delete; this program deletes selected email from a
pop mail server. (By Richard Harris, improved by Joshua Crawford.)

### fetchmail.logrotate (added 2007-01-14, --ma)

A logrotate configuration file developped by Daniel Leidert for Debian,
when he wanted to use /var/log/fetchmail instead of the usual syslog.
It probably needs to be adjusted for use on other systems.

### delete-later (added 2007-03-17, --ma)

A MySQL/Tcl/Expect-based client-side script to remove messages at a
certain age.  See delete-later.README for details.
(By Carsten Ralle, Yoo GmbH, Germany.)
>*bytes) /* send ODMR and then run a reverse SMTP session */ { int ok, opts, smtp_sock; int doing_smtp_data = 0; /* Are we in SMTP DATA state? */ char buf [MSGBUFSIZE+1]; struct idlist *qnp; /* pointer to Q names */ (void)id; if ((ok = SMTP_ehlo(sock, SMTP_MODE, fetchmailhost, ctl->server.esmtp_name, ctl->server.esmtp_password, &opts))) { report(stderr, GT_("%s's SMTP listener does not support ESMTP\n"), ctl->server.pollname); return(ok); } else if (!(opts & ESMTP_ATRN)) { report(stderr, GT_("%s's SMTP listener does not support ATRN\n"), ctl->server.pollname); return(PS_PROTOCOL); } /* make sure we don't enter the fetch loop */ *bytes = *countp = *newp = -1; /* authenticate via CRAM-MD5 */ ok = do_cram_md5(sock, "AUTH", ctl, "334 "); if (ok) return(ok); /* * By default, the hostlist has a single entry, the fetchmail host's * canonical DNS name. */ buf[0] = '\0'; for (qnp = ctl->domainlist; qnp; qnp = qnp->next) if (strlen(buf) + strlen(qnp->id) + 1 >= sizeof(buf)) break; else { strcat(buf, qnp->id); strcat(buf, ","); } buf[strlen(buf) - 1] = '\0'; /* nuke final comma */ /* ship the domain list and get turnaround */ gen_send(sock, "ATRN %s", buf); if ((ok = gen_recv(sock, buf, sizeof(buf)))) return(ok); /* this switch includes all response codes described in RFC2645 */ switch(atoi(buf)) { case 250: /* OK, turnaround is about to happe */ if (outlevel > O_SILENT) report(stdout, GT_("Turnaround now...\n")); break; case 450: /* ATRN request refused */ if (outlevel > O_SILENT) report(stdout, GT_("ATRN request refused.\n")); return(PS_PROTOCOL); case 451: /* Unable to process ATRN request now */ report(stderr, GT_("Unable to process ATRN request now\n")); return(PS_EXCLUDE); case 453: /* You have no mail */ if (outlevel > O_SILENT) report(stderr, GT_("You have no mail.\n")); return(PS_NOMAIL); case 502: /* Command not implemented */ report(stderr, GT_("Command not implemented\n")); return(PS_PROTOCOL); case 530: /* Authentication required */ report(stderr, GT_("Authentication required.\n")); return(PS_AUTHFAIL); default: { char *t = sdump(buf, strlen(buf)); report(stderr, GT_("Unknown ODMR error \"%s\"\n"), t); xfree(t); return(PS_PROTOCOL); } } /* * OK, if we got here it's time to become a pipe between the ODMR * remote server (sending) and the SMTP listener we've designated * (receiving). We're not going to try to be a protocol machine; * instead, we'll use select(2) to watch the read sides of both * sockets and just throw their data at each other. */ if ((smtp_sock = smtp_setup(ctl)) == -1) return(PS_SOCKET); else { int maxfd = (sock > smtp_sock) ? sock : smtp_sock; for (;;) { fd_set readfds; struct timeval timeout; FD_ZERO(&readfds); FD_SET(sock, &readfds); FD_SET(smtp_sock, &readfds); timeout.tv_sec = ctl->server.timeout; timeout.tv_usec = 0; if (select(maxfd+1, &readfds, NULL, NULL, &timeout) == -1) return(PS_PROTOCOL); /* timeout */ if (FD_ISSET(sock, &readfds)) { int n = SockRead(sock, buf, sizeof(buf)); if (n <= 0) break; SockWrite(smtp_sock, buf, n); if (outlevel >= O_MONITOR && !doing_smtp_data) report(stdout, "ODMR< %s", buf); } if (FD_ISSET(smtp_sock, &readfds)) { int n = SockRead(smtp_sock, buf, sizeof(buf)); if (n <= 0) break; SockWrite(sock, buf, n); if (outlevel >= O_MONITOR) report(stdout, "ODMR> %s", buf); /* We are about to receive message data if the local MTA * sends 354 (after receiving DATA) */ if (!doing_smtp_data && !strncmp(buf, "354", 3)) { doing_smtp_data = 1; if (outlevel > O_SILENT) report(stdout, GT_("receiving message data\n")); } else if (doing_smtp_data) doing_smtp_data = 0; } } SockClose(smtp_sock); } return(0); } static int odmr_logout(int sock, struct query *ctl) /* send logout command */ { /* if we have a smtp_socket, then we've turned around and the local smtp server is in control of the connection (so we don't send QUIT) */ if (ctl->smtp_socket == -1) return(gen_transact(sock, "QUIT")); else return(PS_SUCCESS); } static const struct method odmr = { "ODMR", /* ODMR protocol */ "odmr", /* standard ODMR port */ "odmrs", /* ssl ODMR port */ FALSE, /* this is not a tagged protocol */ FALSE, /* this does not use a message delimiter */ odmr_ok, /* parse command response */ NULL, /* no need to get authentication */ odmr_getrange, /* initialize message sending */ NULL, /* we cannot get a list of sizes */ NULL, /* we cannot get a list of sizes of subsets */ NULL, /* how do we tell a message is old? */ NULL, /* no way to fetch headers */ NULL, /* no way to fetch body */ NULL, /* no message trailer */ NULL, /* how to delete a message */ NULL, /* how to mark a message as seen */ NULL, /* no mailbox support */ odmr_logout, /* log out, we're done */ FALSE, /* no, we can't re-poll */ }; int doODMR (struct query *ctl) /* retrieve messages using ODMR */ { int status; if (ctl->keep) { fprintf(stderr, GT_("Option --keep is not supported with ODMR\n")); return(PS_SYNTAX); } if (ctl->flush) { fprintf(stderr, GT_("Option --flush is not supported with ODMR\n")); return(PS_SYNTAX); } if (ctl->mailboxes->id) { fprintf(stderr, GT_("Option --folder is not supported with ODMR\n")); return(PS_SYNTAX); } if (check_only) { fprintf(stderr, GT_("Option --check is not supported with ODMR\n")); return(PS_SYNTAX); } peek_capable = FALSE; status = do_protocol(ctl, &odmr); if (status == PS_NOMAIL) status = PS_SUCCESS; return(status); } #endif /* ODMR_ENABLE */ /* odmr.c ends here */