aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/domino
blob: a5802718a118b3c7dbcf3898fe7d5fd454d4f737 (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
#!/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
dir)/getopt1.c $(srcdir)/alloca.c # QNX EXTRAOBJ = @EXTRAOBJ@ # EXTRAOBJS = strcasecmp.o getopt.o getopt1.o alloca.o # Common prefix for machine-independent installed files. prefix = @prefix@ # Common prefix for machine-dependent installed files. exec_prefix = @exec_prefix@ # Name under which to install fetchmail instname = fetchmail # Directory in which to install. bindir = @bindir@ # Directory to install the Info files in. infodir = @infodir@ # Number to put on the man page filename. manext = 1 # Directory to install the man page in. mandir = @mandir@/man$(manext) # Program to install `make'. INSTALL_PROGRAM = @INSTALL_PROGRAM@ -s # Program to install the man page. INSTALL_DATA = @INSTALL_DATA@ # Generic install program. INSTALL = @INSTALL@ # Program to format Texinfo source into Info files. MAKEINFO = makeinfo # Program to format Texinfo source into DVI files. TEXI2DVI = texi2dvi # Programs to make tags files. ETAGS = etags -tw CTAGS = ctags -tw protobjs = socket.o getpass.o pop2.o pop3.o imap.o etrn.o fetchmail.o \ options.o rcfile_l.o rcfile_y.o daemon.o smtp.o driver.o rfc822.o \ xmalloc.o uid.o mxget.o md5c.o md5ify.o interface.o netrc.o error.o objs = $(protobjs) $(extras) $(EXTRAOBJ) srcs = $(srcdir)/socket.c $(srcdir)/getpass.c $(srcdir)/pop2.c \ $(srcdir)/pop3.c $(srcdir)/imap.c $(srcdir)/etrn.c \ $(srcdir)/fetchmail.c $(srcdir)/options.c $(srcdir)/daemon.c \ $(srcdir)/driver.c $(srcdir)/rfc822.c $(srcdir)/smtp.c \ $(srcdir)/xmalloc.c $(srcdir)/uid.c $(srcdir)/mxget.c \ $(srcdir)/md5c.c $(srcdir)/md5ify.c $(srcdir)/interface.c \ $(srcdir)/netrc.c $(srcdir)/error.c .SUFFIXES: .SUFFIXES: .o .c .h .y .l .ps .dvi .info .texi all: fetchmail # Some makes apparently use .PHONY as the default goal if it is before `all'. .PHONY: all check $(protobjs): fetchmail.h fetchmail: $(srcdir)/rcfile_l.c $(srcdir)/rcfile_y.c $(objs) $(CC) $(LDFLAGS) $(objs) $(LOADLIBS) -o fetchmail # Tester for address parsing rfc822: rfc822.c gcc -DTESTMAIN -g rfc822.c -o rfc822 # -I. is needed to find config.h in the build directory. .c.o: $(CC) $(defines) -c -I. -I$(srcdir) $(CFLAGS) $< $(OUTPUT_OPTION) # lex rule .l.o: .l.c: $(LEX) $(LEXFLAGS) $< mv lex.yy.c $@ # yacc rule .y.o: .y.c: $(YACC) $(YACCFLAGS) $< mv y.tab.c $@ mv -f y.tab.h $*.h # For some losing Unix makes. SHELL = /bin/sh MAKE = make FORCE: tagsrcs = $(srcs) $(srcdir)/rcfile_l.c $(srcdir)/rcfile_y.c TAGS: $(tagsrcs) $(ETAGS) $(tagsrcs) tags: $(tagsrcs) $(CTAGS) $(tagsrcs) .PHONY: install installdirs install: installdirs $(bindir)/$(instname) $(mandir)/$(instname).$(manext) installdirs: $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(mandir) $(bindir)/$(instname): fetchmail $(INSTALL_PROGRAM) fetchmail $@ $(mandir)/$(instname).$(manext): fetchmail.man $(INSTALL_DATA) $(srcdir)/fetchmail.man $@ .PHONY: clean realclean distclean mostlyclean clean: -rm -f fetchmail *.o core fetchmail.dvi \ rcfile_l.c rcfile_y.h rcfile_y.c \ fetchmail.tar fetchmail.tar.gz \ rfc822 distclean: clean -rm -f Makefile config.h -rm -f config.cache config.status config.log stamp-config -rm -f TAGS tags -rm -f fetchmail.log fetchmail.toc fetchmail.*aux realclean: distclean # fetchmail.info* mostlyclean: clean Makefile: config.status $(srcdir)/Makefile.in $(SHELL) config.status @echo "You can ignore any makedepend error messages" -makedepend -I. -fMakefile *.c config.h: stamp-config stamp-config: config.status $(srcdir)/config.h.in $(SHELL) config.status touch stamp-config configure: configure.in autoconf $(ACFLAGS) config.h.in: acconfig.h autoheader $(ACFLAGS) # This tells versions [3.59,3.63) of GNU make not to export all variables. .NOEXPORT: # Special dependencies, not easily handled without explicit rules $(srcdir)/rcfile_l.c: $(srcdir)/rcfile_l.l $(srcdir)/rcfile_y.c: $(srcdir)/rcfile_y.y parser = $(srcdir)/rcfile_l.l $(srcdir)/rcfile_y.y headers = $(srcdir)/fetchmail.h $(srcdir)/socket.h $(srcdir)/smtp.h \ $(srcdir)/mx.h $(srcdir)/md5.h $(srcdir)/md5global.h \ $(srcdir)/netrc.h $(srcdir)/tunable.h extra = $(srcdir)/alloca.c $(srcdir)/getopt.[ch] $(srcdir)/getopt1.c \ $(srcdir)/strcasecmp.c docs = $(srcdir)/COPYING $(srcdir)/README $(srcdir)/INSTALL $(srcdir)/NEWS \ $(srcdir)/NOTES $(srcdir)/fetchmail.lsm \ $(srcdir)/*.man $(srcdir)/sample.rcfile $(srcdir)/FAQ config = $(srcdir)/Makefile.in $(srcdir)/configure.in $(srcdir)/configure \ $(srcdir)/config.guess $(srcdir)/config.h.in $(srcdir)/config.sub \ $(srcdir)/acconfig.h scripts = $(srcdir)/install.sh $(srcdir)/mkinstalldirs $(srcdir)/specgen.sh all = $(docs) $(config) $(srcs) $(parser) $(headers) $(extra) $(scripts) \ $(srcdir)/MANIFEST MANIFEST: $(srcdir) @echo $(all) | tr "[ \t]" '\n' | sort | sed "s/\\./fetchmail-$(VERS)/" >MANIFEST dist: fetchmail-$(VERS).tar.gz ls -l fetchmail-$(VERS).tar.gz fetchmail-$(VERS).tar: $(all) (cd ..; tar -cf fetchmail-$(VERS).tar `cat fetchmail-$(VERS)/MANIFEST`) mv ../fetchmail-$(VERS).tar fetchmail-$(VERS).tar fetchmail-$(VERS).tar.gz: fetchmail-$(VERS).tar gzip -f fetchmail-$(VERS).tar RPMROOT=/usr/src/redhat RPMFLAGS = -ba rpm: fetchmail-$(VERS).tar.gz cp fetchmail-$(VERS).tar.gz $(RPMROOT)/SOURCES; $(srcdir)/specgen.sh $(VERS) $(PL) >$(RPMROOT)/SPECS/fetchmail.spec cd $(RPMROOT)/SPECS; rpm $(RPMFLAGS) fetchmail.spec # The automatically generated dependencies below may omit config.h # because it is included with ``#include <config.h>'' rather than # ``#include "config.h"''. So we add the explicit dependency to make sure. $(objs): config.h # Automatically generated dependencies will be put at the end of the makefile. # DO NOT DELETE THIS LINE -- make depend depends on it.