'\" t
.\"
.\"
.\" Title: mailbot
.\" Author: Sam Varshavchik
.\" Generator: DocBook XSL Stylesheets v1.78.1
.\" Date: 06/20/2015
.\" Manual: Double Precision, Inc.
.\" Source: Courier Mail Server
.\" Language: English
.\"
.TH "MAILBOT" "1" "06/20/2015" "Courier Mail Server" "Double Precision, Inc\&."
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
mailbot \- A MIME\-aware autoresponder utility
.SH "SYNOPSIS"
.HP \w'\fBmailbot\fR\ 'u
\fBmailbot\fR [options] {\fIprogram\fR} [arg...]
.PP
In
\&.mailfilter:
.sp
.nf
if (/^Subject: *info/)
{
cc "| mailbot \-t /usr/share/autoresponse/info \-d autoresponsedb \e
\-A \*(AqFrom: info@domain\&.com\*(Aq /usr/bin/sendmail \-f \*(Aq\*(Aq"
}
.fi
.SH "DESCRIPTION"
.PP
\fBmailbot\fR
reads an E\-mail message on standard input and creates an E\-mail message replying to the original message\*(Aqs sender\&. A
\fBprogram\fR
is specified as an argument to
\fBmailbot\fR
after all of
\fBmailbot\fR
options\&.
\fBprogram\fR
is expected to read the created autoreply on its standard input, and mail it\&. If
\fBprogram\fR
is not specified,
\fBmailbot\fR
runs \*(Aqsendmail \-f ""\*(Aq\&.
.PP
\fBmailbot\fR
has several options for suppressing duplicate autoresponse messages\&. If
\fBmailbot\fR
chooses not to send an autoresponse, it quietly terminates without running
\fBprogram\fR\&. The autoresponse is optionally formatted as a MIME delivery status notification\&.
.PP
The text of the autoresponse is specified by the
\fB\-t\fR
or the
\fB\-m\fR
argument\&. Either one is required\&. Everything else is optional\&. The only exception is the
\fB\-T replydraft\fR
option, which requires the
\fB\-l\fR
option instead of either
\fB\-t\fR
or
\fB\-m\fR\&. The default behavior is to send an autoresponse unless the original message has the "Precedence: junk" or the "Precedence: bulk" header, or the "Precedence: list" header, or the "List\-ID:" header, or if its MIME content type is "multipart/report" (this is the MIME content type for delivery status notifications)\&. The
\fB\-M\fR
option formats the the autoresponse itself as a MIME delivery status notification\&.
.SH "OPTIONS"
.PP
\-A "\fIheader: value\fR"
.RS 4
Add a header to the autoresponse\&. Multiple
\fB\-A\fR
options are allowed\&. In most situations, the
\fB\-A\fR
option must be used to set the
\(lqFrom:\(rq
header in the autogenerated response\&.
.RE
.PP
\-f\fIaddress\fR
.RS 4
Address the autoresponse to
\fIaddress\fR, which must be an
\m[blue]\fBRFC 2822\fR\m[]\&\s-2\u[1]\d\s+2
address\&. By default
\fBmailbot\fR
takes the autoresponse address from the
From:
(or the
Reply\-To:) header in the original message\&.
\fB\-f\fR, if present, overrides and explicitly sets the autoresponse address\&. "\fIaddress\fR" must immediately follow the
\fB\-f\fR
option without an intervening space (it\*(Aqs a single command line argument)\&. An
\fB\-f\fR
option without an
\fIaddress\fR
takes the address from the
\fBSENDER\fR
environment variable\&.
.RE
.PP
\-t \fIfilename\fR
.RS 4
Read text autoresponse from
\fIfilename\fR, which must contain a plain text message in
\(lqflowed\-text\(rq
format\&. In a
\(lqflowed\-text\(rq\-formatted message, each line that ends with a space character indicates that the line logically flows into the next line\&. This allows the message to be reformatted for any shown display width\&.
.if n \{\
.sp
.\}
.RS 4
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBNote\fR
.ps -1
.br
Messages in languages (see the
\fB\-c\fR
option) which use spaces as word delimiters must have
\fItwo\fR
spaces at the end of a flowed line\&. The last space on a flowed line is logically removed, and the first space separates the last word on the previous line from the first word on the next line\&. Otherwise, the two words will not have a logical space between them if they get repositioned as part of adjusting the message\*(Aqs width for display\&.
.sp
Messages in ideographic languages that do not use spaces as word delimiters need only one space trailing a flowed line\&.
.sp .5v
.RE
.if n \{\
.sp
.\}
.RS 4
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBNote\fR
.ps -1
.br
The trailing whitespace has no visual impact when shown by software that does not implemented flowed text format, and always displays messages using their original width\&.
.sp .5v
.RE
.RE
.PP
\-c \fIcharset\fR
.RS 4
Set the autoresponse\*(Aqs MIME character set to
\fIcharset\fR\&. Run
\fBmailbot\fR
without any arguments to see the default character set\&.
.RE
.PP
\-m \fIfilename\fR
.RS 4
Read a MIME autoresponse from
filename\&. This is similar to the
\fB\-t\fR
option, except that
\fIfilename\fR
contains MIME headers, followed by a blank line, and the corresponding MIME content\&. The contents of
\fIfilename\fR
are inserted in the autoresponse without further processing\&.
.sp
The specified file must contain the
\(lqContent\-Type\(rq
header specifying the
\(lqtext/plain\(rq
MIME type, with the
\(lqformat=flowed\(rq,
\(lqdelsp=yes\(rq, and the
\(lqcharset\(rq
attributes, which override the
\fB\-c\fR
parameter\&. If the specified file has a
\(lqContent\-Transfer\-Encoding\(rq
header it must be either
\(lq7bit\(rq
or
\(lq8bit\(rq, it may not be
\(lqquoted\-printable\(rq\&.
\fBmailbot\fR
always drops any existing
\(lqContent\-Transfer\-Encoding\(rq
header and always adds the
\(lqContent\-Transfer\-Encoding: 8bit\(rq
header, even with the
\fB\-m\fR, since the salutation inserted into the message includes the sender\*(Aqs name, which may contain 8\-bit characters\&. Example:
.sp
.if n \{\
.RS 4
.\}
.nf
Content\-Type: text/plain; format=flowed; delsp=yes; charset="iso\-8859\-1"
Mary had a little lamb,
Its fleece was white as snow\&.
And everywhere Mary went,
The lamb was sure to go\&.
.fi
.if n \{\
.RE
.\}
.if n \{\
.sp
.\}
.RS 4
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBNote\fR
.ps -1
.br
When the
\fB\-m\fR
option is specified
\fBmailbot\fR
ignores the locale\*(Aqs character set and formats the autoreply according to the character set read from the
\(lqContent\-Type\(rq
header\&.
.sp .5v
.RE
.RE
.PP
\-M \fIaddress\fR
.RS 4
Format the autoresponse as a delivery status notification (\m[blue]\fBRFC 1894\fR\m[]\&\s-2\u[2]\d\s+2)\&.
\fIaddress\fR
is an
\m[blue]\fBRFC 2822\fR\m[]\&\s-2\u[1]\d\s+2
E\-mail address that generates the DSN\&. Note that the
\fB\-A\fR
option should still be used in addition to
\fB\-M\fR
in order to set the
From:
header on the autoresponse\&.
\fB\-M\fR
sets the DSN address only\&. The
\fB\-M\fR
option automatically sets
\fB\-T \fR\fBreplydsn\fR
.RE
.PP
\-R \fItype\fR
.RS 4
Specify the feedback report type, with
\fItype\fR
set to
abuse,
fraud,
other, or
virus\&. Must be used together with
\(lq\-T feedback\(rq
or
\(lq\-T replyfeedback\(rq\&.
.RE
.PP
\-T \fIformat\fR
.RS 4
Set the reply format\&.
\fIformat\fR
must be one of the following values:
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqreply\(rq
\- the default reply format\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqreplyall\(rq
\- like
\(lqreply\(rq, except also puts the recipients in the original message\*(Aqs
\(lqTo:\(rq
and
\(lqCc:\(rq
headers into the
\(lqCc:\(rq
header of the generated reply\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqreplydsn\(rq
\- like
\(lqreply\(rq, except the message is formatted as a delivery status notification\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqreplydraft\(rq
\- like
\(lqreply\(rq, with the text of the autoresponse coming from a maildir specified by the
\fB\-l\fR
option\&. See
\(lqAutoreplies from a maildir folder\(rq, below\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqforward\(rq
\- attach the original message as forwarded text\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqforwardatt\(rq
\- attach the original message as a forwarded message attachment\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqfeedback\(rq
\- generate an Email Feedback Report message (see
\m[blue]\fBRFC 5965\fR\m[]\&\s-2\u[3]\d\s+2)\&. The
\(lq\-R\(rq
option is required when this is specified\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\(lqreplyfeedback\(rq
\- like
\(lqfeedback\(rq, but also adds a
\(lqTo:\(rq
header, addressed to the original message\*(Aqs sender\&.
.RE
.RE
.PP
\-N
.RS 4
Do not quote the contents of the original message in the message created by
\(lqreply\(rq,
\(lqreplyall\(rq,
\(lqreplydsn\(rq,
\(lqfeedback\(rq, and
\(lqreplyfeedback\(rq
options\&.
.if n \{\
.sp
.\}
.RS 4
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBNote\fR
.ps -1
.br
The original message gets quoted, in the absence of this option, only if the original message was formatted as plain text\&.
\fBmailbot\fR
is unable to quote an original message which was formatted as
HTML, or any other non\-plaintext format\&.
.sp .5v
.RE
.if n \{\
.sp
.\}
.RS 4
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBNote\fR
.ps -1
.br
For
\(lqreplydsn\(rq,
\(lqfeedback\(rq, and
\(lqreplyfeedback\(rq
options, the convention is to attach the original message, or only its headers, separately; so this option should always be specified for these three reply formats\&.
.sp .5v
.RE
.RE
.PP
\-a
.RS 4
Attach the entire message, for
\(lqreplydsn\(rq,
\(lqfeedback\(rq, and
\(lqreplyfeedback\(rq, instead of only its headers\&.
.RE
.PP
\-e
.RS 4
Generate a reply (\(lqreply\(rq\-formats) to the address listed in any
\(lqErrors\-To\(rq
or
\(lqReturn\-Path\(rq
header, if present, instead of the
\(lqFrom\(rq
header\&.
.RE
.PP
\-S \(lqsalutation\(rq
.RS 4
Use the given
\fIsalutation\fR
in the
\(lqreply\(rq\&. The default value is
\(lq%F writes:\(rq\&. The following substitutions are recognized in the salutation string:
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%%
\- an explicit
%
character\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%n
\- a newline character\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%C
\- the
\(lqX\-Newsgroup:\(rq
header from the original message\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%N
\- the
\(lqNewsgroups:\(rq
header from the original message\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%i
\- the
\(lqMessage\-ID:\(rq
header from the original message\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%f
\- the original message\*(Aqs sender\*(Aqs address\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%F
\- the original message\*(Aqs sender\*(Aqs name\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%S
\- the
\(lqSubject:\(rq
header from the original message
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%d
\- the original message\*(Aqs date, in the local timezone\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
%{\fI\&.\&.\&.\fR}d
\- use
\fBstrftime\fR() to format the original message\*(Aqs date\&. A plain
%d
is equivalent to
%{%a, %d %b %Y %H:%M:%S %z}d\&.
.RE
.sp
All other characters in the salutation string are left as is\&.
.RE
.PP
\-F \(lqmarker\(rq
.RS 4
When generating a
forward, use the
\fImarker\fR
to separate the forwarded message from the autoreply text, instead of the default
\(lq\-\-\- Forwarded message \-\-\-\(rq
.RE
.PP
\-r \fIaddrlist\fR
.RS 4
\fIaddrlist\fR
is a comma\-separated list of
\m[blue]\fBRFC 2822\fR\m[]\&\s-2\u[1]\d\s+2
E\-mail addresses\&.
\fBmailbot\fR
sends an autoresponse only if the original message has at least one of the specified addresses in any
To:
or
Cc:
header\&.
.RE
.PP
\-d \fIfilename\fR
.RS 4
Create a small database,
\fIfilename\fR, that keeps track of senders\*(Aq E\-mail addresses, and prevent duplicate autoresponses going to the same address (suppress autoresponses going back to the same senders, for subsequent received messages)\&. The
\fB\-d\fR
option is only available if
\fBmaildrop\fR
has GDBM/DB extensions enabled\&.
.RE
.PP
\-D \fIx\fR
.RS 4
Do not send duplicate autoresponses (see the
\fB\-d\fR
option) for at least
\fIx\fR
days (default: 1 day)\&. The
\fB\-d\fR
option creates a database of E\-mail addresses and the times an autoresponse was last mailed to them\&. Another autoresponse to the same address will not be mailed until at least the amount of time specified by the
\fB\-D\fR
option has elapsed\&.
.RE
.PP
\-s "\fIsubject\fR"
.RS 4
Set the
Subject:
header on the autoresponse to
\fIsubject\fR\&.
.RE
.PP
\-n
.RS 4
Show the resulting message, do not send it\&. Used for debugging purposes\&.
.RE
.PP
\-\-feedback\-original\-envelope\-id\ \&\fI""\fR, \-\-feedback\-original\-mail\-from\ \&\fI""\fR, \-\-feedback\-reporting\-mta\ \&"\fIdns;\ \&hostname"\fR, \-\-feedback\-source\-ip\ \&\fIaaa\&.bbb\&.ccc\&.ddd\fR, \-\-feedback\-incidents\ \&\fIn\fR, \-\-feedback\-authentication\-results\ \&\fI"results"\fR, \-\-feedback\-original\-rcpt\-to\ \&\fI""\fR, \-\-feedback\-reported\-domain\ \&\fIexample\&.com\fR
.RS 4
Optional parameters to include in the feedback report generated by
\(lqfeedback\(rq
and
\(lqreplyfeedback\(rq\&.
\fBmailbot\fR
always adds
\(lqArrival\-Date\(rq
with the current time, as well as
\(lqVersion\(rq
and
\(lqUser\-Agent\(rq\&.
.sp
\(lq\-\-feedback\-authentication\-results\(rq,
\(lq\-\-feedback\-original\-rcpt\-to\(rq
and
\(lq\-\-feedback\-reported\-domain\(rq
may be specified more than once\&.
.RE
.PP
\-l \fImaildir\fR
.RS 4
Specifies the maildir for the
\(lq\-T replydraft\(rq
option\&. See
\(lqAutoreplies from a maildir folder\(rq, below\&.
.RE
.SS "Autoreplies from a maildir folder"
.PP
In
\&.mailfilter:
.sp
.if n \{\
.RS 4
.\}
.nf
cc "| mailbot \-T replydraft \-l \*(Aq\&./Maildir/\&.Vacation\*(Aq \e
\-d autoresponsedb \e
\-A \*(AqFrom: info@domain\&.com\*(Aq /usr/bin/sendmail \-f \*(Aq\*(Aq"
to "\&./Maildir"
.fi
.if n \{\
.RE
.\}
.PP
The
\fB\-T replydraft\fR
reply format takes the content of the autoresponse from the most recent message in a maildir\&. The
\fB\-l\fR
option specifies the maildir\&. The above example takes the message from
$HOME/Maildir/\&.Drafts
which should be a maildir (with the usual
cur,
new, and
tmp
subdirectories)\&. It would typically get created by Courier\-IMAP as a folder named
\(lqVacation\(rq\&.
.PP
This makes it possible to install autoreplies via an IMAP client by creating a folder named
\(lqVacation\(rq, and copying a message into it\&. The contents of the message become the autoresponse\&.
.PP
If the named maildir does not exist, or is empty,
\fBmailbot\fR
does nothing\&. If the named maildir has more than one message, the most recent message gets used\&.
.PP
The above example uses additional
\fBmailbot\fR
options to suppress duplicate autoresponses, and to set the
\(lqFrom:\(rq
header on the autoresponse\&.
.SH "SEE ALSO"
.PP
\m[blue]\fB\fBmaildrop\fR(1)\fR\m[]\&\s-2\u[4]\d\s+2,
\m[blue]\fB\fBreformail\fR(1)\fR\m[]\&\s-2\u[5]\d\s+2,
\m[blue]\fB\fBreformime\fR(1)\fR\m[]\&\s-2\u[6]\d\s+2\&.
.SH "AUTHOR"
.PP
\fBSam Varshavchik\fR
.RS 4
Author
.RE
.SH "NOTES"
.IP " 1." 4
RFC 2822
.RS 4
\%http://tools.ietf.org/html/rfc2822
.RE
.IP " 2." 4
RFC 1894
.RS 4
\%http://tools.ietf.org/html/rfc1894
.RE
.IP " 3." 4
RFC 5965
.RS 4
\%http://tools.ietf.org/html/rfc5965
.RE
.IP " 4." 4
\fBmaildrop\fR(1)
.RS 4
\%http://www.courier-mta.org/maildrop/maildrop.html
.RE
.IP " 5." 4
\fBreformail\fR(1)
.RS 4
\%http://www.courier-mta.org/maildrop/reformail.html
.RE
.IP " 6." 4
\fBreformime\fR(1)
.RS 4
\%http://www.courier-mta.org/maildrop/reformime.html
.RE