我正在配置主机 + 邮件设置。我有一台服务器用于托管网站,还有一台服务器用于 smtp/imap/dovecat 服务器。
据我研究,允许我的客户拥有自己的邮箱而又不必在服务器上为他们创建用户的唯一合理方法是使用虚拟箱。
因此,我已将“域”表配置为 Postfix 的虚拟框源。除了一种情况外,它运行良好。
我有一个使用 Google Apps 托管的域名。因此,由于 DNS 条目,该域名位于我们的“域名”表中,并且被标识为 Postfix 的虚拟框。当我尝试从服务器中的另一个虚拟框向该用户发送电子邮件时,Postfix 会尝试在本地服务器中查找收件人,并抛出以下错误:
Dec 26 17:45:14 mail postfix/smtpd[4833]: NOQUEUE: reject: RCPT from localhost[::1]: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in virtual mailbox table;
我查看了 postfix 文档,发现这是设计使然;每个虚拟框都假定托管在本地服务器中。但这样一来,我就需要在服务器中为每个托管用户创建实际用户,这听起来真的很糟糕,而且托管面板通常不会这样做。
我考虑创建一个单独的表来存储虚拟邮箱,这样如果用户在我们的服务器中创建了邮件帐户,我只会向该表添加一个条目,但这仍然不理想。如果用户在我们的服务器中添加了一个邮箱,然后切换到 Google Apps,他将被要求删除我们服务器中的邮箱,否则我们的其他客户将无法向他发送邮件,因为他仍然在虚拟邮箱表中。
我可以做些什么不同的事情来不需要在我们的服务器中为每个托管用户创建真实用户,但仍然允许我们的客户使用 Google Apps?
为了说清楚,我想要的是:
- 功能齐全的 SMTP、POP3 和 IMAP 服务器
- 用户在发送邮件或访问邮箱之前需要进行身份验证(我使用 dovecot 来处理身份验证:
password_query = SELECT email as user, password FROM EmailAccount WHERE email='%u'
;此 EmailAccount 表与 postfix 用于识别虚拟邮箱的表相同) - 使用我们的邮件服务器发送的每封电子邮件都需要投递到收件人域的 MX 记录中配置的服务器。收件人的域中是否有我们托管的应用程序并不重要。例如:域
example.com
可能在我们的服务器中托管一个 PHP 应用程序,但它使用 Google Appls 发送/接收电子邮件。Ee 在表中有一个user
包含此域的条目,因为有人在我们的网站上购买了托管服务。此表与 Postfix 用来识别虚拟用户的表相同。我希望我们公司的每个客户都能够写信给[email protected]
,并且这封电子邮件必须投递给 Google,因为 example.com 的 MX 记录指向 Google 服务器。不应考虑这example.com
是一个虚拟邮箱;我希望 Postfix 始终获取 MX 记录以找出用于投递此邮件的 IP。 - 如果以后
example.com
他想在我们这里托管电子邮件,我只希望他将他的 MX 指向我们的服务器并在我们的服务器上创建一个电子邮件帐户。因此,我们将在EmailAcount
表中插入一条新记录,其中包含他应该用来获取电子邮件(使用 POP3/IMAP)和结束电子邮件(使用 SMTP)的密码。 - 如果他稍后再次决定切换到 Google Apps,我希望他只将其 MX 记录更改为 Google 网络服务器,并且我们的 postfix 实例将不再尝试将任何域的电子邮件传递
example.com
到我们自己的服务器。
答案1
如果您希望 Postfix 将邮件转发到 Google Apps 上的此域,则应将其列在relay_domains
, 反而。
如果您已将域配置为本地交付,Postfix 将把它作为本地域处理,而不会关心 MX 记录。唯一的方法是从导致它由本地服务的任何配置中删除该域。