建立ISPmail-虚拟域名

2014年2月17日 分类: ISPmail (111 个脚步)

本文章为原创翻译文章,转载请保留来源。原文来自 Christoph Haas 网站:https://workaround.org/ispmail/wheezy/virtual-domains

虚拟域名

让我们从电子邮件域中Postfix可以处理的一些基本理论和三种不同的域之间的区别。这是你需要了解的一个非常重要的概念。大概一半急切的读者支持帮助是由这里的误解造成的。
所以请不要跳过这一部分而是把你的时间了解来此事。

本页只是解释概念,并不能帮你的服务器做什么。想要找到更多的信息参见Postfix网站的虚拟域名文档。:)

本地域

Postfix是一个使用SMTP语言来发送和接受来自互联网电子邮件的软件。通常Postfix可以识别本地域和本地用户。

这就意味着所有系统用户将会收到来自任意的本地域的邮件。配置上的mydestination列出了所有本地域。

例如:让我们假设你创建了一个系统的用户"johndoe"(例如,使用 adduser 命令)。这个简单的设置会使得Postfix将接收到以下邮箱的邮件:

  • johndoe@example.org
  • johndoe@example.com
  • johndoe@example.net

Postfix自动接收这些用户的邮件并保存在/var/mail/johndoe下。其局限性是不能使johndoe的帐户在其中一个域上工作。

因此在不同的域,不同的用户是不可能的。也不是在很多用户下,你都得为他们创一个系统帐户。
不过它仍然是一个好的想法,去设置至少一个本地域的情况下,配置或运行其他类型的域的问题。

如果你没有创造性并不真的需要一个本地域,那么 “mydestination =localhost” 是一个安全的选择。

虚拟邮箱域

这个类型的域,是这个教程中最重要的一种。虚拟邮箱域也是一个用来接收电子邮件域,但你不使用系统的用户(/etc/passwd)在域指定有效的电子邮件地址。相反,你明确告诉Postfix那个地址是有效的。

用一个文本文件这种简单的方法来配置这样的域和用户。

设想以下收件人的电子邮件地址和映射到磁盘上的对应关系:

虚拟用户 虚拟邮箱存储位置
john@example.org /var/mail/example.org/john/Maildir
jack@example.org /var/mail/example.org/jack/Maildir
jack@example.com /var/mail/example.com/jack/Maildir

你将有2个域名:example.org和example.com。所以第一步你必须告诉Postfix这些域名。在 Postfix 配置文件中修改 

virtual_mailbox_domains = example.org example.com

接下来你需要告诉Postfix那个电子邮件地址来准备接收邮件和存放接收邮件后的位置。相应的文本文件可以存储在/etc/Postfix/virtual_mailbox_users,看起来像这样:

john@example.org  /var/vmail/example.org/john/Maildir
jack@example.org  /var/vmail/example.org/jack/Maildir
jack@example.com  /var/vmail/example.com/jack/Maildir

正如你所看到的,有效的电子邮件地址是指定放在左侧的列;每个收件人收到的邮件的磁盘存放地址放在右侧。
在 Postfix 的文档也可以发现缩写LHS “left hand side”-这意味着左栏。同样,右边是“right hand side”-右列。这样有两列的表也被称为映射或哈希表。

在上面的例子中,我已经在 Postfix 中设置了默认的虚拟域。("virtual_mailbox_domains = example.org example.com")。
很明显,许多域这是不可行的,这就是为什么你还可以使用映射文件来配置域。
让我们假设你创建这样一个文件/Postfix/ virtual_mailbox_domains和它看起来像这样:

example.org  OK
example.com  OK

你可能想知道,为什么我们不只是列出每行一个域在这个文件中。原因是,一个映射文件通常有两列。
在这样一个“一维”映射(域列表)Postfix不在乎你的第二列。它甚至可以不是“OK”,可以是任何东西。
如果你决定了这样的文本文件也可以,那你仍然要对他们通过运行 postmap 命令编译这些文件。

postmap /etc/postfix/virtual_mailbox_domains
postmap /etc/postfix/virtual_mailbox_users

postmap 使将创建基于上述文件名称不过会使用.db后缀,Postfix 不会自动化-这是一个常见的问题。
Postfix只会遵守*.db文件,所以当你修改对应关系时,不要忘记运行一下 postmap命令。
为了使这些映射称被Postfix所知道,你要把下面的几条加入到main.cf文件来:

virtual_mailbox_domains = hash:/etc/postfix/virtual_mailbox_domains
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_users

现在你已经有了你需要的工具在文本文件中来建立成千上万的域和用户了,太棒了。但实际上我承诺,我们将存储数据在一个MySQL数据库上。幸运的是,这比在文本文件上简单。

