Page 1 of 2

Почта и смартхост на скорую руку

Posted: Fri Mar 27, 2015 8:06 pm
by skurudo
Бывают времена, когда отправка почты с вашего сервера затруднена разными странными причинами - сложно настроить (хостнейм выбран неудачно, обратную зону не прописать) или же проблема в вашем хостинг-провайдере, который блокирует порты. Вариантов масса. Но можно попробовать использовать внешнюю почту для отправки писем с сервера. Сделать это не так уж сложно, для этого нужно лишь сделать небольшие копипасты и перезапуск службы, которая отправляет почту. Основная идея в том, что мы направляем всю нашу почту через внешний почтовый сервер.

ДИСКЛЕЙМЕР: as is, ну вы понимаете

В зависимости от операционной системы
CentOS - /etc/exim/exim.conf
или
Debian - /etc/exim4/exim4.conf.template

Ищем секцию - AUTHENTICATION CONFIGURATION - добавляем в зависимости от используемой внешней почты:

Yandex

Code: Select all

yandex_login:
  driver = plaintext
  public_name = LOGIN
  hide client_send = : [email protected] : password
или

Gmail

Code: Select all

gmail_login:
  driver = plaintext
  public_name = LOGIN
  hide client_send = : [email protected] : password
Ищем секцию - ROUTERS CONFIGURATION - добавляем в зависимости от используемой внешней почты:

Yandex

Code: Select all

yandex_route:
  driver = manualroute
  transport = yandex_relay
  route_list = * smtp.yandex.ru
или

Gmail

Code: Select all

gmail_route:
  driver = manualroute
  transport = yandex_relay
  route_list = * smtp.gmail.com
Ищем секцию - TRANSPORTS CONFIGURATION - добавляем в зависимости от используемой внешней почты:

Yandex

Code: Select all

yandex_relay:
  driver = smtp
  port = 587
  hosts_require_auth = $host_address
  hosts_require_tls = $host_address
или

Gmail

Code: Select all

gmail_relay:
  driver = smtp
  port = 587
  hosts_require_auth = $host_address
  hosts_require_tls = $host_address
Ищем секцию - REWRITE CONFIGURATION - добавляем в зависимости от используемой внешней почты:

Yandex или

Gmail И перезапускаем почтовый сервер:
CentOS

Code: Select all

service exim restart
Debian

Code: Select all

service exim restart

Re: Почта и смартхост на скорую руку

Posted: Fri Mar 27, 2015 9:02 pm
by Mihanja80
skurudo, спасибо Вам большое, я впервые получил письмо об удачном бекапе запущеном вручную (банально хотелось увидеть это письмо от панели).
Думаю данное решение многим поможет.

Re: Почта и смартхост на скорую руку

Posted: Sat Mar 28, 2015 8:54 am
by skurudo
Mihanja80 wrote:Думаю данное решение многим поможет.
Будем надеяться :)
Спасибо, что предоставили площадку для этого эксперимента и написания гайда соответственно.

Re: Почта и смартхост на скорую руку

Posted: Sat Apr 18, 2015 1:24 pm
by webvp
Здравствуйте, настроил, проверил, все работает, но как сделать так чтобы в письмах в поле от отображался ящик не внешней почты через, который все настроено а тот с которого отправляют с сервера? Получается все письма с сервера приходят с одного ящика, независимо с какого аккаунта и почтового домена отправляются письма. Так-же обратил внимание, что перестали приходить письма на ящики, которые на сервере, а приходят письма Mail Delivery System <ящик@gmail.com> о невозможности доставить, до этого все входящие письма на сервер приходили, не работали только исходящие, т.к. заблокирован 25 порт. Спасибо.

Re: Почта и смартхост на скорую руку

Posted: Sat Apr 18, 2015 11:29 pm
by skurudo
webvp wrote:Здравствуйте, настроил, проверил, все работает, но как сделать так чтобы в письмах в поле от отображался ящик не внешней почты через, который все настроено а тот с которого отправляют с сервера? Получается все письма с сервера приходят с одного ящика, независимо с какого аккаунта и почтового домена отправляются письма. Так-же обратил внимание, что перестали приходить письма на ящики, которые на сервере, а приходят письма Mail Delivery System <ящик@gmail.com> о невозможности доставить, до этого все входящие письма на сервер приходили, не работали только исходящие, т.к. заблокирован 25 порт. Спасибо.
Скажу сразу, смартхост - это не очень хорошее решение. Используется оно исключительно от отчаяния, т.к. бывает перекрывают 25 порт и ничего с этим не сделать. Перейти к другому хостеру - не всегда вариант. Но это _не_ хорошее решение. Хорошее решение - это штатная отправка почты exim + DKIM + PRT/SPF/DMARC.

