Exim:强制本地域用户的电子邮件validation

我用dovecot和postgresql为虚拟用户configuration了exim4,而且我遇到了一个问题,我无法解决,情况是这样的:

我需要,当一个'localdomain'用户试图发送电子邮件到另一个'localdomain'用户或外国用户,需要authentication,否则拒绝操作。

实际上,我试图避免任何types的smtp开放中继。

其实smtp工作正常,只需要设置该要求,我找不到正确的方式来configurationexim正确的获取此行为(是acl或路由或传输规则?)

我怎样才能定义这个configuration?

例1

 220 my-server ESMTP Exim 4.84 2016年3月31日星期四22:26:28 +0000
 ehlo localhost
 250-my-server Hello localhost [192.168.1.X]
 250-SIZE 52428800
 250-8BITMIME
 250stream水
 250-AUTH PLAINlogin
 250帮助
邮件来自:[email protected]
 250 OK
 rcpt to:[email protected]
 250接受
数据 
input消息,以“。”结尾。 在一条线上
这一定不会发生,用户“[email protected]”没有被authentication,
他一定不能发送任何消息,直到使用 
 'auth login'或'auth plain',因为是本地域的用户。
 。
 250 OK id = 1all3Q-0004l2-V4

例2

 220 my-server ESMTP Exim 4.84 2016年3月31日星期四22:58:56 +0000
 ehlo localhost
 250-my-server Hello localhost [192.168.1.X]
 250-SIZE 52428800
 250-8BITMIME
 250stream水
 250-AUTH PLAINlogin
 250帮助
邮件来自:[email protected]
 250 OK
转到:[email protected]
 250接受
数据
input消息,以“。”结尾。 在一条线上
这已经是有效的了。
 。
 250 OK id = 1allZR-00050E-Sq

ACL RCPT-TOconfiguration文件

 acl_check_rcpt:
  接受
     hosts =:
     control = dkim_disable_verify

   .ifdef CHECK_RCPT_LOCAL_LOCALPARTS
  拒绝
     domains = + local_domains
     local_parts = CHECK_RCPT_LOCAL_LOCALPARTS
    消息=地址中的限制字符
   。万一

  拒绝
     domains =!+ local_domains
     local_parts = CHECK_RCPT_REMOTE_LOCALPARTS
    消息=地址中的限制字符
   。万一

  接受
     .ifndef CHECK_RCPT_POSTMASTER
     local_parts = postmaster
     。其他
     local_parts = CHECK_RCPT_POSTMASTER
     。万一
     domains = + local_domains:+ relay_to_domains

   .ifdef CHECK_RCPT_VERIFY_SENDER
  拒绝
    消息=失败!
     !acl = acl_local_deny_exceptions
     !validation=发件人
   。万一

  拒绝
     !acl = acl_local_deny_exceptions
    发件人= $ {if exists exists {CONFDIR / local_sender_callout} \
                          {CONFDIR / local_sender_callout} \
                    {}}
     !validation=发件人/标注

  接受
     hosts = + relay_from_hosts
     control = submission / sender_retain
     control = dkim_disable_verify

  接受
    authentication= *
     control = submission / sender_retain
     control = dkim_disable_verify

  要求
    消息=中继拒绝!
     domains = + local_domains:+ relay_to_domains

  要求
    validation=收件人

  拒绝
     !acl = acl_local_deny_exceptions
     recipients = $ {if exists exists(CONFDIR / local_rcpt_callout)\
                             {CONFDIR / local_rcpt_callout} \
                       {}}
     !validation=收件人/标注

  拒绝
     message =发件人信封地址$ sender_address在本地被列入黑名单。 如果您认为这是错误的,请联系postmaster
     !acl = acl_local_deny_exceptions
    发件人= $ {if exists {CONFDIR / local_sender_blacklist} \
                    {CONFDIR / local_sender_blacklist} \
                    {}}

  拒绝
     message =发件人IP地址$ sender_host_address在本地被列入黑名单。 如果您认为这是错误的,请联系postmaster
     !acl = acl_local_deny_exceptions
     hosts = $ {if exists {CONFDIR / local_host_blacklist} \
                  {CONFDIR / local_host_blacklist} \
                  {}}

  接受
    域= + relay_to_domains
     endpass
    validation=收件人

  接受

只要确保local_domains不包括任何你想要validation的主机。 这将防止这些服务器的开放中继情况。

但是,服务器通过MX将电子邮件发送到互联网是很常见的。 一般来说,在这种情况下你不需要authentication。

确保relay_to_domains是空的,或只包含您想允许中继的域。 (您是此列表中任何域的开放中继。)

确保您在接受AUTH请求之前需要STARTTLS。 否则,您的密码将很容易被嗅探。

最后,我自己解决了这个问题,我只需要将下一条语句添加到我的aclconfiguration文件中:

接受
   消息=必须validation
    domains = + local_domains:+ relay_to_domains
   发件人=:正则expression式

这也可以通过条件statemen和perl脚本来解决。

谢谢您的帮助。