Модерируем рассылки с mailman

Mailman — модерируемые рассылки, достаточно удобные, когда требуется создать рассылки с ограничениями. Подробнее можно прочеть на официальном сайте.

В этой статье расскажу как установить, настроить, а так же связать с postfix и exim.

Так же существует менеджер рассылки новостей для mailman’a — phpNewsList

1) Установка.

В установке ничего особенного нет, кроме того, что выбираем в синеньком окошке нужный почтовик:

#cd /usr/ports/mail/mailman && make install clean

для postfix’a:

[X] POSTFIX   for use with postfix

для exim’a:

[X] EXIM4     for use with exim4

Сам mailman написан на python’e, поэтому, если у вас его нет, то установка может занять длительное время (пока вытянется сам «питон»). Если во время установки вылазит ошибка:

/usr/local/lib/python2.6/distutils/dist.py:250: UserWarning: ‘licence’ distribution option is deprecated; use ‘license’
warnings.warn(msg)
In file included from src/_japanese_codecs.c:12:
/usr/local/include/python2.6/Python.h:168:17: error: pth.h: No such file or directory
error: command ‘cc’ failed with exit status 1
*** Error code 1

Stop in /var/ports/basejail/usr/ports/mail/mailman/work/mailman-2.1.12/misc.
*** Error code 1

Stop in /var/ports/basejail/usr/ports/mail/mailman/work/mailman-2.1.12.
*** Error code 1

Stop in /basejail/usr/ports/mail/mailman.
*** Error code 1

Stop in /basejail/usr/ports/mail/mailman.
router2#

тогда выполняем команды:

ln -s /usr/local/include/pth/pth.h /usr/local/include/python2.6/
ln -s /usr/local/include/pth/pthread.h /usr/local/include/python2.6/

после чего пробуем опять установить.

2) Настройка mailman.

Открываем файл /usr/local/mailman/Mailman/mm_cfg.py и добавляем в конец такое:

##################################################
# Put YOUR site-specific settings below this line.

DEFAULT_EMAIL_HOST = ‘router1.tld’
DEFAULT_URL_HOST = ‘router1.router1.tld’
DEFAULT_URL_PATTERN = ‘http://%s/mailman/’

PUBLIC_ARCHIVE_URL = ‘http://%(hostname)s/mailman/pipermail/%(listname)s’
IMAGE_LOGOS = ‘/mailman/icons/’

DEFAULT_CHARSET = ‘koi8-u’
MTA = ‘Postfix’
POSTFIX_STYLE_VIRTUAL_DOMAINS = [‘router1.tld’, ‘router1.router1.tld’]

add_virtualhost(‘router1.router1.tld’)

Собственно измените или добавьте нужные параметры. Для MTA Exim параметр MTA =’None’. Описание параметров:

DEFAULT_EMAIL_HOST — дефолтный домен

DEFAULT_URL_HOST — дефолтный путь URL

POSTFIX_STYLE_VIRTUAL_DOMAINS — можете перечислить ваши домены

Создадим пароль модератора (он будет использоваться для создания рассылок):

#/usr/local/mailman/bin/mmsitepass

Для нормальной работы требуеся web-сервер с поддержкой CGI. Я выбрал apache. Добавляем такое для нормальной работы:

Alias /pipermail «/usr/local/mailman/archives/public»
Alias /mailman/icons «/usr/local/mailman/icons»
ScriptAlias /mailman «/usr/local/mailman/cgi-bin»

<Directory «/usr/local/mailman»>
Options FollowSymLinks ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Перечитываем конфиг apache’a. Заходим в админку mailman по такому адресу http://IP/mailman/admin и переходим по ссылкеcreate a new mailing list.

Самым перевым делом создадим рассылку mailman (она нужна для нужд самого mailman). Опишу параметры, которые можно заполнять при создании рассылки:

Name of list: = имя рассылки (вводиться только левая часть, которая до @)

Initial list owner address: = адрес собственника рассылки (ему приходят сообщения про модерацию, и прочее)

Initial list password: = пароль для изменения параметров данной рассылки

List creator’s (authentication) password: = пароль модератора, который мы создавали выше командой mmsitepass.

Выбираем ещё дополнительно русский язык и нажимаем Create list. Если появляется ошибка:

Error: Unknown virtual host:

тогда идём и добавлям адрес в конфиг /usr/local/mailman/Mailman/mm_cfg.py, по которому вы заходите в админку mailman’a (у себя, например, я добавлял IP-адрес хоста):

add_virtualhost(‘router1.router1.tld’, ‘10.0.3.131’)

