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

Postfix + Dovecot слишком долго отправляет электронные письма

Я получаю 504 ошибки при попытке отправить электронную почту на моем сайте Rails 4.2 с помощью dovecot и postfix. У меня также есть асинхронный почтовый сервер, настроенный с использованием Redis и Sidekiq, когда я отправляю асинхронные электронные письма, их отправка занимает от 5 до 30 минут.

Мой почтовый сервер работает в том же ящике, что и мой сайт, но интересно то, что когда я запускаю свой сервер разработки на моем домашнем компьютере, он подключается к почтовому серверу моего сайта и отправляет почту быстро и без проблем.

Я пробовал просмотреть свои mail.log а также любой другой журнал в моем /var/log каталог, но я не вижу ничего, пока я жду отправки почты, кроме нескольких спам-атак (я запускаю SpamAssassin, чтобы их закрыть).

Мой журнал сервера rails также не показывает ничего полезного, просто регистрирует, что электронное письмо было обработано (не отправлено), а затем перезапускает сервер через минуту.

На обоих серверах разработки и производства я использую для подключения следующее:

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
    :address => 'mail.mysite.com',
    :domain => 'mysite.com',
    :port => 587,
    :authentication => :plain,
    :enable_starttls_auto => true,
    :openssl_verify_mode  => 'none',
    :user_name => 'myuser@mysite.com',
    :password => 'test'
}
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

Вот результат dovecot -n:

# 2.2.9: /etc/dovecot/dovecot.conf
# OS: Linux 4.2.0-23-generic x86_64 Ubuntu 14.04.4 LTS
auth_mechanisms = plain login
mail_location = maildir:~/Maildir
mail_privileged_group = mail
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date ihave
namespace inbox {
  location =
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix =
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
plugin {
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
}
protocols = imap pop3 sieve
service auth-worker {
  user = vmail
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0666
    user = postfix
  }
  unix_listener /var/spool/postfix/private/dovecot-auth {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
  user = dovecot
}
service imap-login {
  inet_listener imap {
    port = 0
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
}
ssl_cert = </etc/dovecot/dovecot.pem
ssl_cipher_list = ALL:!LOW:!SSLv2:ALL:!aNULL:!ADH:!eNULL:!EXP:RC4+RSA:+HIGH:+MEDIUM
ssl_key = </etc/dovecot/private/dovecot.pem
userdb {
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
  driver = static
}
protocol pop3 {
  mail_max_userip_connections = 10
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol imap {
  imap_client_workarounds = delay-newmail
  mail_max_userip_connections = 10
}
protocol lda {
  deliver_log_format = msgid=%m: %$
  mail_plugins = sieve
  postmaster_address = postmaster
  quota_full_tempfail = yes
  rejection_reason = Your message to <%t> was automatically rejected:%n%r
}

И postconf -n:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = all
mailbox_command = /usr/lib/dovecot/deliver -c /etc/dovecot/dovecot.conf -m "${EXTENSION}"
mailbox_size_limit = 0
mydestination = localhost
myhostname = mysite.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
queue_directory = /var/spool/postfix
readme_directory = no
recipient_delimiter = +
relayhost =
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_recipient_restrictions = permit_sasl_authenticated
smtpd_relay_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/nginx/ssl/ssl-bundle.crt
smtpd_tls_key_file = /etc/nginx/ssl/server.key
smtpd_use_tls = yes
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_transport = dovecot

Моя проблема оказалась двоякой:

  1. Мне нужно было добавить permit_mynetworks к smtpd_recipient_restrictions

    Мой postfix/main.cf требовал, чтобы у меня было

    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
    smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks
    


  1. Поскольку у меня работает два сервера Sidekiq, мне нужно было использовать отдельные очереди

    Я запускаю промежуточный и производственный сервер на одном компьютере, оказалось, что электронные письма часто попадали в неправильную очередь, что вызывало исключения, а электронные письма впоследствии снова ставились в очередь и еще больше задерживались. Чтобы обойти это, мне нужно было разделить очереди, изменив мои config/sidekiq.yml включать:

    :queues:
      - staging
    

    и отправьте электронное письмо следующим образом:

    UserMailer.delay(queue: Rails.env).my_email(args)
    

После этого я обязательно очистил свои очереди Redis и Sidekiq, так как некоторые плохие электронные письма все еще забивали систему, и теперь электронные письма, даже с задержкой, отправляются очень быстро.