Так и есть, письма отправляются с одного ящика. Вы, конечно можете попробовать обмануть и добавить в поле FROM что-нибудь от себя:

Code: Select all

mail('[email protected]', 'Тема письма', 'Тело письма', 'From: [email protected]');
или же добавить в настройки вебсервера apache для домена

Code: Select all

php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f [email protected]"
Входящую почту у вас принимает не exim, а dovecot. Как понимаете, правки в exim у вас вряд ли бы повлияли на. Для понимания хотелось бы подробностей, обычно они есть в клуджах - теле письма... кажется в гмейле это называлось "оригинал письма". Ну и в логи заглянуть не помешает, конечно же.

Re: Почта и смартхост на скорую руку

Posted: Sun Apr 19, 2015 10:33 am
by webvp
Хорошее решение - это штатная отправка почты exim + DKIM + PRT/SPF/DMARC
Я так понимаю, что такое решение с закрытым 25 портом не получится реализовать или я ошибаюсь?
Уже несколько дней мучаюсь почтой, так пока и не получилось заставить нормально работать отправку писем с сервера. Может есть еще варианта настройки? Открыт порт 2525.
Лог exim:
2015-04-19 13:03:51 1Yjm4t-0002UL-Lg <= [email protected] U=admin P=local S=615 id=[email protected]
2015-04-19 13:03:51 1Yjm4t-0002UL-Lg == [email protected] R=dnslookup T=remote_smtp defer (-53): retry time not reached for any host

Re: Почта и смартхост на скорую руку

Posted: Mon Apr 20, 2015 8:22 am
by webvp
webvp wrote:
Хорошее решение - это штатная отправка почты exim + DKIM + PRT/SPF/DMARC
Я так понимаю, что такое решение с закрытым 25 портом не получится реализовать или я ошибаюсь?
Уже несколько дней мучаюсь почтой, так пока и не получилось заставить нормально работать отправку писем с сервера. Может есть еще варианта настройки? Открыт порт 2525.
Лог exim:
2015-04-19 13:03:51 1Yjm4t-0002UL-Lg <= [email protected] U=admin P=local S=615 id=[email protected]
2015-04-19 13:03:51 1Yjm4t-0002UL-Lg == [email protected] R=dnslookup T=remote_smtp defer (-53): retry time not reached for any host

Получилось настроить через relay провайдера без авторизации на 25 порт, 25 порт открыт только на его релей, письма приходят от ящиков доменов сервера, внутри письма ходят, во внешний инет ходит, но появилась проблема, если в свойсвах ящика ставишь перенаправление например на другой любой ящик с сохранением или без сохранения (без разницы), то письма не доходят на перенаправляемый ящик, и сразу приходит письмо о невозможной доставке и помечаются сразу как frozen, где что подправить не могу понять вот конфиг exim:

Code: Select all

######################################################################
#                                                                    #
#          Exim configuration file for Vesta Control Panel           #
#                                                                    #
######################################################################

#SPAMASSASSIN = yes
#SPAM_SCORE = 50
#CLAMD =  yes
domainlist local_domains = dsearch;/etc/exim/domains/
domainlist relay_to_domains = dsearch;/etc/exim/domains/
hostlist relay_from_hosts = 127.0.0.1 : 134.249.136.91
hostlist whitelist = net-iplsearch;/etc/exim/white-blocks.conf
hostlist spammers = net-iplsearch;/etc/exim/spam-blocks.conf
no_local_from_check
untrusted_set_sender = *
acl_smtp_connect = acl_check_spammers
acl_smtp_mail = acl_check_mail
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
acl_smtp_mime = acl_check_mime

.ifdef SPAMASSASSIN
spamd_address = 127.0.0.1 783
.endif

.ifdef CLAMD
av_scanner = clamd: /var/run/clamav/clamd.sock
.endif

tls_advertise_hosts = *
tls_certificate = /usr/local/vesta/ssl/certificate.crt
tls_privatekey = /usr/local/vesta/ssl/certificate.key

daemon_smtp_ports = 25 : 465 : 587 : 2525
tls_on_connect_ports = 465
never_users = root
host_lookup = *
rfc1413_hosts = *
rfc1413_query_timeout = 5s
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d

DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /etc/exim/domains/${lc:${domain:$h_from:}}/dkim.pem
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}



######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################
begin acl

acl_check_spammers:
  accept  hosts         = +whitelist

  drop    message       = Your host in blacklist on this server.
          log_message   = Host in blacklist
          hosts         = +spammers

  accept