记住,映射关系是一个简单的方法来让一个值对应另一个值。所以我们需要告诉Postfix 怎么从数据前中去获取2个元素的对应关系。

这些会通过.cf配置文件来完成(参考 http://www.postfix.org/MYSQL_README.html 或者在shell中运行命令 man 5 mysql_table)。

例如 virtual_mailbox_maps.cf 这个文件:

# Mysql 用户信息配置
user = someone
password = password
hosts = 127.0.0.1

# 数据库名
dbname = mailserver

# 查询语句
query = SELECT mailbox_path FROM virtual_users WHERE email_address='%s'

假设你有一个含有2个字段的数据表。在表中,左边用email_address字段表示,右边用mailbox_path字段表示。

所以这个sql查询语句从给出的邮箱地址(email_address)得出右边的元素(mailbox_path). 占位符%s 由Postfix每次查询的时候自动填充到左边栏(email_address).

需要注意的是,这里的查找必须只返回数据库的一行。Postfix 必须知道所给用户的邮箱唯一的存放地址。

虽然还有其他的映射关系允许左边和右边是一对多的关系。例如下一节我们将会介绍虚拟别名。

要使用上面的配置文件,你必须在Postfix配置文件中配置他们:

virtual_mailbox_maps = mysql:virtual_mailbox_maps.cf

如果后来你发现,这种映射没有做你想要的,那么使用postmap -q命令去给Postfix一个邮箱地址,看返回什么信息给我们。返回john@example.org的存放地址。

postmap -q john@example.org mysql:virtual_mailbox_maps.cf

Postfix将会用john@example.org作为参数来执行Sql查询语句:

SELECT mailbox_path FROM virtual_users WHERE email_address='john@example.org'

执行的结果为:

/var/mail/example.org/john/Maildir

(注:在这个教程中,我们不会直接让Postfix接受邮件,相反它将收到的电子邮件交到 Dovecot。所以我们不会在本教程中使用上述virtual_mailbox_maps。 不过了解Postfix如何处理虚拟用户他仍然是非常重要的)

虚拟别名域

虚拟别名域用于从一个邮箱地址转发邮件到一个或多个电子邮件地址。虚拟别名域不能接收电子邮件,不能保存到您服务器的磁盘上。他们只将邮件转发到别的地方去。

该virtual_alias_maps映射包含控制用户转发(源,目的地)或者其他电子邮件货整个域。顺带说一句,virtual_alias_maps遵守任何收到的电子邮件。

因此在大多数情况下,你真的不需要虚拟别名域可以声明所有域的虚拟邮箱域和使用虚拟别名映射为转发的目的。

在技术上的定义一个作为虚拟别名的域,使Postfix接受那个域的邮件,但是你仍然需要在virtual_alias_maps映射让Postfix在那里转发电子邮件。

virtual_alias_maps注意事项: 他们可以为一个左边源(原始收件人)返回多个右边的目的地(转发),你可以转发电子邮件的时候发送给多个收件人。

例1:转发john@example.org所有的电子邮件到 jeff@example.com

john@example.org   jeff@example.com

这是一个简单的例子。你有源(john@example.org)和目的地(jeff@example.com)的转发,John永远接收不到邮件。

例2:为转发john@example.org所有的电子邮件,john@example.com也会收到一份副本。

john@example.org john@example.org
john@example.org jeff@example.com

这是一个比较棘手的。如果Postfix用john@example.org查询映射关系,将会得到2个结果。(Postfix足够聪明不去创建一个循环而明白你想要一个邮件副本)。这与用逗号分隔开的一行上接收结果相同:

john@example.org   john@example.org, jeff@example.com

例3: 转发example.org中的任何用户的邮件到 joe@example.com

@example.org   joe@example.com

这就是所谓的分沫器,它将接受example.org任何用户的邮件并转发到joe@example.com。假如虚拟用户jill@example.org没有被正确的定义,他的邮件将会被分沫器捕获,并转发给 joe@example.com。

注意,分沫器会捕捉大量的垃圾邮件。他们可能看起来很舒服因为他们将所有邮件发送给一个人而并不需要创建别名。
但垃圾邮件制造者经常尝试猜测已知域名的邮箱地址,当你用分沫器时,你将收到垃圾邮件从任何猜测出来的电子邮件地址。
避免他们并定义现有的电子邮箱地址,即便是做多点工作。

建立ISPmail-虚拟域名 【声明】本文 建立ISPmail-虚拟域名 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2014/02/ispmail-virtual-domains/ , 转载请保留本声明!

标签: , , , , , ,
目前还没有任何评论.
你必须要启用 Javascript