понедельник, 5 января 2009 г.

Несложная настройка mutt+procmail+fetchmail+postfix

Совсем неидеальная настройка для dialup машины с динамическим IP и сказочным доменом, ставилась цель настроить и забыть :) Дистрибутив Debian Etch, пакеты mutt, postfix, procmail и fetctmail ставились без настроек. Если при установке что-то и спрашивалось, соглашался на первый же предложенный вариант. Mutt будет искать новую почту в каталоге ~/mail, который также будет содержать подкаталоги Read(прочитанные письма), Sent(отправленные письма) и Drafts(черновики).

Файл ~/.muttrc

# ---- language-env DON'T MODIFY THIS LINE!
# Character set to be used.
set charset=utf-8
set send_charset=us-ascii:koi8-r:utf-8
# ---- language-env end DON'T MODIFY THIS LINE!
set folder="~/mail"
set mbox_type="Maildir"
set spoolfile="~/mail/"
set mbox="+Read"
set record="+Sent"
set postponed="+Drafts"
mailboxes +Read +Sent +Drafts
set signature="~/.signature"
set move=yes
macro index c "?" "open a different folder"
macro pager c "?" "open a different folder"
Создаём каталог для почты и назначаем нужные права.
mkdir ~/mail
mkdir ~/mail/new
mkdir ~/mail/cur
mkdir ~/mail/tmp
chmod 0700 -R ~/mail
По мелочи:

Файл ~/.zshrc

# Добавляем
export MAILDIR=$HOME/mail
export VISUAL=vim
export EDITOR=vim

Файл ~/.signature

Моя подпись :) Пока ничего не работает из-за особенностей локальной доставки, поэтому принимаемся за неё.

Файл ~/.procmailrc

MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/

Procmail пока не раскидывает почту по каталогам, это оставлено на будущее.

Файл /etc/postfix/master.cf

# Не трогая остального добавляем следующую строчку
hold      unix  -       -       -       -       -       smtp

Файл /etc/postfix/main.cf

# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

#=================================
# Моя машина имеет имя rbox.net
myhostname = rbox
mydomain = net
mydestination = rbox.net, localhost.net, localhost

#=================================
# адрес smtp провайдера 
relayhost = smtp.mail.ru

mailbox_size_limit = 0
home_mailbox=mail/
mailbox_command = /usr/bin/procmail -a $DOMAIN -d $LOGNAME

default_transport=hold
defer_transports = hold
transport_maps=hash:/etc/postfix/transport

disable_dns_lookups=yes
smtp_generic_maps = hash:/etc/postfix/generic

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_type = cyrus
smtp_sasl_security_options = noanonymous
Создаём три файлика

Файл /etc/postfix/transport

rbox  local:
rbox.net  local:
localhost.rbox.net local:

Файл /etc/postfix/generic

локальный_пользователь@rbox                 имя_ящика@mail.ru
локальный_пользователь@rbox.net             имя_ящика@mail.ru

Файл /etc/postfix/sasl_passwd

smtp.mail.ru  имя_ящика:пароль_к_ящику
Даём знать Postfix'у о существовании этих файлов:
cd /etc/postfix
postmap generic
postmap transport
postmap sasl_password
/etc/init.d/postfix restart
На данный момент можно без подключения к сети написать письмо самому себе, отправить и получить. Изменим поведение postfix, чтобы при наличии соединения письма отправлялись немедленно, а не копились в очереди.

Файл /etc/ppp/ip-up.d/postfix

#!/bin/sh -e
# Called when a new interface comes up
# Written by LaMont Jones 
# don't bother to restart postfix when lo is configured.
if [ "$IFACE" = "lo" ]; then
 exit 0
fi
# If /usr isn't mounted yet, silently bail.
if [ ! -d /usr/lib/postfix ]; then
 exit 0
fi
RUNNING=""
# If master is running, force a queue run to unload any mail that is
# hanging around.  Yes, sendmail is a symlink...
if [ -f /var/spool/postfix/pid/master.pid ]; then
 pid=$(sed 's/ //g' /var/spool/postfix/pid/master.pid)
 exe=$(ls -l /proc/$pid/exe 2>/dev/null | sed 's/.* //;s/.*\///')
 if [ "X$exe" = "Xmaster" ]; then
  RUNNING="y"
 fi
fi
# start or reload Postfix as needed
if [ ! -x /sbin/resolvconf ]; then
 f=/etc/resolv.conf
 if ! cp $f $(postconf -h queue_directory)$f 2>/dev/null; then
  exit 0
 fi
 if [ -n "$RUNNING" ]; then
  #===============================================================
  # Вот новая строчка
    /usr/sbin/postconf -e defer_transports=smtp
  /etc/init.d/postfix reload >/dev/null 2>&1
 fi
fi
# If master is running, force a queue run to unload any mail that is
# hanging around.  Yes, sendmail is a symlink...
if [ -n "$RUNNING" ]; then
 if [ -x /usr/sbin/sendmail ]; then
  /usr/sbin/sendmail -q >/dev/null 2>&1
 fi
fi

Файл /etc/ppp/ip-down.d/postfix

#!/bin/sh -e
# Called when an interface disconnects
# Written by LaMont Jones 
# start or reload Postfix as needed
# If /usr isn't mounted yet, silently bail.
if [ ! -d /usr/lib/postfix ]; then
 exit 0
fi
RUNNING=""
# If master is running, force a queue run to unload any mail that is
# hanging around.  Yes, sendmail is a symlink...
if [ -f /var/spool/postfix/pid/master.pid ]; then
 pid=$(sed 's/ //g' /var/spool/postfix/pid/master.pid)
 exe=$(ls -l /proc/$pid/exe 2>/dev/null | sed 's/.* //;s/.*\///')
 if [ "X$exe" = "Xmaster" ]; then
  RUNNING="y"
 fi
fi
if [ ! -x /sbin/resolvconf ]; then
 f=/etc/resolv.conf
 if ! cp $f $(postconf -h queue_directory)$f 2>/dev/null; then
  exit 0
 fi
  #===============================================================
  # Вот новая строчка
  /usr/sbin/postconf -e defer_transports=hold
 if [ -n "$RUNNING" ]; then
  /etc/init.d/postfix reload >/dev/null 2>&1
 fi
fi
exit 0
Забираем почту с помощью fetchmail.

Файл ~/.fetchmailrc

poll pop3.mail.ru protocol pop3 
    user "имя_ящика", with password "пароль_к_ящику", is "локальный_пользователь" here;
sslproto=""
Вот и всё. В таком варианте я получаю почту ручками (fetchmail -v), отвечать могу как оффлайн, так и онлайн. Пока я не в сети почта накапливается, при подключении к сети очередь сбрасывается и далее осуществляется немедленная отправка.

Комментариев нет:

Отправить комментарий