acl_check_mail:
  deny    condition     = ${if eq{$sender_helo_name}{}}
          message       = HELO required before MAIL

  drop    message       = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid
          condition     = ${if match{$sender_helo_name}{\N((\d{1,3}[.-]\d{1,3}[.-]\d{1,3}[.-]\d{1,3})|([0-9a-f]{8})|([0-9A-F]{8}))\N}{yes}{no}}
          condition     = ${if match {${lookup dnsdb{>: defer_never,ptr=$sender_host_address}}\}{$sender_helo_name}{no}{yes}}
          delay         = 45s

  drop    condition     = ${if isip{$sender_helo_name}}
          message       = Access denied - Invalid HELO name (See RFC2821 4.1.3)

  drop    condition     = ${if eq{[$interface_address]}{$sender_helo_name}}
          message       = $interface_address is _my_ address

  accept


acl_check_rcpt:
  accept  hosts         = :

  deny    message       = Restricted characters in address
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  deny    message       = Restricted characters in address
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  require verify        = sender

  accept  hosts         = +relay_from_hosts
          control       = submission

  accept  authenticated = *
          control       = submission/domain=

  deny    message       = Rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
          hosts         = !+whitelist
          dnslists      = ${readfile {/etc/exim/dnsbl.conf}{:}}

  require message       = relay not permitted
          domains       = +local_domains : +relay_to_domains

  deny    message       = smtp auth requried
         sender_domains = +local_domains
         !authenticated = *

  require verify        = recipient

.ifdef CLAMD
  warn    set acl_m0    = no

  warn    condition     = ${if exists {/etc/exim/domains/$domain/antivirus}{yes}{no}}
          set acl_m0    = yes
.endif

.ifdef SPAMASSASSIN
  warn    set acl_m1    = no

  warn    condition     = ${if exists {/etc/exim/domains/$domain/antispam}{yes}{no}}
          set acl_m1    = yes
.endif

  accept


acl_check_data:
.ifdef CLAMD
  deny   message        = Message contains a virus ($malware_name) and has been rejected
         malware        = *
         condition      = ${if eq{$acl_m0}{yes}{yes}{no}}
.endif

.ifdef SPAMASSASSIN
  warn   !authenticated = *
         hosts          = !+relay_from_hosts
         condition      = ${if < {$message_size}{100K}}
         condition      = ${if eq{$acl_m1}{yes}{yes}{no}}
         spam           = nobody:true/defer_ok
         add_header     = X-Spam-Score: $spam_score_int
         add_header     = X-Spam-Bar: $spam_bar
         add_header     = X-Spam-Report: $spam_report
         set acl_m2     = $spam_score_int

  warn   condition      = ${if !eq{$acl_m2}{} {yes}{no}}
         condition      = ${if >{$acl_m2}{SPAM_SCORE} {yes}{no}}
         add_header     = X-Spam-Status: Yes
         message        = SpamAssassin detected spam (from $sender_address to $recipients).
.endif

  accept


acl_check_mime:
  deny   message        = Blacklisted file extension detected
         condition      = ${if match {${lc:$mime_filename}}{\N(\.ade|\.adp|\.bat|\.chm|\.cmd|\.com|\.cpl|\.exe|\.hta|\.ins|\.isp|\.jse|\.lib|\.lnk|\.mde|\.msc|\.msp|\.mst|\.pif|\.scr|\.sct|\.shb|\.sys|\.vb|\.vbe|\.vbs|\.vxd|\.wsc|\.wsf|\.wsh)$\N}{1}{0}}

  accept



######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################
begin authenticators

dovecot_plain:
  driver = dovecot
  public_name = PLAIN
  server_socket = /var/run/dovecot/auth-client
  server_set_id = $auth1

dovecot_login:
  driver = dovecot
  public_name = LOGIN
  server_socket = /var/run/dovecot/auth-client
  server_set_id = $auth1



######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################
begin routers

smarthost:
  driver = manualroute
 domains = ! +local_domains
  transport = remote_smtp
  route_list = * smtprelay.kyivstar.ua
  no_verify
  no_more

dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  no_more

userforward:
  driver = redirect
  check_local_user
  file = $home/.forward
  allow_filter
  no_verify
  no_expn
  check_ancestor
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply

procmail:
  driver = accept
  check_local_user
  require_files = ${local_part}:+${home}/.procmailrc:/usr/bin/procmail
  transport = procmail
  no_verify

autoreplay:
  driver = accept
  require_files = /etc/exim/domains/$domain/autoreply.${local_part}.msg
  condition = ${if exists{/etc/exim/domains/$domain/autoreply.${local_part}.msg}}{yes}{no}}
  retry_use_local_part
  transport = userautoreply
  unseen

aliases:
  driver = redirect
  headers_add = X-redirected: yes
  data = ${extract{1}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim/domains/$domain/aliases}}}}
  require_files = /etc/exim/domains/$domain/aliases
  redirect_router = dnslookup
  pipe_transport = address_pipe
  unseen

