我们前二节的内容为这节内容的配置做了很好的前置基础。本次教程我们围绕Postfix的配置参数进行详细的详解,内容有点多,一定要认真的学习和理解。
Postfix 有几百个配置参数,这些参数是 通过 main.cf
文件进行控制。幸运的是,所有参数都有 合理的默认值。在许多情况下,您只需要配置两个或三个参数,然后才能开始使用邮件系统。
默认情况下,Postfix 配置文件位于 /etc/postfix 中。 最重要的两个文件是 main.cf
和 master.cf
。这些文件必须归 root 所有。授予其他人对main.cf
或 master.cf
(或其父目录)的写入权限意味着授予该人员的 root 权限。
:::warning
现在您可以调整软件包安装过程未提示您进行的一些设置。 Postfix 的许多配置设置都在 /etc/postfix/main.cf 文件中定义。 您可以使用 Postfix 的 postconf 命令查询或设置配置设置,而不是直接编辑此文件。
:::
使用 Postfix 内置的配置语法检查来测试你的配置文件,如果没用发现语法错误,不会输出任何内容。
$ sudo postfix check
使用 netstat
来验证 postfix
是否正在监听 25 端口。
$ netstat -ant
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp6 0 0 :::25 :::* LISTEN
查看Postfix的监听情况:
sudo netstat -lnpt
## 显示中有以下信息表示正常
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 2278/master
查看端口的开放情况
sudo nmap <your-server-ip>
## 本示例的root密码为:speedxcn$admin$2023
mysql -u root -p <password>
## 创建数据库servermail
create database exampledb;
## 添加用户并授权
CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL ON exampledb.* TO 'exampleuser'@'localhost';
FLUSH PRIVILEGES;
## 切换到刚建的数据库
USE exampledb;
USE exampledb;
-- 用户管理表 --
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
active BOOLEAN DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ;
-- 中继域名管理表 --
CREATE TABLE relay_domains (
id INT PRIMARY KEY AUTO_INCREMENT,
domain VARCHAR(255) NOT NULL,
active BOOLEAN DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 虚拟邮箱域名管理表 --
CREATE TABLE virtual_domains (
id INT PRIMARY KEY AUTO_INCREMENT,
domain VARCHAR(255) NOT NULL,
active BOOLEAN DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 虚拟用户管理表 --
CREATE TABLE virtual_users (
id INT PRIMARY KEY AUTO_INCREMENT,
domain VARCHAR(255) NOT NULL,
maildir VARCHAR(255) NOT NULL,
active BOOLEAN DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 虚拟邮件转发管理表 --
CREATE TABLE virtual_aliases (
id INT PRIMARY KEY AUTO_INCREMENT,
source VARCHAR(255) NOT NULL,
destination VARCHAR(255) NOT NULL,
active BOOLEAN DEFAULT TRUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
doveadm pw - s SHA256 - CRYPT
是 Dovecot 提供的命令行工具,用于生成使用 SHA256 - CRYPT 算法加密的密码。这通常用于在配置文件(如 dovecot - sql.conf.ext)中设置用户的密码。
以下是使用 doveadm pw - s SHA512 - CRYPT 的基本用法:
doveadm pw -s SHA512-CRYPT
运行此命令后,系统会提示你输入要加密的密码,然后生成相应的 SHA512-CRYPT 加密后的密码。示例:
Enter new password: <123>
{SHA512-CRYPT}$6$y8Xg5FkMoiRGVbuz$JbPmhyAi/Vj82b/KgYJtyWDvj4ioXUg/XgVaBsmfzuwXf77hvCmYkgqnSKEtr/d.GPkzDRAllnIH.zg4VUhbP.
## 示例:
doveadm pw -s SHA512-CRYPT
## 将生成如下密码:
mayi@speedxserver:~$ doveadm pw -s SHA512-CRYPT
doveadm(mayi): Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission denied
Enter new password: <123>
Retype new password: <123>
{SHA512-CRYPT}$6$y8Xg5FkMoiRGVbuz$JbPmhyAi/Vj82b/KgYJtyWDvj4ioXUg/XgVaBsmfzuwXf77hvCmYkgqnSKEtr/d.GPkzDRAllnIH.zg4VUhbP.
理解Postfix 如何实现映射非常重要。系统的核心就是Postfix映射,在这里我们主要讨论这个问题,不要跳过这个部分。
映射通常的字面意义是:在两个值之间建立关系。我们在Postfix中必须映射的是邮件用户帐号和邮件地址。例如Postfix使用的本地别名与本地系统用户映射文件:/etc/aliases, 显示了映射结构:
postmaster: root
## 相当于下面的过程:
postfix的系统用户postmaster将接收到邮件转发到linux本地用户的root,
postmaster为postfix的服务进程的系统用户名称
我们将上面的映射结构分成左手边LHS 和右手边RHS。RHS和LHS 是在映射关系中常用的缩略语。下表更清晰的说明了映射关系。
LHS | RHS |
---|---|
postmaster | root |
Postfix基本默认安装中,我们为映射建立一个文本文件。我们把映射写入文本文件然后用postmap命令把此文本文件转换成一个 hash 文件。以便Postfix 能快速查到此条目。例如,假设我们在一个文件/etc/Postfix/virtual_mailboxes中映射我们的虚拟邮箱。文件结构如下:
[email protected] sigiri
[email protected] kala
然后你需要运行:
postmap -q /etc/postfix/virtual_mailboxes
你可以通过在Postfix配置文件中加入下面这行命令来访问映射:
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailboxes
在我们的安装过程中,我们将会用MySQL表来替换这个映射文本文件。因为我们的目的是更灵活,更健壮,更易升级的控制数据。数据库表可以包含两列或更多的列。当然你需要告诉Postfix 数据库中哪一列是LHS,哪一列是RHS。我们可以建一个下列样子的配置文件来完成这一任务。
user = <用户名>
password = <数据库连接密码>
hosts = 127.0.0.1
dbname = <数据库名称>
table = <数据表名称>
## RHS
select_field = realmaildir
##LHS
where_field = mapusername
additional_conditions = and active = '1'
假设这个配置文件是/etc/postfix/mysql_virtual_mailbox_maps.cf. 现在你可以在Postfix中通过在main.cf 文件中下列条目来使用这个映射。
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
配置文件中
Postfix使用这个配置文件指出如何使用数据库表达像上面提到的两列的映射文件一样的映射效果。映射的左手边称为where_field
,映射的右手边称为 select_field
在这个例子中,我们映射 maildir 列到 username 列. 利用这个配置, Postfix 构造一个SQL查询语句 select maildir from postfix.mailbox where username=‘johndoe’ 为一个给定的username查找 maildir . 下表突出了这个差别:
LHS: where_field | RHS: select_field |
---|---|
username | maildir |
理解虚拟域是如何工作的对理解我们虚拟邮件系统的建立工作是很重要的。在Postfix中有两种域类型。
Postfix
当作本地域。本地域的邮件被发送给在 **/etc/passwd**
文件中出现的用户,而且这些邮件存放在**/var/mail**
目录中。/etc/passwd
文件中建立系统帐户。从而为我们的邮件系统提供了一种简单的方法来控制数以千计的邮件帐户。我们用在前面讨论过的映射来控制邮件帐户信息。你可以使用 MySQL, PostgreSQL
或 LDAP进行邮件帐户管理。在我们安装的系统中,使用MySQL后台管理虚拟域的邮件帐户Postfix使用两种不同的分类控制虚拟域,需要理解他们是如何工作的。
理解虚拟别名域、虚拟邮箱域
、本地域是很重要的。如果你设定一个域是虚拟别名域,你将不能够在你的服务器上为这个域接收邮件。相反的,你可以用虚拟别名映射表去管理两种类型域的电子邮件.
所以虚拟邮箱域可以更灵活的使用。
一个域要么是虚拟的,要么是本地的。你不能让一个域同时具有两种特征。所以,如果你希望你的默认域是虚拟的,那么你必须在mydestination
定义中将其删除。仅仅设置mydestination=localhost
或什么也不写。像root@localhost
这样的地址将被发送到本地
root
用户。 :::
参数格式:
parameter = value
后面的参数可以引用这个变量,如下所示:
other_parameter = $parameter
使用
postconf -n
命令来查看主配置项中已配置的配置情况
使用postconf -f
命令来查看所有的配置情况,包含默认的配置
使用postconf -d
<配置项名> 查找指定配置项的配置
postconf -n
postconf -f
配置 /etc/postfix/main.cf
文件的方法:
postconf -e
命令postconf -e '<参数对>'
## 如:
postconf -e 'smtpd_sasl_auth_enable = yes'
main.cf
进行修改。sudo nano /etc/postfix/main.cf
每当对
main.cf
或master.cf
文件进行更改时, 以 root 身份执行以下命令以刷新正在运行的 邮件系统:
sudo postfix reload
#邮箱总大小限制,单位字节, 0为不限制
mailbox_size_limit = 0
#附件大小,下面是50M
message_size_limit = 52428800
#启动sasl 验证
smtpd_sasl_auth_enable = yes
Postfix应该开箱即用,无需进行更改即可直接访问 Internet 的计算机。
您可以使用命令 **postconf -n**
来查看 main.cf
设置。除了几个路径名设置,应在独立盒子上设置很少的参数,
# 选项: 将邮件发送为用户@domainname而不是用户@hostname。
#myorigin = $mydomain
# 选项: 指定NAT/代理外部地址。
#proxy_interfaces = 1.2.3.4
# 替代1:不要从其他主机中继邮件
mynetworks_style = host
relay_domains =
# 替代2:仅来自本地客户端的中继邮件。
mynetworks = 192.168.1.0/28
relay_domains =
空客户端是只能发送邮件的计算机。它不接收邮件,也不会在本地传递任何邮件。一个 null 客户端通常使用 POP、IMAP 或 NFS 进行邮箱访问。
在此示例中,我们假设 Internet 域名为 example.com
,机器被命名为hostname.example.com
。 像往常一样,这些示例仅显示未保留在它们的默认设置。
## myhostname 设置为 hostname.example.com,以防万一 计算机名称未设置为完全限定的域名
## (使用 命令“postconf -d myhostname”找出机器是什么 名称是)
myhostname = hostname.example.com
myDomain = example.com
## 以 [email protected] 的身份发送邮件
myorigin = $mydomain
## 将所有邮件转发到负责“example.com”域的邮件服务器,如果某些远程目的地无法到达时,
## 则可以防止邮件将其粘在空客户端上。如果您的“example.com”域没有MX记录,
## 请在此处指定一个真实的主机名。
relayhost = $mydomain
## 不接受网络的邮件,只接收本地环回的邮件。
## 如果参数为 inet_interfaces = all, 则接受网络的所有邮件
inet_interfaces = loopback-only
## 指定接收邮件的域,而不是转发到另一台机器。默认设置是接收计算机本身的邮件。
## 可以指定零个或多个域名
## 如果为空,则禁用本地邮件投递。所有邮件都发送到 第 12 行中指定的邮件服务器
mydestination =
在此步骤中,您将为 user 设置电子邮件转发root,以便将系统生成的发送到您服务器上的邮件转发到外部电子邮件地址
该/etc/aliases文件包含电子邮件收件人的备用名称列表。打开它进行编辑:
sudo nano /etc/aliases
在默认状态下,它看起来像这样:
# See man 5 aliases for format
postmaster: root
唯一存在的指令指定系统生成的电子邮件发送到root.
将以下行添加到文件末尾:
/etc/别名
...
root: your_email_address
使用此行,您指定发送到的电子邮件root
最终被转发到一个电子邮件地址。请记住替换your_email_address
为您的个人电子邮件地址。完成后,保存并关闭文件。
要使更改生效,请运行以下命令:
sudo newaliases
运行newaliases
将建立mail
命令使用的别名数据库,这些别名取自您刚刚编辑的配置文件。root
通过运行测试发送电子邮件是否有效:
echo "This is the body of the email" | mail -s "This is the subject line" root
您应该会在您的电子邮件地址收到电子邮件。如果它不在那里,请检查您的垃圾邮件文件夹。
在此步骤中,您设置将系统生成的消息转发到您的电子邮件地址。您现在将启用消息加密,这样您的服务器发送的所有电子邮件都不会在传输过程中受到篡改,并且会被视为更合法。
默认是有英文模板的,但如果改成中文的,当然需要自己配置一个模板。
sudo nano /etc/postfix/main.cf
这是postfix的主要配置文件,在这个配置文件中添加一行内容,配置模板内容:
bounce_template_file = /etc/postfix/bounce.cf
根据上面的配置,建立一个模板内容,可以配置4种模板,分别为:
1)失败退信(failure_template):投递失败。
2)延时退信( delay_template):如果发信时发生了临时性错误,系统会延时一定的时间再次尝试重发,直到在队列中的时间超过了maximal_queue_litetime就从队形中删除了。
3)成功退信(success_template):发信成功了,给发件人一封通知信。
4)verify退信(ver-ify_template):对收件人验证不成功的退信
这里我主要配置一个失败的退信:
failure_template=<<EOF
Charset: utf-8,gb2312
From: =?utf-8?B?6YKu566x566h55CG5ZGY?=
Subject: =?utf-8?B?6YCA5L+h6YCa55+l?=
Postmaster-Subject:Postmaster Copy: Undelivered Mail
退信通知: 您好,很抱歉您发送的邮件被系统退回,相关信息如下
退信原因: 您投递的邮件地址不存在,所以您的邮件不能准确送达。
解决方案:1.请检查输入的地址是否有误;2.联系收件方确认邮箱是否存在过期、被禁用或冻结等情况。
EOF
这里的failure_template表示什么模板,模板内容在<
下面关键的内容来了,From和Subject如果配置中文的话,需要配置为base64,语法是:
=?应该的字符集?B?中文的base64?=
=?表示开头,?=表示结尾
本节介绍了一台主服务器的局部网络环境和发送、接收电子邮件的多个系统。同样,我们假设Internet
域名是“ example.com
”。所有系统均配置为将邮件发送为“ [email protected]
”,并且所有系统都会收到“ [email protected]
”的邮件。主服务器还收到“ [email protected]
”的邮件。我们以mailhost.example.com
的名称称呼这台计算机。
发送邮件为“ [email protected]
”的缺点是“ root”和其他系统帐户的邮件也发送到了中央邮机。
以下示例仅显示在其默认设置中没有留下的参数。
首先,我们介绍非限额主机配置,因为它是较简单的配置。该机器将邮件发送为“ [email protected]
”,是“ [email protected]
”的最终目的地。
myDomain = example.com
## 以[email protected] 的身份发送邮件
myorigin = $mydomain
## 指定受信网络
mynetworks = 127.0.0.0/8 10.0.0.0/24
## 此主机不中继来自不受信任网络的邮件
relay_domains =
## 如果没有直接的 Internet 访问,则需要这样做
#relayhost = $mydomain
接下来,我们介绍邮件主机配置。本机发送邮件为“[email protected]”,是 “[email protected]”和“[email protected]”。
## 示例DNS如下:
## example.com IN MX 10 mailhost.example.com.
## 将域“example.com”的邮件发送到 机器 mailhost.example.com
mydomain = example.com
## 以“[email protected]”身份发送邮件。
myorigin = $mydomain
## 用于指定邮件服务器的本地邮件传递目标。它定义了邮件服务器认为是本地的邮件域或主机名列表。
mydestination = $myhostname localhost.$mydomain localhost $mydomain
## 指定受信任的网络。
mynetworks = 127.0.0.0/8 10.0.0.0/24
## 此主机不中继来自不受信任网络的邮件。 相关设置见下面的防火墙/网关
relay_domains =
## 仅当邮件主机必须这样做时才需要这样做,通过防火墙上的邮件服务器转发非本地邮件。
## [] 强制 Postfix 不执行 MX 记录查找。
# relayhost = [firewall.example.com]
具体来说,mydestination 参数的作用包括:
默认情况下,mydestination 通常包含邮件服务器的主机名以及通过其配置指定的其他本地域。
本地域的邮件被发送给在 /etc/passwd
文件中出现的用户,而且这些邮件存放在 /var/mail
目录中, 在这样的环境中,用户可以在一个环境中访问他们的邮箱 或以下多种方式:
在后一种情况下,每个用户在邮件主机上都有一个别名,该别名 将邮件转发到她喜欢的机器:
joe: [email protected]
jane: [email protected]
在某些系统上,别名数据库不在 /etc/aliases 中。找出系统的位置,执行命令postconf alias_maps
。
每当您更改时执行命令newaliases
别名文件。
如果你的目标是将所有非本地邮件转发到防火墙,并且你想要通过单独的参数进行配置,Postfix 中没有直接提供类似的选项。然而,你可以使用 transport_maps 和 relay_domains 配置来实现类似的效果,以及通过额外的配置来达到你的目标。
以下是一种可能的方法:
transport_maps = hash:/etc/postfix/transport
relay_domains = !example.com
在这里,transport_maps 配置指定了一个映射文件,而 relay_domains 配置排除了本地域名(例如,example.com)。
* firewall.example.com
这样的配置将把所有非本地邮件直接转发到 firewall.example.com。
sudo postmap /etc/postfix/transport
sudo systemctl restart postfix
上述配置将所有非本地邮件直接转发到 firewall.example.com,而 transport_maps 配置实际上就是完成了转发的工作。请根据你的实际需求和网络拓扑进行调整。确保在配置更改后测试邮件流,并检查邮件日志以确保一切正常。
Postfix 使用查找表来存储和查找信息 用于访问控制、地址重写,甚至用于内容过滤。
经常出现在 Postfix 中的查找表示例 文档:
## 用于定义邮件的本地别名。在这里,/etc/postfix/aliases 中包含了本地邮件地址的别名映射,
## 这通常用于将邮件发送到系统中的本地用户或邮件别名。
alias_maps = hash:/etc/postfix/aliases
## 指定了一个正则表达式文件,用于定义邮件头部的检查规则。在这里,
## /etc/postfix/header_checks 包含了一组正则表达式规则,用于匹配和过滤邮件的头部信息,
## 实现内容过滤和检查。
header_checks = regexp:/etc/postfix/header_checks
## 用于定义邮件的传输方式。在这里,/etc/postfix/transport 中包含了一组规则,
## 指定了不同域名或地址的邮件应该如何被路由和传输,例如通过不同的邮件传输代理(MTA)。
transport_maps = hash:/etc/postfix/transport
## 用于定义虚拟别名。在这里,/etc/postfix/virtual 中包含了一组规则,
## 将邮件地址映射到其他邮件地址,用于实现虚拟域和虚拟用户的功能。
virtual_alias_maps = hash:/etc/postfix/virtual
我们的系统可以为数千用户提供邮箱。这些用户全部都是虚拟用户(相对于Linux系统用户而言)。所以这些用户不能在我们的系统硬盘上存放他们的信件。您或许不打算为每一个用户都分配一个惟一的系统UID (user ID)。因此我们创建一个Linux用户,它是所有邮箱的拥有者。
$ sudo groupadd -g 5000 vmail
$ sudo useradd -m -g vmail -u 5000 -d /home/vmail -s /bin/bash vmail
输入以下命令查看主机名:
hostname -f
如何你的服务器还没有设置好主机名,则可以用以下命令来设置
sudo hostnamectl set-hostname <your hostname>
默认情况下,myhostname
设置为本地计算机名称
示例(仅指定以下选项之一):
/etc/postfix/main.cf:
myhostname = host.local.domain (machine name is not FQDN)
myhostname = host.virtual.domain (virtual interface)
myhostname = virtual.domain (virtual interface)
如果在 main.cf
中指定 mydomain
,则 Postfix 将使用其值生成完全限定的默认值 用于 myHostName
参数。
示例(仅指定以下选项之一):
/etc/postfix/main.cf:
mydomain = local.domain
mydomain = virtual.domain (virtual interface)
myorigin
:本参数是用于设置邮件的发件人地址中的域名部分,默认情况下,它通常设置为主机的域名。这个参数在 Postfix 中是单值的,即只能设置一个域名。
为了使发件人和收件人地址保持一致,myorigin
还指定了附加的域名 发送到非限定的收件人地址。
myorigin = $myhostname (default: send mail as "user@$myhostname")
myorigin = $mydomain (probably desirable: "user@$mydomain")
inet_interfaces = all
或
inet_interfaces = 192.168.1.1, 127.0.0.1
也可以这样设置:
inet_interfaces = loopback-only
参数的作用是将 Postfix 限制为仅在回环接口(loopback interface)上监听邮件连接。回环接口通常是 127.0.0.1 这样的地址,用于本地主机内部的通信。
具体解释如下:
注意:在使用这个设置时,请确保你的邮件客户端或其他应用程序也在同一台主机上运行,以便能够连接到回环接口发送邮件。
在Postfix邮件服务器的配置文件中,relayhost参数用于指定邮件服务器的主机名或IP地址,该服务器将被用作邮件中继(relay)。邮件中继是指将邮件从一个邮件服务器传递到另一个邮件服务器的过程。relayhost参数告诉Postfix将所有无法直接送达的邮件发送到指定的邮件中继主机。
以下是relayhost
参数的基本用法:
## 指定中继服务器的域名或IP地址
relayhost = [hostname or IP address]
其中,hostname or IP address是你想要作为邮件中继的目标邮件服务器的主机名或IP地址。你可以使用方括号来指定IPv6地址。
举例来说,如果你的邮件服务器不能直接将邮件送达目标邮件服务器,它将使用relayhost指定的主机作为中继,将邮件传递给那个中继主机,由中继主机负责将邮件最终送达目标。
示例:
relayhost = [smtp.example.com]
或者使用IP地址:
relayhost = [192.168.1.1]
如果邮件服务器使用非标准的 SMTP 端口(例如587,用于加密的 STARTTLS),你可以在主机名后面指定端口。
relayhost = [smtp.example.com]:587
## 多个主机
relayhost = [smtp1.example.com]:587, [smtp2.example.com]:587
在配置文件中找到或添加这一行,并根据你的网络环境和需求来设置合适的relayhost。配置完成后,重启Postfix以使更改生效。
需要注意的是,使用邮件中继主机需要确保你有权利使用该中继主机,并且中继主机允许你通过它来中继邮件。在一些网络环境中,邮件中继可能需要进行身份验证。
默认情况下,Postfix 将转发来自陌生人(授权的外部网络邮件)仅发送到授权的远程目标。 授权的远程目标使用relay_domains
配置定义 参数。默认设置是授权所有域(和子域) 使用 mydestination
参数列出的域。
示例(仅指定以下选项之一):
relay_domains = $mydestination (default)
relay_domains = (safe: never forward mail from strangers)
relay_domains = $mydomain (forward mail to my domain and subdomains)
设置非 root 用户邮箱的位置。 在本指南中,我们将使用 Maildir
格式,它将邮件分成单独的文件,然后根据用户操作在目录之间移动。
将 home_mailbox
变量设置为 Maildir/
。 这表示用户的邮箱路径将是相对于用户主目录的 Maildir/ 目录。Maildir 是一种邮箱存储格式,常用于支持 IMAP 协议。
sudo postconf -e 'home_mailbox= Maildir/'
这将导致用户的邮箱被设置为位于家目录下的 Maildir/ 目录中。请注意,这里不需要提供完整的路径,因为 home_mailbox 会自动在用户的家目录下寻找指定的目录。
如果你选择自己创建这个目录,确保设置正确的权限以确保 Postfix 或相关邮件服务可以访问该目录。你可以使用类似以下的命令创建目录:
mkdir ~/Maildir
chmod 700 ~/Maildir
请注意,具体的目录结构可能因使用的邮件客户端或邮件服务器软件而有所不同。Maildir 是一种常见的格式,适用于一些邮件服务器,但可能不适用于所有情况。确保你的邮件客户端和服务器软件支持你选择的邮箱格式。
home_mailbox = mail/inbox
这表示用户的邮箱路径将是相对于用户主目录的 mail/inbox 目录。
home_mailbox = /var/mail/%u
这表示用户的邮箱路径将是 /var/mail 目录下与用户名相对应的文件。
home_mailbox = Maildir/
这表示用户的邮箱路径将是 Maildir 格式的路径。
请注意,使用 Maildir 格式或 mbox 格式(传统的单文件邮箱格式)取决于你的邮件服务器和邮件客户端的配置。Maildir 更适合多用户、高并发访问的情况,而 mbox 则是传统的格式,存储为单个文件。确保你的配置与你使用的邮件系统和客户端的期望一致。
可以根据不同的邮件地址或域名将邮件路由到不同的邮件传输代理(MTA)。
transport_maps = hash:/etc/postfix/transport
这里指定了一个映射文件的路径为 /etc/postfix/transport。
example.com smtp:[smtp.example.com]
@example.net smtp:[smtp.example.net]
上面的例子中,如果邮件地址的域名是 example.com
,则将邮件传输到 smtp.example.com
,注意,这是精确匹配的,只有 [email protected]
这个邮件才会被转发到smtp.example.com
;
而@example.net
是一个包含通配符的格式,表示匹配所有以 example.net
结尾的邮件地址。在正则表达式中,@example.net
会匹配 *.example.net
的形式。
上述配置表示,对于所有以 example.net
结尾的邮件地址,将其传输到 smtp.example.net
。
如果邮件地址的域名是 example.net
,则将邮件传输到 smtp.example.net
。
关于格式**smtp:[smtp.example.com] **
**和 ****smtp.example.com**
的不同:
**smtp:[smtp.example.com]:**
这种格式表示将邮件路由到指定的 SMTP 服务器。在这个例子中,邮件将被传输到 smtp.example.com
。这种语法通常用于在 transport_maps
中明确指定邮件传输的目标服务器。example.com smtp:[smtp.example.com]
上述配置表示,对于 example.com
域的邮件,将其传输到 smtp.example.com
。
transport_maps
中。它表示邮件传输的目标是 smtp.example.com
,但不涉及到具体的路由映射。在 transport_maps
中,如果你使用类似 example.com smtp.example.com
的配置,那么它并不直接表示将邮件传输到 smtp.example.com
,而是会遵循默认的 DNS 路由规则去寻找目标邮件服务器。总的来说,smtp:[smtp.example.com]
更加明确地指定了邮件传输的目标 SMTP 服务器,而 smtp.example.com
则是一个普通的 SMTP 服务器标识。在 transport_maps 中,通常使用前者来确保邮件被准确地路由到指定的服务器。
systemctl reload postfix # 对于使用 systemd 的系统
# /etc/postfix/aliases
postmaster: root
webmaster: www-data
support: helpdesk
这个示例表明,当邮件发送到 postmaster 时,实际上会发送到系统的 root 用户;类似地,webmaster 则被映射到 www-data,support 被映射到 helpdesk。
如果要将这些映射表配置为使用 MySQL 数据库,您需要使用 mysql: 前缀来指定数据库类型,然后使用适当的查询语句。
在邮件系统中,有一些标准的别名通常用于特定目的。这些别名有助于管理和组织邮件,使系统管理员和用户能够更轻松地处理不同类型的邮件。以下是一些常见的邮件系统别名及其作用:
这些别名的具体配置可能因系统和组织而异,但它们提供了一个标准的命名约定,有助于简化邮件的管理和组织。在设置这些别名时,确保将邮件正确地路由到相关的用户或邮件地址,以便及时处理相关事务。
该参数指定了虚拟邮箱的基本存储路径,虚拟用户的实际存储路径是基于这个基本路径的。
以下是一个示例配置:
virtual_mailbox_base = /var/mail
在这个例子中,/var/mail 就是虚拟用户邮箱的基本存储路径。如果你在 virtual_mailbox_maps 中设置了映射规则,例如:
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
然后在 /etc/postfix/vmailbox 文件中设置了映射规则:
[email protected] user1/
[email protected] user2/
在这种情况下,[email protected] 的邮箱存储路径将是 /var/mail/user1/,而 [email protected] 的邮箱存储路径将是 /var/mail/user2/。
请确保虚拟用户存储目录的权限设置正确,以确保 Postfix 或相关邮件服务进程能够读取和写入这些目录。
chmod 755 /var/mail
chown postfix:postfix /var/mail
虚拟用户管理,用于实现虚拟用户到真实邮箱地址的映射或是转发:
## 运行以下命令,将表位置映射到名为 /etc/postfix/virtual 的哈希数据库文件:
sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'
## 如果您想在 [email protected] 和 [email protected] 接收电子邮件,
## 并希望将这些电子邮件发送给 sammy Linux 用户,您可以设置您的文件像这样:
## /etc/postfix/virtual 内容:
[email protected] usr1/
[email protected] usr2/
## 应用上面的映射
sudo postmap /etc/postfix/virtual
在这个例子中,邮件地址 [email protected]
将被映射到 /var/mail/usr1/
,而 [email protected]
将被映射到 /var/mail/usr2/
。
如果你想使用MySQL作为Postfix的虚拟别名映射表,你需要进行以下配置:
## 创建数据库及表
CREATE DATABASE postfix;
USE postfix;
CREATE TABLE virtual_aliases (
id INT AUTO_INCREMENT PRIMARY KEY,
source VARCHAR(255) NOT NULL,
destination VARCHAR(255) NOT NULL
);
## 以上面的数据为例,插入记录
INSERT INTO virtual_aliases (source, destination) VALUES
('[email protected]', 'usr1'),
('[email protected]', 'usr2');
## 编辑Postfix配置文件: 打开Postfix的主配置文件 /etc/postfix/main.cf 并添加以下行:
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-aliases.cf
## 用户的UID号和GID号
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
user = postfix_user
password = your_password
hosts = 127.0.0.1
dbname = postfix
query = SELECT destination FROM virtual_aliases WHERE source='%s'
如果要实现虚拟用户的管理及动态uid、gid的管理,请参考如下示例:
CREATE TABLE virtual_users (
id INT NOT NULL AUTO_INCREMENT,
source VARCHAR(255) NOT NULL,
destination VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
uid INT NOT NULL default(5000),
gid INT NOT NULL default(5000),
PRIMARY KEY (id)
);
INSERT INTO virtual_users (source, destination, password, uid, gid) VALUES
('[email protected]', 'usr1', 'password1', '1001', '1001'),
('[email protected]', 'usr2', 'password2', '1002', '1002');
## 配置信息如下:(/etc/postfix/mysql-virtual-aliases_maps.cf)
user = postfix_user
password = your_password
hosts = 127.0.0.1
dbname = postfix
query = SELECT destination FROM virtual_users WHERE source='%s'
## 配置/etc/postfix/mysql-virtual-mailbox-maps.cf:
user = postfixuser
password = password
hosts = localhost
dbname = postfixdb
query = SELECT 1 FROM virtual_users WHERE source='%s'
## 配置文件/etc/postfix/mysql-virtual-uid-maps.cf,并添加以下内容:
user = postfixuser
password = password
hosts = localhost
dbname = postfixdb
query = SELECT uid FROM virtual_users WHERE source='%s'
## 配置文件/etc/postfix/mysql-virtual-gid-maps.cf,并添加以下内容:
user = postfixuser
password = password
hosts = localhost
dbname = postfixdb
query = SELECT gid FROM virtual_users WHERE source='%s'
## 配置/etc/postfix/main.cf:
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_uid_maps = mysql:/etc/postfix/mysql-virtual-uid-maps.cf
virtual_gid_maps = mysql:/etc/postfix/mysql-virtual-gid-maps.cf
virtual_mailbox_domains = example.com, domain2.com
##数据库配置示例
CREATE TABLE virtual_mailbox_domains (
id INT NOT NULL AUTO_INCREMENT,
domain VARCHAR(255) NOT NULL,
description VARCHAR(255), ## 可选字段,用于提供有关域的描述信息,例如域的用途或备注。
active BOOLEAN DEFAULT true,
PRIMARY KEY (id),
UNIQUE KEY domain_unique (domain)
);
## main.cf添加配置:
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
## /etc/postfix/mysql-virtual-mailbox-domains.cf
user = postfixuser
password = password
hosts = localhost
dbname = postfixdb
query = SELECT 1 FROM virtual_mailbox_domains WHERE domain='%s' AND active=1
## 重新编译
postmap -q test.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
## 数据库配置示例
CREATE TABLE virtual_mailbox_maps (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(255) NOT NULL,
mailbox_path VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY email_unique (email)
);
## 添加配置
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
## /etc/postfix/mysql-virtual-mailbox-maps.cf
user = postfixuser
password = password
hosts = localhost
dbname = postfixdb
query = SELECT mailbox_path FROM virtual_mailbox_maps WHERE email='%s'
## 编译
postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
在 /etc/postfix/virtual_mailbox 文件中,你可以定义类似以下的映射:
[email protected] /var/mail/vmail/example.com/user1
[email protected] /var/mail/vmail/domain2.com/user2
使用virtual_mailbox_domains、virtual_mailbox_maps这两个参数,你可以设置 Postfix 以虚拟方式处理邮件,而不需要在系统上为每个虚拟用户创建一个本地系统账户。这在托管多个域或虚拟用户的环境中非常有用。确保在配置文件中使用正确的语法,并根据实际需求调整路径和域名。
参数用于指定邮件传输代理 (MTA) 在处理虚拟用户邮件传输时使用的传输服务。在 Postfix 中,virtual_transport 通常与虚拟用户的邮箱相关,用于定义传输代理如何处理这些邮件。
以下是一般的设置方法:
virtual_transport = virtual
然后,确保在 master.cf 文件中有一个 virtual 的传输服务定义,通常是通过 transport_maps 实现。例如:
virtual unix - n n - - virtual
这将告诉 Postfix 使用 virtual 传输服务来处理虚拟用户的邮件。
virtual_transport = lmtp:unix:private/dovecot-lmtp
这里的 private/dovecot-lmtp 是 Dovecot LMTP 服务的套接字路径。
确保在更改配置后重新加载或重启 Postfix 服务,以使更改生效。
请根据你的系统和邮件服务器架构进行适当的配置。关于 virtual_transport
的更多信息,你可以参考 Postfix 文档或在系统上运行 man 5 postconf
查看详细说明。
指定接收邮件的域,而不是转发到另一台机器。默认设置是接收计算机本身的邮件。可以指定零个或多个域名,“/file/name”模式 和/或“type:table”
查找表(例如 hash
:、btree
:、nis
:、ldap
:、 或 mysql
,用空格和/或逗号分隔。
重要说明:如果您的计算机是整个邮件服务器域,您还必须列出 $mydomain。
示例 1:默认设置。
mydestination = $myhostname localhost.$mydomain localhost
示例 2:全域邮件服务器。
mydestination = $myhostname localhost.$mydomain localhost $mydomain
示例 3:具有多个 DNS A 记录的主机。
mydestination = $myhostname localhost.$mydomain localhost www.$mydomain ftp.$mydomain
注意:为了避免邮件投递循环,您必须列出所有 计算机的主机名,包括 KaTeX parse error: Expected 'EOF', got '#' at position 52: …postconf.5.html#̲myhostname)和loc…mydomain
默认情况下,Postfix 将转发来自授权客户端的邮件。
重要信息:如果您的计算机连接到广域网 那么“mynetworks_style = 子网”设置可能过于友好。
mynetworks_style = subnet (not safe on a wide area network)
mynetworks_style = host (authorize local machine only)
mynetworks = 127.0.0.0/8 (authorize local machine only)
mynetworks = 127.0.0.0/8 168.100.189.2/32 (authorize local machine)
mynetworks = 127.0.0.0/8 168.100.189.2/28 (authorize local networks)
您可以在 main.cf
文件中指定受信任的网络,或者 您可以让 Postfix
为您完成工作。默认设置是让 Postfix
完成工作。结果取决于mynetworks_style
参数值。
≥compatibility_level mynetworks_style Postfix
应从仅本地计算机。 应从SMTP 客户端与本地计算机位于同一 IP 子网中。 在 Linux 上,这仅在指定的接口下正常工作 使用“ifconfig”或“ip”命令。
mynetworks_style = class
” 当 Postfix 应该 从同一 IP 类 A/B/C 网络中的 SMTP 客户端转发邮件 作为本地计算机。不要对拨号站点执行此操作 - 它会 使 Postfix “信任”您的整个提供商的网络。相反 手动指定显式 MyNetworks 列表,如下所述。或者,您可以手动指定 mynetworks 列表, 在这种情况下,Postfix 会忽略mynetworks_style设置。 若要手动指定受信任网络的列表,请指定网络 CIDR(网络/掩码)表示法中的块,例如:
mynetworks = 168.100.189.0/28, 127.0.0.0/8
您也可以改为指定模式文件的绝对路径名 列出 main.cf
文件中的模式。
系统会将postmaster alias发送异常传递报告, postmaster的配置如下:
/etc/aliases:
postmaster: root
root: [email protected]
上面的示例表示本地root用户接收到异常传递的邮件报告后转发到[email protected]邮箱。
你不用关心报告类型,因为报告类型可以配置。默认只报告resource和software类型。
默认设置如下:一般保持默认就可以了。
/etc/postfix/main.cf:
notify_classes = resource, software
proxy_interfaces = all
或
proxy_interfaces = 192.168.1.1, 127.0.0.1
也可以设置为限制Postfix只在本地主机上中继邮件而不对外部网络开放邮件中继服务。这通常用于确保邮件中继只在本地主机上运行,增加邮件系统的安全性。
proxy_interfaces = loopback-only
这将导致 Postfix 只在回环接口上监听传入的邮件中继连接。
# 拒绝包含 "viagra" 的邮件主题
/^Subject: .*viagra/ REJECT Sorry, your message contains inappropriate content.
# 标记发件人地址为 example.com 的邮件
/^From: .*@example\.com/ WARN Marking as potential spam.
## 发件人地址包含 @example.com 的邮件标记为垃圾邮件
/^From: .*@example\.com/ DISCARD
# 在邮件主题中添加标记
/^Subject:/ PREPEND X-Spam-Status: Yes
# 将邮件主题中的 "info" 替换为 "important"
/^Subject: .*info/ REPLACE Subject: Important
这个示例包含两个规则,第一个规则检查邮件主题是否包含 “viagra”,如果是则拒绝该邮件。第二个规则检查发件人是否来自 example.com,如果是则直接丢弃该邮件。
echo "This is a test email body" | mail -s "Test Email" -a "From: [email protected]" [email protected]
在这个例子中,我们使用 echo 命令来创建邮件正文,然后通过管道将其传递给 mail 命令。选项 -s 用于指定邮件主题,而 -a 用于指定发件人地址。
确保替换以下部分为实际值:
请注意,使用 mail 命令发送邮件,需要确保系统上已经安装了 mail 客户端工具,并且邮件服务器配置正确。
如果 mail 命令未安装,你可能需要通过系统的软件包管理器进行安装。你可以使用以下命令安装 mailutils 包:
sudo apt install mailutils
请注意,这是一种基本的方式发送邮件。对于更复杂的邮件,特别是需要添加附件等情况,可能需要使用更高级的工具或脚本。
本小节学习的内容有点多,比较抽象,想一下子看明白很难,但要做到大致的意思能明白就行。我大概在大第四节教程中会教大家一个详细的能运行的示例配置。所以这节课的内容一定要多花点时间来消化,对每一个配置参数有所了解。下一节课我们讲邮件管理器Dovecot,有了它我们的postfix才能腾飞。