После этого заходим в саму рассылку и добавляем подпищиков. (Описывать не буду, так как всё интуитивно понятно). После этого добавляем в /etc/rc.conf строку запуска mailman’a и запускаем его:

#echo ‘mailman_enable=»YES»‘ >> /etc/rc.conf

#/usr/local/etc/rc.d/mailman start

Если на этом этапе вылазит ошибка:

Site list is missing: mailman

то это значит, что не создана служебная рассылка mailman. Создать её можно так:

#/usr/local/mailman/bin/newlist mailman

и отвечаем на вопросы. После этого запускаем ещё раз mailman.

2.5) Перед созданием рассылок, необходимо создать служебную рассылку mailman, иначе не заработает.

3a) Связка с postfix

Для нормальной работы добавляем в конфиг к соотвествующим параметрам такое :

alias_maps =

hash:/usr/local/mailman/data/aliases


virtual_alias_maps =

hash:/usr/local/mailman/data/virtual-mailman

А так же добавляем позвожность релея для наших внутренних доменов (то есть для тех, для которых планируется использоватьmailman):

relay_domains = $mydestination

Если этого не сделать, то при отправке будем получать такое сообщение:

Sep 25 11:34:32 router1 postfix/smtpd[35841]: NOQUEUE: reject: RCPT from router1[10.0.3.131]: 554 5.7.1 <admin@touter1.tld>: Relay access denied; from=<mailman-bounces@router1.tld> to=<admin@touter1.tld> proto=ESMTP helo=<router1.router1.tld>

После этого перечитываем конфиг postfix’a и пробуем отправить письмо на рассылку (у меня рассылка test-list@router1.tld, подписанные юзеры admin@router1.tlduser@router1.tld). Привожу только лог:

Sep 25 11:27:37 router1 postfix/postfix-script[35724]: refreshing the Postfix mail system
Sep 25 11:27:38 router1 postfix/master[26899]: reload configuration /usr/local/etc/postfix
Sep 25 11:27:57 router1 sendmail[35732]: n8PBRvSb035732: from=skeletor, size=49,, nrcpts=1, msgid=<200909251127.n8PBRvSb035732@router1.router1.tld>, relay=root@localhost
Sep 25 11:27:57 router1 postfix/smtpd[35733]: connect from router1[10.0.3.131]
Sep 25 11:27:57 router1 postfix/smtpd[35733]: 2D6A874E478: client=router1[10.0.3.131]
Sep 25 11:27:57 router1 postfix/cleanup[35735]: 2D6A874E478: message-id=<200909251127.n8PBRvSb035732@router1.router1.tld>
Sep 25 11:27:57 router1 sendmail[35732]: n8PBRvSb035732: to=test-list@router1.tld, ctladdr=skeletor (1001/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30049, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 2D6A874E478)
Sep 25 11:27:57 router1 postfix/qmgr[35728]: 2D6A874E478: from=<skeletor@router1.router1.tld>, size=579, nrcpt=1 (queue active)
Sep 25 11:27:57 router1 postfix/smtpd[35733]: disconnect from router1[10.0.3.131]
Sep 25 11:27:57 router1 Mailman mail-wrapper: Group mismatch error.  Mailman expected the mail wrapper script to be executed as group «mailman», but the system’s mail server executed the mail script as group «www».  Try tweaking the mail server to run the script as group «mailman», or re-run configure,  providing the command line option `—with-mail-gid=www’.
Sep 25 11:27:57 router1 postfix/local[35736]: 2D6A874E478: to=<test-list@router1.router1.tld>, orig_to=<test-list@router1.tld>, relay=local, delay=0.27, delays=0.19/0.05/0/0.03, dsn=5.3.0, status=bounced (Command died with status 2: «/usr/local/mailman/mail/mailman post test-list». Command output: Group mismatch error.  Mailman expected the mail wrapper script to be executed as group «mailman», but the system’s mail server executed the mail script as group «www».  Try tweaking the mail server to run the script as group «mailman», or re-run configure,  providing the command line option `—with-mail-gid=www’. )
Sep 25 11:27:57 router1 postfix/cleanup[35735]: 62A2874E4B4: message-id=<20090925112757.62A2874E4B4@router1.router1.tld>
Sep 25 11:27:57 router1 postfix/bounce[35738]: 2D6A874E478: sender non-delivery notification: 62A2874E4B4
Sep 25 11:27:57 router1 postfix/qmgr[35728]: 62A2874E4B4: from=<>, size=3158, nrcpt=1 (queue active)
Sep 25 11:27:57 router1 postfix/qmgr[35728]: 2D6A874E478: removed
Sep 25 11:27:57 router1 postfix/local[35736]: 62A2874E4B4: to=<skeletor@router1.router1.tld>, relay=local, delay=0.04, delays=0.02/0.01/0/0.02, dsn=2.0.0, status=sent (delivered to mailbox)
Sep 25 11:27:57 router1 postfix/qmgr[35728]: 62A2874E4B4: removed