localuser_fwd_only:
  driver = accept
  transport = devnull
  condition = ${if exists{/etc/exim/domains/$domain/fwd_only}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/fwd_only}{true}{false}}}}

localuser_spam:
  driver = accept
  transport = local_spam_delivery
  condition = ${if eq {${if match{$h_X-Spam-Status:}{\N^Yes\N}{yes}{no}}} {${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}{yes}{no_such_user}}}}

localuser:
  driver = accept
  transport = local_delivery
  condition = ${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}{true}{false}}

catchall:
  driver = redirect
  headers_add = X-redirected: yes
  require_files = /etc/exim/domains/$domain/aliases
  data = ${extract{1}{:}{${lookup{*@$domain}lsearch{/etc/exim/domains/$domain/aliases}}}}
  file_transport = local_delivery
  redirect_router = dnslookup

terminate_alias:
  driver = accept
  transport = devnull
  condition = ${lookup{$local_part@$domain}lsearch{/etc/exim/domains/$domain/aliases}{true}{false}}


######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
begin transports

remote_smtp:
  driver = smtp
 #helo_data = $sender_address_domain
  dkim_domain = DKIM_DOMAIN
  dkim_selector = mail
  dkim_private_key = DKIM_PRIVATE_KEY
  dkim_canon = relaxed
  dkim_strict = 0

procmail:
  driver = pipe
  command = "/usr/bin/procmail -d $local_part"
  return_path_add
  delivery_date_add
  envelope_to_add
  user = $local_part
  initgroups
  return_output

local_delivery:
  driver = appendfile
  maildir_format
  maildir_use_size_file
  user = ${extract{2}{:}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}}}}
  group = mail
  create_directory
  directory_mode = 770
  mode = 660
  use_lockfile = no
  delivery_date_add
  envelope_to_add
  return_path_add
  directory = "${extract{5}{:}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}}}}/mail/$domain/$local_part"
  quota = ${extract{6}{:}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}}}}M
  quota_warn_threshold = 75%

local_spam_delivery:
  driver = appendfile
  maildir_format
  maildir_use_size_file
  user = ${extract{2}{:}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}}}}
  group = mail
  create_directory
  directory_mode = 770
  mode = 660
  use_lockfile = no
  delivery_date_add
  envelope_to_add
  return_path_add
  directory = "${extract{5}{:}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}}}}/mail/$domain/$local_part/.Spam"
  quota = ${extract{6}{:}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}}}}M
  quota_directory = "${extract{5}{:}{${lookup{$local_part}lsearch{/etc/exim/domains/$domain/passwd}}}}/mail/$domain/$local_part"
  quota_warn_threshold = 75%

address_pipe:
  driver = pipe
  return_output

address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

address_reply:
  driver = autoreply

userautoreply:
  driver = autoreply
  file = /etc/exim/domains/$domain/autoreply.${local_part}.msg
  from = "${local_part}@${domain}"
  subject = "${if def:h_Subject: {Autoreply: ${quote:${escape:$h_Subject:}}} {Autoreply Message}}"
  to = "${sender_address}"

devnull:
  driver = appendfile
  file = /dev/null


######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################
begin retry

# Address or Domain    Error       Retries
# -----------------    -----       -------
*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h



######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################
begin rewrite


######################################################################

Re: Почта и смартхост на скорую руку

Posted: Mon Apr 20, 2015 2:41 pm
by skurudo
webvp wrote:если в свойсвах ящика ставишь перенаправление например на другой любой ящик с сохранением или без сохранения (без разницы), то письма не доходят на перенаправляемый ящик
В этот момент стоит заглянуть в /var/log/exim/mainlog и поглядеть, что на самом деле происходит и почему письмо фрозится.

Re: Почта и смартхост на скорую руку

Posted: Mon Apr 20, 2015 2:43 pm
by skurudo
webvp wrote:Я так понимаю, что такое решение с закрытым 25 портом не получится реализовать или я ошибаюсь?
Уже несколько дней мучаюсь почтой, так пока и не получилось заставить нормально работать отправку писем с сервера.
Лучший вариант - открытые порты.

Традиционно можно оставить только рабочие порты:

Code: Select all

daemon_smtp_ports = 25 : 465 : 587 : 2525
tls_on_connect_ports = 465

Re: Почта и смартхост на скорую руку

Posted: Tue May 19, 2015 10:26 am
by Scarabey2001
Попробовал - не взлетело:
SpoilerShow
exim -bt [email protected]
LOG: MAIN
remote host address is the local host: selfer.org (while routing <[email protected]>)
[email protected] cannot be resolved at this time: remote host address is the local host