我们前二节的内容为这节内容的配置做了很好的前置基础。本次教程我们围绕Postfix的配置参数进行详细的详解,内容有点多,一定要认真的学习和理解。
Postfix配置简介
Postfix 有几百个配置参数,这些参数是 通过 main.cf
文件进行控制。幸运的是,所有参数都有 合理的默认值。在许多情况下,您只需要配置两个或三个参数,然后才能开始使用邮件系统。
默认情况下,Postfix 配置文件位于 /etc/postfix 中。 最重要的两个文件是 main.cf
和 master.cf
。这些文件必须归 root 所有。授予其他人对main.cf
或 master.cf
(或其父目录)的写入权限意味着授予该人员的 root 权限。
现在您可以调整软件包安装过程未提示您进行的一些设置。 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>
配置Mysql
- 创建数据库
## 本示例的root密码为:speedxcn$admin$2023
mysql -u root -p <password>
## 创建数据库servermail
create database exampledb;
## 添加用户并授权
CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL ON speedxcnmailserver.* 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产生加密密码:
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.
- 在这个示例中:
{ SHA512 - CRYPT } 表示使用 SHA512 - CRYPT 算法。 - ENCRYPTED_PASSWORD 是经过加密的密码。
## 示例:
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中必须映射的是邮件用户帐号和邮件地址。例如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中映射我们的虚拟邮箱。文件结构如下:
info@domain1.com sigiri
info@domain2.com 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
配置文件中
- user 指出连接MySQL数据库的用户名,
- password 指出user的密码,
- dbname 指出MySQL 数据库的名字,
- table 指出 MySQL 数据库中表的名字。
- hosts 指出运行MySQL 数据库的服务器名。
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中有两种域类型。
-
本地域 destination 指出的域都被
Postfix
当作本地域。本地域的邮件被发送给在**/etc/passwd**
文件中出现的用户,而且这些邮件存放在**/var/mail**
目录中。 - **虚拟域 virtual_domain **除了本地域之外Postfix还可以为虚拟域发送信件。与本地域不同Postfix可以让我们以一种灵活的方式操作虚拟域。他的优点是我们不需要为每一个邮件帐户在
/etc/passwd
文件中建立系统帐户。从而为我们的邮件系统提供了一种简单的方法来控制数以千计的邮件帐户。我们用在前面讨论过的映射来控制邮件帐户信息。你可以使用 MySQL,PostgreSQL
或 LDAP进行邮件帐户管理。在我们安装的系统中,使用MySQL后台管理虚拟域的邮件帐户
Postfix使用两种不同的分类控制虚拟域,需要理解他们是如何工作的。
- 虚拟别名域 virtual_alias_maps : 他被用来从一个email地址向另一个email地址转发别名邮件。这种域能被用做接收邮箱并存储在你的硬盘上。在你构建的系统中虚拟别名域并不是必须的。我们可以使用虚拟别名映射表去替代虚拟别名域,甚至是那些在虚拟别名域没有出现的域。虚拟别名映射表是一张普通的重定向映射表。
- 虚拟邮箱域 virtual_mailbox_domains : Postfix使用这些域为域中的用户接收邮件并将邮件保存到硬盘的邮箱中。这是一个参数,参数告诉Postfix接收域中的邮件并存放在每个用户的邮箱中。Postfix用虚拟别名映射表的映射决定邮箱在你的硬盘上的位置。请记住,你仍然可以用虚拟别名映射表的映射转发一封邮件到另一个邮箱或外部的邮件地址。所以并不是每一个域用户都必须有一个实际的邮箱,可以仅仅件转发到其他地方。
理解虚拟别名域、虚拟邮箱域
、本地域是很重要的。如果你设定一个域是虚拟别名域,你将不能够在你的服务器上为这个域接收邮件。相反的,你可以用虚拟别名映射表去管理两种类型域的电子邮件.
所以虚拟邮箱域可以更灵活的使用。
一个域要么是虚拟的,要么是本地的。你不能让一个域同时具有两种特征。所以,如果你希望你的默认域是虚拟的,那么你必须在mydestination
定义中将其删除。仅仅设置mydestination=localhost
或什么也不写。像root@localhost
这样的地址将被发送到本地
root
用户。 :::
Postfix配置方法
参数格式:
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
## 以 user@example.com 的身份发送邮件
myorigin = $mydomain
## 将所有邮件转发到负责“example.com”域的邮件服务器,如果某些远程目的地无法到达时,
## 则可以防止邮件将其粘在空客户端上。如果您的“example.com”域没有MX记录,
## 请在此处指定一个真实的主机名。
relayhost = $mydomain
## 不接受网络的邮件,只接收本地环回的邮件。
## 如果参数为 inet_interfaces = all, 则接受网络的所有邮件
inet_interfaces = loopback-only
## 指定接收邮件的域,而不是转发到另一台机器。默认设置是接收计算机本身的邮件。
## 可以指定零个或多个域名
## 如果为空,则禁用本地邮件投递。所有邮件都发送到 第 12 行中指定的邮件服务器
mydestination =
转发本地用户(系统用户)邮件
在此步骤中,您将为 user 设置电子邮件转发root,以便将系统生成的发送到您服务器上的邮件转发到外部电子邮件地址<br />该/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?=<Admin@zjp.com>
Subject: =?utf-8?B?6YCA5L+h6YCa55+l?=
Postmaster-Subject:Postmaster Copy: Undelivered Mail
退信通知: 您好,很抱歉您发送的邮件被系统退回,相关信息如下
退信原因: 您投递的邮件地址不存在,所以您的邮件不能准确送达。
解决方案:1.请检查输入的地址是否有误;2.联系收件方确认邮箱是否存在过期、被禁用或冻结等情况。
EOF
这里的failure_template表示什么模板,模板内容在<<EOF和EOF之间。
charset配置字符集。
下面关键的内容来了,From和Subject如果配置中文的话,需要配置为base64,语法是:
=?应该的字符集?B?中文的base64?=
=?表示开头,?=表示结尾
本地网络上的Postfix
本节介绍了一台主服务器的局部网络环境和发送、接收电子邮件的多个系统。同样,我们假设Internet
域名是“ example.com
”。所有系统均配置为将邮件发送为“user@example.com
”,并且所有系统都会收到“ user@hostname.example.com
”的邮件。主服务器还收到“user@example.com
”的邮件。我们以mailhost.example.com
的名称称呼这台计算机。
发送邮件为“user@example.com
”的缺点是“ root”和其他系统帐户的邮件也发送到了中央邮机。
以下示例仅显示在其默认设置中没有留下的参数。
首先,我们介绍非限额主机配置,因为它是较简单的配置。该机器将邮件发送为“ user@example.com
”,是“ user@hostname.example.com
”的最终目的地。
myDomain = example.com
## 以user@example.com 的身份发送邮件
myorigin = $mydomain
## 指定受信网络
mynetworks = 127.0.0.0/8 10.0.0.0/24
## 此主机不中继来自不受信任网络的邮件
relay_domains =
## 如果没有直接的 Internet 访问,则需要这样做
#relayhost = $mydomain
接下来,我们介绍邮件主机配置。本机发送邮件为“user@example.com”,是 “user@hostname.example.com”和“user@example.com”。
## 示例DNS如下:
## example.com IN MX 10 mailhost.example.com.
## 将域“example.com”的邮件发送到 机器 mailhost.example.com
mydomain = example.com
## 以“user@example.com”身份发送邮件。
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 中的任何一项匹配,Postfix 将尝试在本地投递邮件,即将邮件送到本地用户的邮箱。
- 本地邮件接收: 如果邮件的目标地址是本服务器的主机名(hostname),也会被视为本地邮件。
默认情况下,mydestination 通常包含邮件服务器的主机名以及通过其配置指定的其他本地域。<br />本地域的邮件被发送给在 /etc/passwd
文件中出现的用户,而且这些邮件存放在 /var/mail
目录中, 在这样的环境中,用户可以在一个环境中访问他们的邮箱 或以下多种方式:
- 通过 NFS 或等效方式进行邮箱访问。
- 通过POP或IMAP访问邮箱。
- 用户首选计算机上的邮箱。
在后一种情况下,每个用户在邮件主机上都有一个别名,该别名 将邮件转发到她喜欢的机器:
joe: joe@joes.preferred.machine
jane: jane@janes.preferred.machine
在某些系统上,别名数据库不在 /etc/aliases 中。找出系统的位置,执行命令postconf alias_maps
。
每当您更改时执行命令newaliases
别名文件。
转发非本地邮件到中继服务器
如果你的目标是将所有非本地邮件转发到防火墙,并且你想要通过单独的参数进行配置,Postfix 中没有直接提供类似的选项。然而,你可以使用 transport_maps 和 relay_domains 配置来实现类似的效果,以及通过额外的配置来达到你的目标。
以下是一种可能的方法:
- 编辑 /etc/postfix/main.cf 文件:
transport_maps = hash:/etc/postfix/transport
relay_domains = !example.com
在这里,transport_maps 配置指定了一个映射文件,而 relay_domains 配置排除了本地域名(例如,example.com)。
- 创建 /etc/postfix/transport 文件: 在 /etc/postfix/transport 中添加以下行:
* firewall.example.com
这样的配置将把所有非本地邮件直接转发到 firewall.example.com。
- 运行 postmap 命令生成映射文件:
sudo postmap /etc/postfix/transport
- 重启 Postfix:
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
配置主机名 myhostname
输入以下命令查看主机名:
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)
配置项: mydomain
如果在 main.cf
中指定 mydomain
,则 Postfix 将使用其值生成完全限定的默认值 用于 myHostName
参数。<br />示例(仅指定以下选项之一):
/etc/postfix/main.cf:
mydomain = local.domain
mydomain = virtual.domain (virtual interface)
配置项: myorigin
myorigin
:本参数是用于设置邮件的发件人地址中的域名部分,默认情况下,它通常设置为主机的域名。这个参数在 Postfix 中是单值的,即只能设置一个域名。
为了使发件人和收件人地址保持一致,myorigin
还指定了附加的域名 发送到非限定的收件人地址。
myorigin = $myhostname (default: send mail as "user@$myhostname")
myorigin = $mydomain (probably desirable: "user@$mydomain")
配置项 inet_interfaces
- 用于指定 Postfix 应该监听哪些网络接口上的连接。它决定了 Postfix 监听传入邮件连接的网络地址。
- 默认情况下,inet_interfaces 被设置为 all,表示 Postfix 将监听所有网络接口。这意味着 Postfix 将接受来自服务器上所有可用 IP 地址的邮件连接。
- 你也可以将 inet_interfaces 设置为特定的 IP 地址,以使 Postfix 仅监听那些特定的网络接口。
inet_interfaces = all
或
inet_interfaces = 192.168.1.1, 127.0.0.1
也可以这样设置:
inet_interfaces = loopback-only
参数的作用是将 Postfix 限制为仅在回环接口(loopback interface)上监听邮件连接。回环接口通常是 127.0.0.1 这样的地址,用于本地主机内部的通信。
具体解释如下:
- inet_interfaces: 这是 Postfix 用于指定监听哪些网络接口的参数。当设置为 loopback-only 时,Postfix 只会在回环接口上监听传入的邮件连接,不会监听外部网络接口。这意味着 Postfix 只接受本地主机上发起的邮件连接,不对外部网络开放邮件服务。
- 作用: 这种配置适用于那些只需要在本地主机上运行邮件服务的情况。通常,这样的设置用于确保邮件服务只能通过本地访问,而不对外部网络开放。这有助于增加安全性,防止未经授权的远程访问。
注意:在使用这个设置时,请确保你的邮件客户端或其他应用程序也在同一台主机上运行,以便能够连接到回环接口发送邮件。
配置项:relayhost
在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以使更改生效。
需要注意的是,使用邮件中继主机需要确保你有权利使用该中继主机,并且中继主机允许你通过它来中继邮件。在一些网络环境中,邮件中继可能需要进行身份验证。
配置项 relay_domains
默认情况下,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)
配置项 home_mailbox
设置非 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 目录下与用户名相对应的文件。
- 使用 Maildir 格式:
- 对于使用 Maildir 格式的邮箱,通常 home_mailbox 配置为 Maildir/。
- 示例:
home_mailbox = Maildir/
这表示用户的邮箱路径将是 Maildir 格式的路径。
请注意,使用 Maildir 格式或 mbox 格式(传统的单文件邮箱格式)取决于你的邮件服务器和邮件客户端的配置。Maildir 更适合多用户、高并发访问的情况,而 mbox 则是传统的格式,存储为单个文件。确保你的配置与你使用的邮件系统和客户端的期望一致。
配置项 transport_maps
可以根据不同的邮件地址或域名将邮件路由到不同的邮件传输代理(MTA)。
- 添加或修改 transport_maps 配置: 在 main.cf 文件中,找到 transport_maps 配置项,并为其分配一个映射文件的路径。例如:
transport_maps = hash:/etc/postfix/transport
这里指定了一个映射文件的路径为 /etc/postfix/transport。
- 创建映射文件: 创建上述路径中指定的映射文件(例如,/etc/postfix/transport),并在其中添加邮件地址和对应的邮件传输方式。每一行的格式为 pattern transport,其中 pattern 是匹配的邮件地址或域名,transport 是邮件传输的目标。例如:
example.com smtp:[smtp.example.com]
@example.net smtp:[smtp.example.net]
上面的例子中,如果邮件地址的域名是 example.com
,则将邮件传输到 smtp.example.com
,注意,这是精确匹配的,只有 user@example.com
这个邮件才会被转发到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
。
-
smtp.example.com: 这种格式通常在一般的 SMTP 配置中使用,而不是在
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 中,通常使用前者来确保邮件被准确地路由到指定的服务器。
- 重载或重新启动 Postfix: 保存修改后的配置文件,并重载或重新启动 Postfix 以使更改生效。具体命令取决于你的操作系统,可能是类似于以下的命令:
systemctl reload postfix # 对于使用 systemd 的系统
配置项 mailbox_transport
- 作用: 用于指定 Dovecot 用于投递用户的本地邮箱的传输代理。
- 配置格式:mailbox_transport = <transport>
- 示例:mailbox_transport = lmtp:unix:private/dovecot-lmtp
- 说明:
- lmtp:unix:private/dovecot-lmtp 表示使用 LMTP(Local Mail Transfer Protocol)协议将邮件传输到 Dovecot 的 LMTP 服务。
- unix:private/dovecot-lmtp 表示通过 Unix socket 连接到 Dovecot 的 LMTP 服务。
- 这个参数影响到 Dovecot 如何处理本地用户的邮箱投递,即投递到用户的 Maildir 目录。
配置项 virtual_transport
- 作用: 用于指定 Dovecot 用于投递虚拟用户邮箱的传输代理。
- 配置格式:virtual_transport = <transport>
- 示例:virtual_transport = lmtp:unix:private/dovecot-lmtp
- 说明:
- lmtp:unix:private/dovecot-lmtp 表示使用 LMTP 协议将邮件传输到 Dovecot 的 LMTP 服务。
- unix:private/dovecot-lmtp 表示通过 Unix socket 连接到 Dovecot 的 LMTP 服务。
- 这个参数影响到 Dovecot 如何处理虚拟用户的邮箱投递,即投递到虚拟用户的 Maildir 目录。
配置项 aliase_maps
- 作用:alias_maps 用于定义本地邮件地址的别名映射。
- 用法: 通常使用哈希表存储,以便快速查找本地用户的别名。
- 示例:
# /etc/postfix/aliases
postmaster: root
webmaster: www-data
support: helpdesk
这个示例表明,当邮件发送到 postmaster 时,实际上会发送到系统的 root 用户;类似地,webmaster 则被映射到 www-data,support 被映射到 helpdesk。
如果要将这些映射表配置为使用 MySQL 数据库,您需要使用 mysql: 前缀来指定数据库类型,然后使用适当的查询语句。
在邮件系统中,有一些标准的别名通常用于特定目的。这些别名有助于管理和组织邮件,使系统管理员和用户能够更轻松地处理不同类型的邮件。以下是一些常见的邮件系统别名及其作用:
- postmaster:
- 作用: 通常用于接收系统和邮件服务器的通知以及处理错误消息。
- 示例:postmaster: root
- abuse:
- 作用: 用于接收与滥用报告相关的邮件,通常用于报告垃圾邮件和其他滥用行为。
- 示例:abuse: admin@example.com
- webmaster:
- 作用: 用于接收与网站或网络服务相关的通知。
- 示例:webmaster: admin@example.com
- info、sales、support:
- 作用: 分别用于接收有关公司或组织的信息、销售和技术支持方面的邮件。
- 示例:info: info@example.com,sales: sales@example.com,support: support@example.com
- root:
- 作用: 用于接收系统管理员的通知和错误消息。
- 示例:root: admin@example.com
- mailer-daemon、postmaster、nobody:
- 作用: 用于接收系统生成的通知、错误或非送达邮件。
- 示例:mailer-daemon: postmaster,nobody: /dev/null
- security、security-officer、security-alerts:
- 作用: 用于接收与系统或网络安全相关的通知和报警。
- 示例:security: security@example.com,security-officer: admin@example.com,security-alerts: alerts@example.com
- noc(Network Operations Center):
- 作用: 用于接收与网络运维和故障处理相关的通知。
- 示例:noc: noc@example.com
这些别名的具体配置可能因系统和组织而异,但它们提供了一个标准的命名约定,有助于简化邮件的管理和组织。在设置这些别名时,确保将邮件正确地路由到相关的用户或邮件地址,以便及时处理相关事务。
配置项 virtual_mailbox_base
该参数指定了虚拟邮箱的基本存储路径,虚拟用户的实际存储路径是基于这个基本路径的。
以下是一个示例配置:
virtual_mailbox_base = /var/mail
在这个例子中,/var/mail 就是虚拟用户邮箱的基本存储路径。如果你在 virtual_mailbox_maps 中设置了映射规则,例如:
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
然后在 /etc/postfix/vmailbox 文件中设置了映射规则:
user1@example.com user1/
user2@example.com user2/
在这种情况下,user1@example.com 的邮箱存储路径将是 /var/mail/user1/,而 user2@example.com 的邮箱存储路径将是 /var/mail/user2/。
请确保虚拟用户存储目录的权限设置正确,以确保 Postfix 或相关邮件服务进程能够读取和写入这些目录。
chmod 755 /var/mail
chown postfix:postfix /var/mail
配置项 virtual_alias_maps
虚拟用户管理,用于实现虚拟用户到真实邮箱地址的映射或是转发:
- 作用:virtual_alias_maps 用于定义虚拟别名,将邮件地址映射到其他邮件地址。
- 用法: 通过指定一个包含虚拟别名映射规则的映射文件,实现邮件地址的映射。
## 运行以下命令,将表位置映射到名为 /etc/postfix/virtual 的哈希数据库文件:
sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'
## 如果您想在 contact@example.com 和 admin@example.com 接收电子邮件,
## 并希望将这些电子邮件发送给 sammy Linux 用户,您可以设置您的文件像这样:
## /etc/postfix/virtual 内容:
user@example.com usr1/
info@example.com usr2/
## 应用上面的映射
sudo postmap /etc/postfix/virtual
在这个例子中,邮件地址 user@example.com
将被映射到 /var/mail/usr1/
,而 info@example.com
将被映射到 /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
('user@example.com', 'usr1'),
('info@example.com', '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
('user1@example.com', 'usr1', 'password1', '1001', '1001'),
('user2@example.com', '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
- 作用: 定义接受虚拟用户邮件的邮件域列表。
- 配置: 可以将需要处理的虚拟邮件域列出,Postfix 将会接受这些域的邮件。
- 例子:
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
- 作用: 指定虚拟用户和实际存储路径的映射关系。
- 配置: 指定一个映射表,该表告诉 Postfix 如何将虚拟地址映射到实际文件系统上的存储路径。
- 例子:
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 first@test.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
在 /etc/postfix/virtual_mailbox 文件中,你可以定义类似以下的映射:
user1@example.com /var/mail/vmail/example.com/user1
user2@domain2.com /var/mail/vmail/domain2.com/user2
使用virtual_mailbox_domains、virtual_mailbox_maps这两个参数,你可以设置 Postfix 以虚拟方式处理邮件,而不需要在系统上为每个虚拟用户创建一个本地系统账户。这在托管多个域或虚拟用户的环境中非常有用。确保在配置文件中使用正确的语法,并根据实际需求调整路径和域名。
配置项 virtual_transport
参数用于指定邮件传输代理 (MTA) 在处理虚拟用户邮件传输时使用的传输服务。在 Postfix 中,virtual_transport 通常与虚拟用户的邮箱相关,用于定义传输代理如何处理这些邮件。
以下是一般的设置方法:
- 使用本地传输(默认设置):如果你的虚拟用户的邮箱都存储在本地,可以使用本地传输。这是默认设置,因此通常无需显式指定。如果你没有显式设置 virtual_transport,Postfix 将使用默认的本地传输。
- 使用 virtual 传输:如果你的虚拟用户的邮箱存储在远程服务器或通过某种虚拟化机制进行处理,你可能希望使用 virtual 传输。在 main.cf 中添加如下配置:
virtual_transport = virtual
然后,确保在 master.cf 文件中有一个 virtual 的传输服务定义,通常是通过 transport_maps 实现。例如:
virtual unix - n n - - virtual
这将告诉 Postfix 使用 virtual 传输服务来处理虚拟用户的邮件。
- 使用其他传输服务:如果你有其他邮件传输代理(如 Dovecot LMTP)来处理虚拟用户的邮件,你可以将 virtual_transport 设置为该服务的名称。例如,使用 Dovecot 的 LMTP 服务:
virtual_transport = lmtp:unix:private/dovecot-lmtp
这里的 private/dovecot-lmtp 是 Dovecot LMTP 服务的套接字路径。
确保在更改配置后重新加载或重启 Postfix 服务,以使更改生效。
请根据你的系统和邮件服务器架构进行适当的配置。关于 virtual_transport
的更多信息,你可以参考 Postfix 文档或在系统上运行 man 5 postconf
查看详细说明。
配置项 mydestination
指定接收邮件的域,而不是转发到另一台机器。默认设置是接收计算机本身的邮件。可以指定零个或多个域名,“/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
注意:为了避免邮件投递循环,您必须列出所有 计算机的主机名,包括 mydomain
配置项:mynetworksk
默认情况下,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
应从仅本地计算机。 - 指定
<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传递异常邮件
系统会将postmaster alias发送异常传递报告, postmaster的配置如下:
/etc/aliases:
postmaster: root
root: myname@example.com
上面的示例表示本地root用户接收到异常传递的邮件报告后转发到zxmatline@163.com邮箱。
你不用关心报告类型,因为报告类型可以配置。默认只报告resource和software类型。
默认设置如下:一般保持默认就可以了。
/etc/postfix/main.cf:
notify_classes = resource, software
配置项 proxy_interfaces
- 用于指定 Postfix 应该将邮件中继代理到哪些网络接口上。这是在邮件从一个邮件传输代理(MTA)传递到另一个 MTA 时使用的参数。
- 默认情况下,proxy_interfaces 被设置为 all,表示 Postfix 将通过所有网络接口中继邮件。
- 你也可以将 proxy_interfaces 设置为特定的 IP 地址,以便 Postfix 只通过特定的网络接口中继邮件。
proxy_interfaces = all
或
proxy_interfaces = 192.168.1.1, 127.0.0.1
也可以设置为限制Postfix只在本地主机上中继邮件而不对外部网络开放邮件中继服务。这通常用于确保邮件中继只在本地主机上运行,增加邮件系统的安全性。
proxy_interfaces = loopback-only
这将导致 Postfix 只在回环接口上监听传入的邮件中继连接。
配置项 header_checks
- 作用:header_checks 用于定义邮件头部的正则表达式规则,以实现内容过滤和检查。
- 用法: 通过指定一个包含正则表达式规则的文件,匹配规则会检查邮件的头部内容。
- 示例:
# 拒绝包含 "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: admin@example.com" user@your.domain.com
在这个例子中,我们使用 echo 命令来创建邮件正文,然后通过管道将其传递给 mail 命令。选项 -s 用于指定邮件主题,而 -a 用于指定发件人地址。
确保替换以下部分为实际值:
- This is a test email body:邮件正文。
- Test Email:邮件主题。
- admin@example.com:发件人地址。
- user@your.domain.com:收件人地址。
请注意,使用 mail 命令发送邮件,需要确保系统上已经安装了 mail 客户端工具,并且邮件服务器配置正确。
如果 mail 命令未安装,你可能需要通过系统的软件包管理器进行安装。你可以使用以下命令安装 mailutils 包:
sudo apt install mailutils
请注意,这是一种基本的方式发送邮件。对于更复杂的邮件,特别是需要添加附件等情况,可能需要使用更高级的工具或脚本。
结束语:
本小节学习的内容有点多,比较抽象,想一下子看明白很难,但要做到大致的意思能明白就行。我大概在大第四节教程中会教大家一个详细的能运行的示例配置。所以这节课的内容一定要多花点时间来消化,对每一个配置参数有所了解。下一节课我们讲邮件管理器Dovecot,有了它我们的postfix才能腾飞。