Mail-Toaster
view release on metacpan or search on metacpan
lib/Mail/Toaster/Setup/Maildrop.pm view on Meta::CPAN
'make install-strip',
'make install-man'
],
source_sub_dir => 'mail',
);
my $etcmail = "$prefix/etc/mail";
unless ( -d $etcmail ) {
mkdir( $etcmail, oct('0755') )
or $self->util->mkdir_system( dir => $etcmail, mode=>'0755' );
}
$self->filter();
$self->imap_subscribe();
$self->filter_logs();
};
sub filter {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts },);
my $prefix = $self->conf->{'toaster_prefix'} || "/usr/local";
my $logbase = $self->conf->{'qmail_log_base'};
if ( !$logbase ) {
$logbase = -d "/var/log/qmail" ? "/var/log/qmail" : "/var/log/mail";
}
my $filterfile = $self->conf->{'filtering_maildrop_filter_file'}
|| "$prefix/etc/mail/mailfilter";
my ( $file, $path ) = fileparse($filterfile); chop $path;
$self->util->mkdir_system( dir => $path ) if ! -d $path;
return $self->error( "$path doesn't exist and I couldn't create it.")
if ! -d $path;
my @lines = $self->filter_file( logbase => $logbase );
my $user = $self->conf->{'vpopmail_user'} || "vpopmail";
my $group = $self->conf->{'vpopmail_group'} || "vchkpw";
# if the mailfilter file doesn't exist, create it
if ( -e $filterfile ) {
$self->util->file_write( "$filterfile.new", lines => \@lines, mode =>'0600' );
$self->util->install_if_changed(
newfile => "$filterfile.new",
existing => $filterfile,
mode => '0600',
clean => 0,
notify => 1,
archive => 1,
);
}
else {
$self->util->file_write( $filterfile, lines => \@lines, mode => '0600' );
$self->audit("installed new $filterfile, ok");
};
$self->util->chown( $filterfile, uid => $user, gid => $group );
$file = "/etc/newsyslog.conf";
if ( -e $file && ! `grep maildrop $file`) {
$self->util->file_write( $file,
lines =>
["/var/log/mail/maildrop.log $user:$group 644 3 1000 * Z"],
append => 1,
);
};
return 1;
}
sub filter_file {
my $self = shift;
my %p = validate( @_, { 'logbase' => SCALAR, $self->get_std_opts, },);
my $logbase = $p{'logbase'};
my $prefix = $self->conf->{'toaster_prefix'} || "/usr/local";
my $filterfile = $self->conf->{'filtering_maildrop_filter_file'}
|| "$prefix/etc/mail/mailfilter";
my @lines = 'SHELL="/bin/sh"';
push @lines, <<"EOMAILDROP";
import EXT
import HOST
VHOME=`pwd`
TIMESTAMP=`date "+\%b \%d \%H:\%M:\%S"`
##
# title: mailfilter-site
# author: Matt Simerson
# version 2.17
#
# This file is automatically generated by toaster_setup.pl,
# DO NOT HAND EDIT, your changes may get overwritten!
#
# Make changes to toaster-watcher.conf, and run
# toaster_setup.pl -s maildrop to rebuild this file. Old versions
# are preserved as $filterfile.timestamp
#
# Usage: Install this file in your local etc/mail/mailfilter. On
# your system, this is $prefix/etc/mail/mailfilter
#
# Create a .qmail file in each users Maildir as follows:
# echo "| $prefix/bin/maildrop $prefix/etc/mail/mailfilter" \
# > ~vpopmail/domains/example.com/user/.qmail
#
# You can also use qmailadmin v1.0.26 or higher to do that for you
# via it is --enable-modify-spam and --enable-spam-command options.
# This is the default behavior for your Mail::Toaster.
#
# Environment Variables you can import from qmail-local:
# SENDER is the envelope sender address
# NEWSENDER is the forwarding envelope sender address
# RECIPIENT is the envelope recipient address, local\@domain
# USER is user
# HOME is your home directory
# HOST is the domain part of the recipient address
# LOCAL is the local part
lib/Mail/Toaster/Setup/Maildrop.pm view on Meta::CPAN
}
else
{
if ( \$SIZE < 256000 ) # Filter if message is less than 250k
{
`test -x $prefix/bin/spamc`
if ( \$RETURNCODE == 0 )
{
log `date "+\%b \%d \%H:\%M:\%S"`" \$PID - running message through spamc"
exception {
xfilter '$prefix/bin/spamc -u "\$EXT\@\$HOST"'
}
}
else
{
log " WARNING: no $prefix/bin/spamc binary!"
}
}
}
}
EOMAILDROP3
}
push @lines, <<"EOMAILDROP4";
##
# Include any rules set up for the user - this gives the
# administrator a way to override the sitewide mailfilter file
#
# this is also the "suggested" way to set individual values
# for maildrop such as quota.
##
`test -r \$VHOME/.mailfilter`
if( \$RETURNCODE == 0 )
{
log " including \$VHOME/.mailfilter"
exception {
include \$VHOME/.mailfilter
}
}
##
# create the maildirsize file if it does not already exist
# (could also be done via "deliverquota user\@dom.com 10MS,1000C)
##
`test -e \$VHOME/Maildir/maildirsize`
if( \$RETURNCODE == 1)
{
VUSERINFO="$prefix/vpopmail/bin/vuserinfo"
`test -x \$VUSERINFO`
if ( \$RETURNCODE == 0)
{
log " creating \$VHOME/Maildir/maildirsize for quotas"
`\$VUSERINFO -Q \$EXT\@\$HOST`
`test -s "\$VHOME/Maildir/maildirsize"`
if ( \$RETURNCODE == 0 )
{
`/usr/sbin/chown vpopmail:vchkpw \$VHOME/Maildir/maildirsize`
`/bin/chmod 640 \$VHOME/Maildir/maildirsize`
}
}
else
{
log " WARNING: cannot find vuserinfo! Please edit mailfilter"
}
}
EOMAILDROP4
my $head = $self->util->find_bin( 'head' );
push @lines, <<"EOMAILDROP5";
##
# Set MAILDIRQUOTA. If this is not set, maildrop and deliverquota
# will not enforce quotas for message delivery.
##
`test -e \$VHOME/Maildir/maildirsize`
if( \$RETURNCODE == 0)
{
MAILDIRQUOTA=`$head -n1 \$VHOME/Maildir/maildirsize`
}
# if the user does not have a Spam folder, create it.
`test -d \$VHOME/Maildir/.Spam`
if( \$RETURNCODE == 1 )
{
MAILDIRMAKE="$prefix/bin/maildirmake"
`test -x \$MAILDIRMAKE`
if ( \$RETURNCODE == 1 )
{
MAILDIRMAKE="$prefix/bin/maildrop-maildirmake"
`test -x \$MAILDIRMAKE`
}
if ( \$RETURNCODE == 1 )
{
log " WARNING: no maildirmake!"
}
else
{
log " creating \$VHOME/Maildir/.Spam "
`\$MAILDIRMAKE -f Spam \$VHOME/Maildir`
`$prefix/sbin/subscribeIMAP.sh Spam \$VHOME`
}
}
##
# The message should be tagged, so lets bag it.
##
# HAM: X-Spam-Status: No, score=-2.6 required=5.0
# SPAM: X-Spam-Status: Yes, score=8.9 required=5.0
#
# Note: SA < 3.0 uses "hits" instead of "score"
#
# if ( /^X-Spam-Status: *Yes/) # test if spam status is yes
lib/Mail/Toaster/Setup/Maildrop.pm view on Meta::CPAN
log " delivering to \$VHOME/Maildir"
# make sure the deliverquota binary exists and is executable
# if not, then we cannot enforce quotas. If we do not check
# and the binary is missing, maildrop silently discards mail.
DELIVERQUOTA="$prefix/bin/deliverquota"
`test -x \$DELIVERQUOTA`
if ( \$RETURNCODE == 1 )
{
DELIVERQUOTA="$prefix/bin/maildrop-deliverquota"
`test -x \$DELIVERQUOTA`
}
if ( \$RETURNCODE == 1 )
{
log " WARNING: no deliverquota!"
log "=== END === \$EXT\@\$HOST success"
exception {
to "\$VHOME/Maildir"
}
}
else
{
exception {
xfilter "\$DELIVERQUOTA -w 90 \$VHOME/Maildir"
}
##
# check to make sure the message was delivered
# returncode 77 means that out maildir was overquota - bounce mail
##
if( \$RETURNCODE == 77)
{
#log " BOUNCED: bouncesaying '\$EXT\@\$HOST is over quota'"
log "=== END === \$EXT\@\$HOST bounced"
to "|/var/qmail/bin/bouncesaying '\$EXT\@\$HOST is over quota'"
}
else
{
log "=== END === \$EXT\@\$HOST success (quota)"
EXITCODE=0
exit
}
}
log "WARNING: This message should never be printed!"
EOMAILDROP11
return @lines;
}
sub filter_logs {
my $self = shift;
my $log = $self->conf->{'qmail_log_base'} || "/var/log/mail";
$self->util->mkdir_system( dir => $log, verbose => 0 ) if ! -d $log;
$self->util->chown( $log,
uid => $self->conf->{'qmail_log_user'} || 'qmaill',
gid => $self->conf->{'qmail_log_group'} || 'qnofiles',
sudo => $UID == 0 ? 0 : 1,
);
my $logf = "$log/maildrop.log";
$self->util->file_write( $logf, lines => ["begin"] ) if ! -e $logf;
$self->util->chown( $logf,
uid => $self->conf->{'vpopmail_user'} || "vpopmail",
gid => $self->conf->{'vpopmail_group'} || "vchkpw",
sudo => $UID == 0 ? 0 : 1,
);
}
sub imap_subscribe {
my $self = shift;
my $prefix = $self->conf->{'toaster_prefix'} || "/usr/local";
my $sub_file = "$prefix/sbin/subscribeIMAP.sh";
my $sub_bin = $self->util->find_bin( "$prefix/sbin/subscribeIMAP.sh", verbose => 0, fatal => 0 );
return 1 if ( $sub_bin && -e $sub_bin );
my @lines = '#!/bin/sh
#!/bin/sh
#
# This subscribes the folder passed as $1 to courier imap
# so that Maildir reading apps (Sqwebmail, Courier-IMAP) and
# IMAP clients (squirrelmail, Mailman, etc) will recognize the
# extra mail folder.
# Matt Simerson - 12 June 2003
# Rob Lensen 29-04-2015 Dovecot changes
LIST="$2/Maildir/subscriptions"
if [ -f "$LIST" ]; then
# if the file exists, check it for the new folder
TEST=`cat "$LIST" | grep "$1"`
# if it is not there, add it
if [ "$TEST" = "" ]; then
echo "$1" >> $LIST
fi
else
# the file does not exist so we define the full list
# and then create the file.
FULL="INBOX\nSent\nTrash\nDrafts\n$1"
echo -e $FULL > $LIST
/usr/sbin/chown vpopmail:vchkpw $LIST
/bin/chmod 644 $LIST
fi
';
$self->util->file_write( $sub_file, lines => \@lines );
$self->util->chmod(
file_or_dir => $sub_file,
mode => '0555',
sudo => $UID == 0 ? 0 : 1,
);
};
1;
__END__;
( run in 0.539 second using v1.01-cache-2.11-cpan-71847e10f99 )