.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "deliver 1" .TH deliver 1 "2018-10-09" "Mail Avenger 0.8.5" "Mail Avenger 0.8.5" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" deliver \- deliver mail to a mailbox or maildir spool .SH "SYNOPSIS" .IX Header "SYNOPSIS" deliver [\-\-umask[=\fIval\fR]] \fIdestination1\fR [\fIdestination2\fR ...] .SH "DESCRIPTION" .IX Header "DESCRIPTION" Takes a mail message on standard input, and delivers it to one or more destination mailboxes. If a destination ends with a \f(CW\*(C`/\*(C'\fR character, it is interpreted as a qmail maildir format directory (which will be created if it doesn't already exist). Otherwise, if the destination does not end with a \f(CW\*(C`/\*(C'\fR character, it is interpreted as a Unix mbox format file. .PP If one of the mailboxes is specified as \fI\-\fR, deliver will send a copy of the message to its standard output after generating the appropriate \&\f(CW\*(C`From \*(C'\fR and \f(CW\*(C`Return\-Path:\*(C'\fR lines, if necessary. This is useful when piping messages to programs from \fBavenger.local\fR\|(8) scripts, as avenger.local does not generate any \f(CW\*(C`From \*(C'\fR or \&\f(CW\*(C`Return\-Path: \*(C'\fR lines, while deliver will generate these based on the \&\fB\s-1SENDER\s0\fR environment variable. .SS "\s-1OPTIONS\s0" .IX Subsection "OPTIONS" .IP "\fB\-\-copy\fR" 4 .IX Item "--copy" If deliver cannot seek on its standard input, it will first copy the message to a temporary file before attempting any deliveries. Usually this only occurs when deliver is being fed the output of another program through a pipe. The \fB\-\-copy\fR option forces copying regardless of whether deliver could rewind the file pointer. .IP "\fB\-\-fcntl\fR (\fB\-P\fR)" 4 .IX Item "--fcntl (-P)" This option enables fcntl (a.k.a. \s-1POSIX\s0) file locking of mail spools, in addition to flock and dotfile locking. The advantage of fcntl locking is that it may do the right thing over \s-1NFS.\s0 However, if either the \s-1NFS\s0 client or server does not properly support fcntl locking, or if the file system is not mounted with the appropriate options, fcntl locking can fail in one of several ways. It can allow different processes to lock the same file concurrently\*(--even on the same machine. It can simply hang when trying to acquire a lock, even if no other process holds a lock on the file. Also, on some OSes it can interact badly with flock locking, because those OSes actually implement flock in terms of fcntl. .IP "\fB\-\-norewind\fR" 4 .IX Item "--norewind" By default, if deliver can rewind its standard input, it will do so before reading the message. This lets scripts more easily run several commands over their standard input when that input is a file. For example, a shell script might do the following: .Sp .Vb 5 \& if test YES = "\`formail \-cxz X\-Spam\-Status:\`"; then \& deliver $HOME/Mail/spam/ \& else \& deliver $HOME/Mail/ham/ \& fi .Ve .Sp The \fB\-\-norewind\fR inhibits that behavior, so that the above script would likely give unintended results. \fB\-\-norewind\fR is useful for testing scripts that aren't supposed to assume they are getting input from a file. .IP "\fB\-\-umask\fR" 4 .IX Item "--umask" .PD 0 .IP "\fB\-\-umask=\fR\fIval\fR" 4 .IX Item "--umask=val" .PD By default, deliver creates all files and directories with a umask value of 077\-\-meaning files are not readable or writable by others. The \&\fB\-\-umask\fR option tells deliver to keep whatever umask it was invoked with. The \fB\-\-umask=\fR\fIval\fR option tells deliver to use a umask of \&\fIval\fR. Note that to specify \fIval\fR in octal, you must prefix it with a 0, so the default is equivalent to \fB\-\-umask=077\fR, but not \&\fB\-\-umask=77\fR. .SH "ENVIRONMENT" .IX Header "ENVIRONMENT" The following environment variable affects deliver's operation. .IP "\fB\s-1SENDER\s0\fR" 4 .IX Item "SENDER" Specifies the envelope sender (bounce address) of the message. For maildir format mailboxes, the sender will be included in a \&\f(CW\*(C`Return\-Path:\*(C'\fR header. For mbox format mailboxes, the sender is reflected in the first line, which will contain \f(CW\*(C`From SENDER ...\*(C'\fR. If \fB\s-1SENDER\s0\fR is unspecified, deliver will attempt to extract it from the first line of the message, if that line begins \f(CW\*(C`From \*(C'\fR or \&\f(CW\*(C`Return\-Path:\*(C'\fR. Otherwise, the sender will probably be incorrectly set. .SH "EXAMPLES" .IX Header "EXAMPLES" Using avenger.local, to set up an address as a spam trap that reports any messages it receives as spam, you might place the following in the appropriate \fI.avenger/local\fR file: .PP .Vb 1 \& | deliver \- | spamassassin \-r .Ve .PP If you want to reject spam messages during \s-1SMTP\s0 transactions using spamassassin, but still want to keep a copy of the spams in \&\fI\f(CI$HOME\fI/Mail/spam\-log\fR to keep an eye on how spamassassin is doing, you might place the line \f(CW\*(C`bodytest $HOME/.avenger/spam\-check\*(C'\fR, and write the \fIspam-check\fR shell script as follows: .PP .Vb 10 \& #!/bin/sh \& edinplace \-x 111 spamassassin \-e 100 \& case "$?" in \& 0) \& ;; \& 100) \& echo Sorry, spamassassin has flagged this message as spam \& deliver $HOME/Mail/spam\-log \& exit 100 \& ;; \& 111) \& echo Sorry, spamassassin has encountered a temporary error \& exit 111 \& ;; \& *) \& echo Sorry, spamassassin exited witn an unknown status \& exit 111 \& ;; \& esac .Ve .PP Note here that the bodytest script does not need to pipe the message through \f(CW\*(C`deliver \-\*(C'\fR before spamassassin, because bodytest's standard input does contain \f(CW\*(C`From \*(C'\fR and \f(CW\*(C`Return\-Path:\*(C'\fR lines, even though avenger.local command input does not. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBavenger\fR\|(1), \&\fBdotlock\fR\|(1), \&\fBmailexec\fR\|(1), \&\fBavenger.local\fR\|(8) .PP The Mail Avenger home page: . .SH "BUGS" .IX Header "BUGS" When delivering to multiple destinations, if one of them fails, deliver will halt with a non-zero exit status. However, it is not possible to know which destination caused the delivery failure. .PP To protect against concurrent accesses to mbox format files, deliver uses both \fIflock\fR and dotfiles to lock mailboxes. However, it does not use \fIfcntl\fR/\fIlockf\fR\-style locking by default. Thus, if your mail reader exclusively uses \fIfcntl\fR for locking, there will be race conditions unless you specify the \fB\-\-fcntl\fR option. .SH "AUTHOR" .IX Header "AUTHOR" David Mazie\*`res