Видим ошибку. Что бы исправить её выполняем такую команду:

#chown mailman /usr/local/mailman/data/*

Теперь пробуем ещё раз отправить:

Sep 25 12:25:28 router1 sendmail[36763]: n8PCPStR036763: from=skeletor, size=83,, nrcpts=1, msgid=<200909251225.n8PCPStR036763@router1.router1.tld>, relay=root@localhost
Sep 25 12:25:28 router1 postfix/smtpd[36756]: connect from router1[10.0.3.131]
Sep 25 12:25:28 router1 postfix/smtpd[36756]: 1F29C74E4E3: client=router1[10.0.3.131]
Sep 25 12:25:28 router1 postfix/cleanup[36758]: 1F29C74E4E3: message-id=<200909251225.n8PCPStR036763@router1.router1.tld>
Sep 25 12:25:28 router1 sendmail[36763]: n8PCPStR036763: to=test-list@router1.tld, ctladdr=skeletor (1001/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30083, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 1F29C74E4E3)
Sep 25 12:25:28 router1 postfix/qmgr[36551]: 1F29C74E4E3: from=<skeletor@router1.router1.tld>, size=613, nrcpt=1 (queue active)
Sep 25 12:25:28 router1 postfix/smtpd[36756]: disconnect from router1[10.0.3.131]
Sep 25 12:25:28 router1 postfix/local[36759]: 1F29C74E4E3: to=<test-list@router1.router1.tld>, orig_to=<test-list@router1.tld>, relay=local, delay=0.45, delays=0.13/0.01/0/0.31, dsn=2.0.0, status=sent (delivered to command: /usr/local/mailman/mail/mailman post test-list)
Sep 25 12:25:28 router1 postfix/qmgr[36551]: 1F29C74E4E3: removed
Sep 25 12:25:29 router1 postfix/smtpd[36756]: connect from router1[10.0.3.131]
Sep 25 12:25:29 router1 postfix/smtpd[36756]: 78E8B74E4F2: client=router1[10.0.3.131]
Sep 25 12:25:29 router1 postfix/cleanup[36758]: 78E8B74E4F2: message-id=<200909251225.n8PCPStR036763@router1.router1.tld>
Sep 25 12:25:29 router1 postfix/qmgr[36551]: 78E8B74E4F2: from=<test-list-bounces@router1.tld>, size=1789, nrcpt=2 (queue active)
Sep 25 12:25:29 router1 postfix/smtpd[36756]: disconnect from router1[10.0.3.131]
Sep 25 12:25:29 router1 postfix/virtual[36766]: 78E8B74E4F2: to=<admin@router1.tld>, relay=virtual, delay=0.07, delays=0.03/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Sep 25 12:25:29 router1 postfix/virtual[36766]: 78E8B74E4F2: to=<user@router1.tld>, relay=virtual, delay=0.07, delays=0.03/0.02/0/0.02, dsn=2.0.0, status=sent (delivered to maildir)
Sep 25 12:25:29 router1 postfix/qmgr[36551]: 78E8B74E4F2: removed

Видим, что письмо отправлено каждому из подписчиков.

3b) Связка с exim.

Разрешаем релей (если не сделать, то будут вылазить ошибки relay not permitted), то есть добавляем нужные домены/хосты:

hostlist relay_from_hosts = 127.0.0.1 : 10.0.0.0/8

acl_check_rcpt:

accept hosts = +relay_from_hosts

Добавляем переменные для mailman’a:

#домашняя директории майлмана
MM_HOME=/usr/local/mailman
#учетная запись и группа майлмана
MM_UID=mailman
MM_GID=mail
#домен со списками рассылки
domainlist mm_domains=router2.tld
#путь к скрипту майлмана
MM_WRAP=MM_HOME/mail/mailman
#путь к конфигурационным файлам списков рассылки
MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck

Описываем роуты:

begin routers

mailman_router:
driver = accept
domains = +mm_domains
require_files = MM_LISTCHK
local_part_suffix_optional
local_part_suffix = -admin     : \
-bounces   : -bounces+* : \
-confirm   : -confirm+* : \
-join      : -leave     : \
-owner    : -request   : \
-subscribe : -unsubscribe
transport = mailman_transport

описываем транспорт:

begin transports

