Смысл того что идет ниже - перезапись адреса отправителя письма,
если оно отправляется за пределы локального домена (interface.local).
С прохождением аутентификации на внешнем почтовом сервере через который
отправляется письмо и на которых зарегистрированы почтовые ящики.
Своего почтового сервера у фирмочки нет.Через rewrite у меня не получилось из-за того что есть условие,
поэтому сделано через системный фильтр.
Пользователей мало поэтому базы данных не использовались, все данные в файлах.
Комментарии писал по памяти, может где и соврал :).
Расположение файлов относительно /var/lib/exim4 , при изменении поправить конфиг.
[root@router exim4]# pwd
/var/lib/exim4
[root@router exim4]# ls -lR
drwxr-x--- 3 root mail 4096 2010-07-05 13:28 files/
./files:
-rw-r----- 1 root mail 1379 2010-07-05 13:28 filter
-rw-r----- 1 root mail 507 2010-07-05 12:36 relay
drwxr-x--- 3 root mail 4096 2010-07-05 12:28 virtual/
# каталог назван также как и домен, в принципе может быть несколько.
./files/virtual:
drwxr-x--- 2 root mail 4096 2010-07-06 16:42 interface.local/
./files/virtual/interface.local:
-rw-r----- 1 root mail 705 2010-07-06 16:41 accept_sender
-rw-r----- 1 root mail 311 2010-07-06 16:42 rewrite
конфиг, то что не изменялось убрано.
acl в основном использовались как у лисяры, хотя прием только от внутренней сети и можно было и не заморачиваться.
http://www.lissyara.su/articles/freebsd/mail/exim+dovecot+po.../
поэтому указал только что сам добавил.
/etc/exim4/exim4.conf
CONF_DIR = /etc/exim4
VIRTUAL_DIR = /var/lib/exim4/files/virtual
FILES_DIR = /var/lib/exim4/files
SPOOL_DIR =/var/spool
MAIL_DIR = /var/spool/mail
primary_hostname = router # тут свой пишите :)
domainlist local_domains = @ : @[] : localhost : localhost.localdomain : $primary_hostname
domainlist relay_to_domains = dsearch;VIRTUAL_DIR
qualify_domain = interface.local # тут свой пишите :)
qualify_recipient = interface.local # тут свой пишите :)
never_users = root
exim_user = mail
exim_group = mail
freeze_tell = mail
system_filter = FILES_DIR/filter
system_filter_user = mail
begin acl
acl_check_rcpt:
accept hosts = :
# кому разрешено использовать (легко обходится)
accept
domains = dsearch;VIRTUAL_DIR
sender_domains = dsearch;VIRTUAL_DIR
endpass
message = "Для $sender_address доступ запрещен."
condition = ${extract{work}{${lookup{$sender_address_local_part}\
lsearch{VIRTUAL_DIR/$sender_address_domain/accept_sender}}}{$value}}
accept
!domains = dsearch;VIRTUAL_DIR
sender_domains = dsearch;VIRTUAL_DIR
endpass
message = "Для $sender_address доступ запрещен."
condition = ${extract{work}{${lookup{$sender_address_local_part}\
lsearch{VIRTUAL_DIR/$sender_address_domain/accept_sender}}}{$value}}
message = "Отправка вне локальных доменнов для $sender_address запрещена."
condition = ${extract{relay}{${lookup{$sender_address_local_part}\
wildlsearch{VIRTUAL_DIR/$sender_address_domain/accept_sender}}}{$value}}
# дальше примерно как по ссылке на лисяру
###############################################################################
begin routers
############################################################
virtual:
driver = accept
# домен получателя
domains = dsearch;VIRTUAL_DIR
# получатель в нем
local_parts =${extract{int}{${lookup{$local_part}\
lsearch{VIRTUAL_DIR/$domain/accept_sender}}}{$value}}
transport = local_delivery
smarthost:
driver = manualroute
#domains = домен куда уходит
domains = ! +local_domains
require_files = FILES_DIR/relay
# получаем адрес релея для внешнего адреса
route_data = ${extract{relay}{${lookup{$reply_address}\
lsearch{FILES_DIR/relay}}}{$value}fail}
# ошибка если релея нет
host_find_failed = defer
errors_to = $sender_address
no_verify
same_domain_copy_routing = no
transport = remote_smtp_smarthost
no_more
############################################################
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 : 192.168.0.0/16 :\
172.16.0.0/12 : 10.0.0.0/8 : 169.254.0.0/16 :\
255.255.255.255
no_more
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{$local_part}lsearch{/etc/exim4/aliases}}
file_transport = address_file
pipe_transport = address_pipe
userforward:
driver = redirect
check_local_user
file = $home/.forward
no_verify
no_expn
check_ancestor
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply
localuser:
driver = accept
check_local_user
transport = local_delivery
cannot_route_message = Unknown user
###############################################################################
begin transports
############################################################
remote_smtp:
driver = smtp
remote_smtp_smarthost:
driver = smtp
connection_max_messages = 1
hosts_try_auth = *
hosts_require_auth = ${extract{relay}{${lookup{$reply_address}\
lsearch{FILES_DIR/relay}}}{$value}fail}
helo_data=router # тут свой пишите :)
headers_remove = "Received:Message-ID:References:In-Reply-To"
headers_rewrite = *@+relay_to_domains ${lookup{$1}lsearch{VIRTUAL_DIR/$sender_address_domain/rewrite}{$value}fail} fsr
#
# E все поля конверта
# F поле “From” в конверте
# T поле “To” в конверте
# b заголовок “Bcc:”
# c заголовок “Cc:”
# f заголовок “From:”
# h все заголовки
# r заголовок “Reply-To:”
# s заголовок “Sender:”
# t заголовок “To:”
#
return_path = $reply_address
############################################################
local_delivery:
driver = appendfile
directory = MAIL_DIR/$domain/$local_part@$domain/
create_directory
directory_mode = 0770
maildir_format
delivery_date_add
envelope_to_add
return_path_add
user = virtual
group = mail
mode = 0660
address_pipe:
driver = pipe
return_output
address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
address_reply:
driver = autoreply
###############################################################################
begin retry
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
###############################################################################
begin rewrite
###############################################################################
begin authenticators
cram_md5:
driver = cram_md5
public_name = CRAM-MD5
client_name = ${extract{1}{:}{${lookup{$host}nwildlsearch{CONF_DIR/passwd.client}{$value}fail}}}
client_secret = ${extract{2}{:}{${lookup{$host}nwildlsearch{CONF_DIR/passwd.client}{$value}fail}}}
USERNAME= ${extract{username}{${lookup{$reply_address}lsearch{FILES_DIR/relay}{$value}fail}}}
MYSECRET= ${extract{pass}{${lookup{$reply_address}lsearch{FILES_DIR/relay}{$value}fail}}}
plain:
driver = plaintext
public_name = PLAIN
client_send = ^USERNAME^MYSECRET
login:
driver = plaintext
public_name = LOGIN
client_send = : USERNAME : MYSECRET
файл фильтра где происходит перезапись, в первой строке должно быть #Exim filter
cat /var/lib/exim4/files/filter
#Exim filter # не удалять первую строку!!!!!!!!!
if $sender_address_domain matches "interface.local" and $recipients does not matches "@interface.local" # тут свои пишите :)
then
headers remove Reply-to
headers remove From
headers remove Sender
headers remove return-path
headers add "From: ${lookup{$sender_address_local_part}lsearch{/var/lib/exim4/files/virtual/$sender_address_domain/rewrite}{$value}fail}"
headers add "Sender: ${lookup{$sender_address_local_part}lsearch{/var/lib/exim4/files/virtual/$sender_address_domain/rewrite}{$value} fail}"
headers add "Reply-to: ${lookup{$sender_address_local_part}lsearch{/var/lib/exim4/files/virtual/$sender_address_domain/rewrite}{$value} fail}"
headers add "return-path: ${lookup{$sender_address_local_part}lsearch{/var/lib/exim4/files/virtual/$sender_address_domain/rewrite}{$value} fail}"
endif
файл описывает параметры внешнего почтового ящика.
1-й столбик - key, он же зарегистрированный на внешнем сервере почтовый ящик, 2 - логин 3 - пароль 4 - smtp сервер,
понадобился так как MX в DNS и smtp могут отличаться.
cat /var/lib/exim4/files/relay
aaaaa@mail.ru: username=aaaaa pass=11111 relay=smtp.mail.ru
bbbbb@list.ru: username=bbbbb@list.ru pass=22222 relay=smtp.list.ru
файл описывает внутренние почтовые ящики
1-й столбик - key, 2 - разрешено использовать, 3 - название ящика до @,
4 - разрешена ли пересылка за пределы внутренних доменов.
cat /var/lib/exim4/files/virtual/interface.local/accept_sender
# key # accept sender # email local # relay to ext
# # @interface.local
root: work=yes int=root relay=yes
igor: work=yes int=igor relay=yes
inna: work=no int=inna relay=no
файл соответствия внутреннего почтового адреса и внешнего почтового адреса
cat /var/lib/exim4/files/virtual/interface.local/rewrite
root: aaaaa@mail.ru
igor: bbbbb@list.ru
inna:
форматирование уехало хотя оно имеет значение, так что где не понятно как должно быть спрашивайте