Назад | Перейти на главную страницу

Получить постфикс для пересылки почты root

У меня есть сервер Ubuntu, на котором работает postfix. Это не почтовый сервер для моего домена.

Всякий раз, когда задание cron выполняется для root, выходная почта не доставляется локально, вместо этого она отправляется на root@mydomain.com через основной почтовый сервер. Я не этого хочу.

Я хочу, чтобы почта для root либо доставлялась локально, либо пересылалась на anothermail@anotherdomain.com.

Я пробовал изменить оба ~root/.forward и /etc/aliases (и запуск newaliases), но ничего не помогает (я думаю, эти файлы проверяются только тогда, когда postfix пытается доставить почту локально).

Что я могу сделать?

Это /etc/postfix/main.cf:

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
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:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
myhostname = linux1.mydomain.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = linux1.mydomain.com, localhost.linux1.mydomain.com, localhost
relayhost = my.isps.relayhost.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only

Редактировать:

При отправке почты root это переходит в /var/log/mail.log:

Mar  7 09:39:17 linux1 postfix/pickup[31381]: F3B9C98025E: uid=1000 from=<ct>
Mar  7 09:39:18 linux1 postfix/cleanup[31556]: F3B9C98025E: message-id=<20130307083917.F3B9C98025E@linux1.mydomain.com>
Mar  7 09:39:18 linux1 postfix/qmgr[28525]: F3B9C98025E: from=<ct@mydomain.com>, size=283, nrcpt=1 (queue active)
Mar  7 09:39:18 linux1 postfix/smtp[31558]: F3B9C98025E: to=<root@mydomain.com>, orig_to=<root>, relay=my.isps.relayhost.com[<IP address omitted>]:25, delay=0.72, delays=0.19/0.02/0.27/0.25, dsn=2.0.0, status=sent (250 Ok: queued as A97F5D8126)
Mar  7 09:39:18 linux1 postfix/qmgr[28525]: F3B9C98025E: removed

Имя «ct» - мое имя пользователя. Я создал приведенный выше текст с помощью этой команды:

echo test | mail -s test root

Содержание /etc/mailname является:

mydomain.com

Содержание /etc/aliases является:

root: anothermail@anotherdomain.com
postmaster:    root

где anothermail@anotherdomain.com - это то место, куда я хотел бы пересылать почту root.

Содержание /etc/hosts на самом деле меня немного удивляет:

127.0.0.1 localhost
127.0.1.1 linux1.mylinux.mydomain.com linux1

где «mylinux» - это имя хоста операционной системы хоста, под которой linux1 работает как виртуальная машина. Я не уверен, как "mylinux" туда попал. (Но может ли это быть причиной моей проблемы?)

Как обычно, проверьте свои журналы.

В вашем случае демон postfix думает, что почта не для него, и отправляет ее без использования /etc/aliases

Сначала проверьте свой /etc/hosts файл: имя вашей машины должно соответствовать 127.0.1.1, как это:

127.0.1.1  linux1.mydomain.com  linux1

Проверьте свои /etc/mailname тоже, и он должен быть последовательным.

Проверьте свои /etc/aliases чтобы увидеть, отправлен ли root (пользователь) другому пользователю, и повторить newaliases команда.

И должно работать!

Если mydestination пусто или не содержит $myhostname затем /etc/aliases будет проигнорирован, потому что postfix считает, что электронная почта не является локальной доставкой, и поэтому не будет применять локальные псевдонимы. Итак, оставьте mydestination по умолчанию (postconf -d mydestination или удалить его из main.cf) и журналы должны показывать to=<...> в качестве адреса с псевдонимом.

В некоторых случаях (например, когда вся почта ретранслируется во внешнюю систему) проще просто установить MAILTO переменную в корневом каталоге crontab на реальный адрес электронной почты. Это должно в значительной степени обойти традиционную доставку в root и просто заставить его работать там, где вы хотите.

# Root's crontab
MAILTO=someone@example.com
0 0 * * * /usr/bin/somescript

Кажется, есть проблема с открытием /root/.forward с помощью демона postfix, по крайней мере, на усиленной системе (я не копался в этом). Несмотря:

# ls -ld / /root /root/.forward
dr-xr-xr-x. 18 root root  236 Dec  4 00:02 /
dr-xr-x--x. 13 root root 4096 Jan  8 17:45 /root
-rw-r--r--.  1 root root   30 Jan  8 14:51 /root/.forward

Потомок демона postfix не может получить доступ к .forward:

7603  open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 16
7603  fstat(16, {st_mode=S_IFREG|0644, st_size=1227, ...}) = 0
7603  mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f86854fb000
7603  read(16, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 1227
7603  close(16)                         = 0
7603  munmap(0x7f86854fb000, 4096)      = 0
7603  geteuid()                         = 89
7603  getegid()                         = 89
7603  geteuid()                         = 89
7603  setresuid(-1, 0, -1)              = 0
7603  setresgid(-1, 0, -1)              = 0
7603  setgroups(1, [0])                 = 0
7603  lstat("/root/.forward", 0x7ffc03f84750) = -1 EACCES (Permission denied)

У меня не было времени копаться ... Добавляем запись в /etc/aliases с последующим newaliases работает отлично.

Если вы настроили фильтрацию целевого домена в /etc/postfix/transport тогда вам нужно добавить поддомен вашего компьютера в список разрешенных доменов.

Например, если у вас были:

mydomain.com                :
anotherdomain.com           :
*                           discard:

Обновите его до:

linux1.mylinux.mydomain.com :
mydomain.com                :
anotherdomain.com           :
*                           discard:

Без этого обновления строка root: anothermail@anotherdomain.com в /etc/aliases или аналогичный в .forward не имеет желаемого конечного эффекта, поскольку сообщение отбрасывается перед пересылкой.