mailman_transport:
driver = pipe
command = MM_WRAP \
‘${if def:local_part_suffix \
{${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \
{post}}’ \
$local_part
current_directory = MM_HOME
home_directory = MM_HOME
user = MM_UID
group = MM_GID

Теперь перечитываем конфиг и пробуем отправлять:

Sep 25 14:50:52 router2 exim[40555]: [40555] cwd=/usr/local/mailman/bin 3 args: send-mail -i test-list@router2.tld
Sep 25 14:50:52 router2 exim[40555]: [40555] 1MrC8K-000AY7-0V SA: Debug: SAEximRunCond expand returned: ‘1’
Sep 25 14:50:52 router2 exim[40555]: [40555] 1MrC8K-000AY7-0V SA: Debug: check succeeded, running spamc
Sep 25 14:50:52 router2 spamd[98609]: spamd: connection from mail.router2.tld [10.0.3.132] at port 64578
Sep 25 14:50:52 router2 spamd[98609]: spamd: setuid to mailnull succeeded
Sep 25 14:50:52 router2 spamd[98609]: spamd: processing message <E1MrC8K-000AY7-0V@mail.router2.tld> for mailnull:26
Sep 25 14:50:54 router2 spamd[98609]: spamd: clean message (1.7/5.0) for mailnull:26 in 2.3 seconds, 463 bytes.
Sep 25 14:50:54 router2 spamd[98609]: spamd: result: . 1 — AWL,NO_RELAYS scantime=2.3,size=463,user=mailnull,uid=26,required_score=5.0,rhost=mail.router2.tld,raddr=10.0.3.132,rport=64578,mid=<E1MrC8K-000AY7-0V@mail.router2.tld>,autolearn=ham
Sep 25 14:50:54 router2 exim[40555]: [40555] 1MrC8K-000AY7-0V SA: Action: scanned but message isn’t spam: score=1.7 required=5.0 (scanned in 2/2 secs | Message-Id: E1MrC8K-000AY7-0V@mail.router2.tld). From <root@mail.router2.tld> (local) for test-list@router2.tld
Sep 25 14:50:54 router2 spamd[98607]: prefork: child states: II
Sep 25 14:50:54 router2 exim[40555]: [40555] 1MrC8K-000AY7-0V <= root@mail.router2.tld U=root P=local S=717 T=»weede» from <root@mail.router2.tld> for test-list@router2.tld
Sep 25 14:50:54 router2 exim[40557]: [40557] cwd=/var/spool/exim 3 args: /usr/local/sbin/exim -Mc 1MrC8K-000AY7-0V
Sep 25 14:50:54 router2 exim[40557]: [40557] 1MrC8K-000AY7-0V => test-list <test-list@router2.tld> F=<root@mail.router2.tld> P=<root@mail.router2.tld> R=mailman_router T=mailman_transport S=770 QT=2s DT=0s
Sep 25 14:50:54 router2 exim[40557]: [40557] 1MrC8K-000AY7-0V Completed QT=2s
Sep 25 14:50:56 router2 exim[91822]: [91822] SMTP connection from [10.0.3.132]:51602 I=[10.0.3.132]:25 (TCP/IP connection count = 1)
Sep 25 14:50:56 router2 exim[40561]: [40561] 1MrC8O-000AYD-Lh SA: Debug: SAEximRunCond expand returned: ‘1’
Sep 25 14:50:56 router2 exim[40561]: [40561] 1MrC8O-000AYD-Lh SA: Debug: check succeeded, running spamc
Sep 25 14:50:56 router2 spamd[98609]: spamd: connection from mail.router2.tld [10.0.3.132] at port 55345
Sep 25 14:50:56 router2 spamd[98609]: spamd: setuid to mailnull succeeded
Sep 25 14:50:56 router2 spamd[98609]: spamd: processing message <E1MrC8K-000AY7-0V@mail.router2.tld> for mailnull:26
Sep 25 14:50:58 router2 spamd[98609]: spamd: clean message (3.0/5.0) for mailnull:26 in 2.3 seconds, 1538 bytes.
Sep 25 14:50:58 router2 spamd[98609]: spamd: result: . 3 — ALL_TRUSTED,AWL,NO_DNS_FOR_FROM,TVD_SPACE_RATIO scantime=2.3,size=1538,user=mailnull,uid=26,required_score=5.0,rhost=mail.router2.tld,raddr=10.0.3.132,rport=55345,mid=<E1MrC8K-000AY7-0V@mail.router2.tld>,autolearn=no
Sep 25 14:50:59 router2 exim[40561]: [40561] 1MrC8O-000AYD-Lh SA: Action: scanned but message isn’t spam: score=3.0 required=5.0 (scanned in 2/3 secs | Message-Id: E1MrC8K-000AY7-0V@mail.router2.tld). From <test-list-bounces@router2.tld> (host=NULL [10.0.3.132]) for admin@router2.tld, user@domain.ru
Sep 25 14:50:59 router2 exim[40561]: [40561] 1MrC8O-000AYD-Lh <= test-list-bounces@router2.tld H=(router2.router2.tld) [10.0.3.132]:51602 I=[10.0.3.132]:25 P=esmtp S=1828 id=E1MrC8K-000AY7-0V@mail.router2.tld T=»[Test-list] weede» from <test-list-bounces@router2.tld> for admin@router2.tld user@domain.ru
Sep 25 14:50:59 router2 exim[40561]: [40561] SMTP connection from (router2.router2.tld) [10.0.3.132]:51602 I=[10.0.3.132]:25 closed by QUIT
Sep 25 14:50:59 router2 exim[40563]: [40563] cwd=/var/spool/exim 3 args: /usr/local/sbin/exim -Mc 1MrC8O-000AYD-Lh
Sep 25 14:50:59 router2 spamd[98607]: prefork: child states: II
Sep 25 14:50:59 deliver(admin@router2.tld): Info: auth input: home=/var/mail/exim/router2.tld/admin@router2.tld/
Sep 25 14:50:59 deliver(admin@router2.tld): Info: auth input: uid=26
Sep 25 14:50:59 deliver(admin@router2.tld): Info: auth input: gid=26
Sep 25 14:50:59 deliver(admin@router2.tld): Info: maildir: data=/var/mail/exim/router2.tld/admin@router2.tld/
Sep 25 14:50:59 deliver(admin@router2.tld): Info: maildir++: root=/var/mail/exim/router2.tld/admin@router2.tld, index=, control=, inbox=/var/mail/exim/router2.tld/admin@router2.tld
Sep 25 14:50:59 deliver(admin@router2.tld): Info: Namespace : Using permissions from /var/mail/exim/router2.tld/admin@router2.tld: mode=0700 gid=-1
Sep 25 14:50:59 deliver(admin@router2.tld): Info: msgid=<E1MrC8K-000AY7-0V@mail.router2.tld>: saved mail to INBOX
Sep 25 14:50:59 router2 exim[40563]: [40563] 1MrC8O-000AYD-Lh => admin <admin@router2.tld> F=<test-list-bounces@router2.tld> P=<test-list-bounces@router2.tld> R=dovecot_user T=dovecot_delivery S=1951 QT=3s DT=0s
Sep 25 14:50:59 deliver(user@domain.ru): Info: auth input: home=/var/mail/exim/domain.ru/user@domain.ru/
Sep 25 14:50:59 deliver(user@domain.ru): Info: auth input: uid=26
Sep 25 14:50:59 deliver(user@domain.ru): Info: auth input: gid=26
Sep 25 14:50:59 deliver(user@domain.ru): Info: maildir: data=/var/mail/exim/domain.ru/user@domain.ru/
Sep 25 14:50:59 deliver(user@domain.ru): Info: maildir++: root=/var/mail/exim/domain.ru/user@domain.ru, index=, control=, inbox=/var/mail/exim/domain.ru/user@domain.ru
Sep 25 14:50:59 deliver(user@domain.ru): Info: Namespace : Using permissions from /var/mail/exim/domain.ru/user@domain.ru: mode=0700 gid=-1
Sep 25 14:50:59 deliver(user@domain.ru): Info: msgid=<E1MrC8K-000AY7-0V@mail.router2.tld>: saved mail to INBOX
Sep 25 14:50:59 router2 exim[40563]: [40563] 1MrC8O-000AYD-Lh => user <user@domain.ru> F=<test-list-bounces@router2.tld> P=<test-list-bounces@router2.tld> R=dovecot_user T=dovecot_delivery S=1948 QT=3s DT=0s
Sep 25 14:50:59 router2 exim[40563]: [40563] 1MrC8O-000AYD-Lh Completed QT=3s

Модерируем рассылки с mailman: 3 комментария

  1. Ольга

    Здравствуйте!
    У меня выделенный сервер, с возможностью подключения MailMan.
    Вы можете помочь его настроить для работы, т.к. я в этом не разбираюсь?
    Если да, то на каких условиях и что вам для этого потребуется (какие данные)?

    1. skeletor Автор записи

      Да, могу бесплатно помочь советами, отвечая на вопросы. Есть так же платная поддержка (пишите через форму обратной связи).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *