Sendmail配置与管理全解析
1. SMART_HOST与LOCAL_NET_CONFIG宏
SMART_HOST宏允许你指定一个主机,该主机将中继所有无法直接投递的外发邮件,并指定与之通信的邮件传输协议。在配置中,我们使用uucp - new传输协议连接到UUCP主机moria。若要配置sendmail使用基于SMTP的智能主机,可使用如下代码:
define(`SMART_HOST', `mail.isp.net')
无需指定SMTP作为传输协议,因为它是默认选项。
LOCAL_NET_CONFIG宏可让你在配置中添加原始的sendmail重写规则,以定义哪些邮件应保留在本地邮件系统中。在示例中,使用了一个规则,匹配主机属于我们域名(.$m.)的任何电子邮件地址,并将其重写为直接发送到SMTP邮件程序。这确保了本地域名主机的任何邮件都能立即定向到SMTP邮件程序并转发到该主机,而不是默认转发到智能主机。
2. 管理垃圾邮件
在网络环境中,垃圾邮件是一个常见问题。如果你订阅了邮件列表、在网站上公布了电子邮件地址或在UseNet上发布了文章,很可能会收到未经请求的广告邮件。这种大规模群发邮件的行为通常被称为垃圾邮件发送(spamming)。
幸运的是,sendmail提供了一些机制来帮助处理垃圾邮件:
-
实时黑洞列表(Real - time Blackhole List)
- 实时黑洞列表是一个公共设施,用于减少你需要处理的垃圾广告邮件数量。已知的电子邮件源和主机被列在互联网上的一个可查询数据库中。那些收到来自某些电子邮件地址的垃圾广告的人会将其添加到列表中。一些主要域名有时也会因为未能有效关闭垃圾邮件发送而被列入列表。尽管有些人会抱怨列表维护者的某些选择,但该列表仍然非常受欢迎,并且分歧通常能很快得到解决。有关该服务的详细操作信息可在Mail Abuse Protection System的主页(http://maps.vix.com/rbl/)上找到。
- 若启用sendmail的此功能,它将针对实时黑洞列表测试每封传入邮件的源地址,以确定是否接受该邮件。对于拥有大量用户的大型站点,此功能可以节省大量磁盘空间。该功能接受一个参数来指定要使用的服务器名称,默认是主服务器rbl.maps.vix.com。
- 配置实时黑洞列表功能,需在sendmail.mc文件中添加以下宏声明:
FEATURE(rbl)
- 若要指定其他RBL服务器,可使用如下声明:
FEATURE(rbl,`rbl.host.net')
-
访问数据库(access database)
- sendmail的access_db功能是一种替代系统,它以手动配置为代价,提供了更大的灵活性和控制权。访问数据库允许你配置接受哪些主机或用户的邮件,以及为哪些主机或用户中继邮件。
- 管理邮件中继对象很重要,因为垃圾邮件发送主机常利用此技术绕过实时黑洞列表等系统。他们不直接向你发送邮件,而是通过允许中继的其他不知情主机进行转发。这样,传入的SMTP连接就不是来自已知的垃圾邮件发送主机,而是来自中继主机。为确保自己的邮件主机不被用于此类目的,你应该只为已知主机中继邮件。sendmail 8.9.0及更高版本默认禁用中继功能,因此需要使用访问数据库来启用个别主机的中继功能。
-
当收到新的传入SMTP连接时,sendmail会检索邮件头信息,然后查询访问数据库,以确定是否继续接受邮件正文。访问数据库是一组规则的集合,描述了对于来自指定主机的邮件应采取的操作。默认的访问控制文件是 /etc/mail/access,其格式简单,每行包含一个访问规则。规则的左侧是用于匹配传入邮件发件人的模式,可以是完整的电子邮件地址、主机名或IP地址;右侧是要采取的操作,有以下五种类型:
| 操作类型 | 说明 |
| ---- | ---- |
| OK | 接受邮件消息 |
| RELAY | 即使邮件不是发往我们的主机,也接受来自此主机或用户的消息,即接受从此主机转发到其他主机的消息 |
| REJECT | 用通用消息拒绝邮件 |
| DISCARD | 使用 $#discard 邮件程序丢弃消息 |
| ### any text | 使用 ### 作为错误代码(应符合RFC - 821)并以“any text”作为消息返回错误信息 | -
以下是一个 /etc/mail/access 文件的示例:
friends@cybermail.com
REJECT
aol.com
REJECT
207.46.131.30
REJECT
postmaster@aol.com
OK
linux.org.au
RELAY
- 此示例将拒绝来自 friends@cybermail.com、aol.com 域中的任何主机以及主机 207.46.131.30 的任何电子邮件。下一条规则将接受来自 postmaster@aol.com 的电子邮件,尽管该域名本身有拒绝规则。最后一条规则允许从 linux.org.au 域中的任何主机转发邮件。
- 要启用访问数据库功能,在sendmail.mc文件中使用以下声明:
FEATURE(access_db)
- 默认定义使用 hash -o /etc/mail/access 构建数据库,它从纯文本文件生成一个简单的哈希数据库,这在大多数安装中已足够。如果你打算拥有一个大型访问数据库,还应考虑其他选项,具体细节可参考sendmail相关文档。
3. 禁止用户接收邮件
如果你有一些发送邮件但永远不需要接收邮件的用户或自动化进程,拒绝接受发往他们的邮件有时是很有用的,这样可以节省存储永远不会被阅读的邮件所浪费的磁盘空间。blacklist_recipients功能与access_db功能结合使用时,允许你禁用本地用户接收邮件。
- 要启用此功能,若sendmail.mc文件中没有相关内容,需添加以下行:
FEATURE(access_db)
FEATURE(blacklist_recipients)
- 要禁用本地用户接收邮件,只需将其详细信息添加到访问数据库中。通常使用 ### 条目样式返回有意义的错误消息给发件人,让他们知道邮件未被投递的原因。此功能同样适用于虚拟邮件域中的用户,并且必须在访问数据库规范中包含虚拟邮件域。以下是一些 /etc/mail/access 条目的示例:
daemon
550 Daemon does not accept or read mail.
flacco
550 Mail for this user has been administratively disabled.
grump@dairy.org 550 Mail disabled for this recipient.
4. 配置虚拟电子邮件托管
虚拟电子邮件托管使主机能够代表多个不同的域名接受和投递邮件,就像它是多个独立的邮件主机一样。最常见的是,互联网应用提供商将虚拟托管与虚拟网站托管结合使用,但它配置简单,你可能随时有机会为喜欢的Linux项目进行虚拟邮件列表托管,下面将详细介绍。
-
接受其他域名的邮件
- 当sendmail收到电子邮件消息时,它会将消息头中的目标主机与本地主机名进行比较。如果匹配,sendmail会接受该消息进行本地投递;如果不同,sendmail可能会决定接受该消息并尝试将其转发到最终目的地(有关如何配置sendmail接受邮件转发的详细信息,请参考前面的“访问数据库”部分)。
- 若要配置虚拟电子邮件托管,首先要让sendmail也接受我们托管的域名的邮件。sendmail的use_cw_file功能允许我们指定一个文件的名称,在该文件中存储sendmail接受邮件的域名。配置此功能,需在sendmail.mc文件中添加功能声明:
FEATURE(use_cw_file)
- 使用 /etc/mail/ 配置目录的发行版,该文件的默认名称为 /etc/mail/local - host - names;其他发行版为 /etc/sendmail.cw。你也可以通过覆盖confCW_FILE宏来指定文件的名称和位置,例如:
define(`confCW_FILE',`/etc/virtualnames')
- 若要使用默认文件名并为bovine.net、dairy.org和artist.org域名提供虚拟托管,需创建一个如下的 /etc/mail/local - host - names 文件:
bovine.net
dairy.org
artist.org
- 完成此操作后,假设存在将这些域名指向我们主机的适当DNS记录,sendmail将接受这些域名的邮件,就好像它们是发往我们真实域名的邮件一样。
-
将虚拟托管邮件转发到其他目的地
- sendmail的virtusertable功能用于配置虚拟用户表,通过该表我们可以配置虚拟电子邮件托管。虚拟用户表将发往某些 user@host 的传入邮件映射到其他 user@otherhost。你可以将其视为一种高级邮件别名功能,它不仅基于目标用户,还基于目标域名进行操作。
- 配置virtusertable功能,在sendmail.mc配置中添加以下功能:
FEATURE(virtusertable)
- 默认情况下,包含翻译规则的文件为 /etc/mail/virtusertable。你可以通过为宏定义提供参数来覆盖此默认值,具体可用选项可参考详细的sendmail参考资料。
- 虚拟用户表的格式非常简单,每行的左侧包含一个表示原始目标邮件地址的模式,右侧包含一个表示虚拟托管地址将映射到的邮件地址的模式。以下是一个包含三种可能类型条目的示例:
samiam@bovine.net
colin
sunny@bovine.net
darkhorse@mystery.net
@dairy.org
mail@jhm.org
@artist.org
$1@red.firefly.com
- 在这个示例中,我们虚拟托管了三个域名:bovine.net、dairy.org和artist.org。第一个条目将发往bovine.net虚拟域中某个用户的邮件重定向到机器上的本地用户;第二个条目将同一虚拟域中某个用户的邮件重定向到另一个域中的用户;第三个示例将发往dairy.org虚拟域中任何用户的所有邮件重定向到一个远程邮件地址;最后一个条目将发往artist.org虚拟域中某个用户的任何邮件重定向到另一个域中的同一用户,例如,julie@artists.org将被重定向到julie@red.firefly.com。
5. 测试配置
m4命令根据其自身的语法规则处理宏定义文件,而不了解正确的sendmail语法,因此如果宏定义文件中有错误,不会有错误消息。所以,彻底测试配置非常重要。sendmail提供了一种相对简单的方法来进行测试。
sendmail支持“地址测试”模式,允许我们测试配置并识别任何错误。在此模式下,从命令行调用sendmail,它会提示我们输入规则集规范和目标邮件地址。然后,sendmail使用指定的规则处理该目标地址,并在处理过程中显示每个重写规则的输出。要使sendmail进入此模式,使用 - bt 参数调用它:
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
>
默认使用的配置文件是 /etc/mail/sendmail.cf 文件,你可以使用 - C 参数指定备用配置文件。为了测试配置,我们需要选择一些地址进行处理,以确保满足每个邮件处理要求。以下是一些测试示例:
-
测试向本地用户投递邮件
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 isaac
rewrite: ruleset
3
input: isaac
rewrite: ruleset
96
input: isaac
rewrite: ruleset
96 returns: isaac
rewrite: ruleset
3 returns: isaac
rewrite: ruleset
0
input: isaac
rewrite: ruleset 199
input: isaac
rewrite: ruleset 199 returns: isaac
rewrite: ruleset
98
input: isaac
rewrite: ruleset
98 returns: isaac
rewrite: ruleset 198
input: isaac
rewrite: ruleset 198 returns: $# local $: isaac
rewrite: ruleset
0 returns: $# local $: isaac
此输出显示了sendmail如何处理发往isaac的邮件。最后一行表明规则集0的结果确实将邮件定向到本地邮件程序。
- 测试向SMTP地址投递邮件
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 isaac@vstout.vbrew.com
rewrite: ruleset
3
input: isaac @ vstout . vbrew . com
rewrite: ruleset
96
input: isaac < @ vstout . vbrew . com >
rewrite: ruleset
96 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
3 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
0
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 199
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 199 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
98
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
98 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 198
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 198 returns: $# local $: isaac
rewrite: ruleset
0 returns: $# local $: isaac
此测试也通过,表明sendmail能够正确处理发往SMTP地址的邮件。
- 测试向UUCP样式地址投递邮件
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 vstout!isaac
rewrite: ruleset
3
input: vstout ! isaac
rewrite: ruleset
96
input: isaac < @ vstout . UUCP >
rewrite: ruleset
96 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
3 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
0
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 199
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 199 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
98
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset
98 returns: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 198
input: isaac < @ vstout . vbrew . com . >
rewrite: ruleset 198 returns: $# local $: isaac
rewrite: ruleset
0 returns: $# local $: isaac
此测试同样通过,确认sendmail能正确处理UUCP样式地址的邮件。
- 测试向vbrew.com域中其他主机投递邮件
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 isaac@vale.vbrew.com
rewrite: ruleset
3
input: isaac @ vale . vbrew . com
rewrite: ruleset
96
input: isaac < @ vale . vbrew . com >
rewrite: ruleset
96 returns: isaac < @ vale . vbrew . com . >
rewrite: ruleset
3 returns: isaac < @ vale . vbrew . com . >
rewrite: ruleset
0
input: isaac < @ vale . vbrew . com . >
rewrite: ruleset 199
input: isaac < @ vale . vbrew . com . >
rewrite: ruleset 199 returns: isaac < @ vale . vbrew . com . >
rewrite: ruleset
98
input: isaac < @ vale . vbrew . com . >
rewrite: ruleset
98 returns: isaac < @ vale . vbrew . com . >
rewrite: ruleset 198
input: isaac < @ vale . vbrew . com . >
rewrite: ruleset 198 returns: $# smtp $@ vale . vbrew . com . /
$: isaac < @ vale . vbrew . com . >
rewrite: ruleset
0 returns: $# smtp $@ vale . vbrew . com . /
$: isaac < @ vale . vbrew . com . >
此测试将消息定向到SMTP邮件程序,以直接转发到vale.vbrew.com主机,并指定用户isaac,确认了LOCAL_NET_CONFIG定义的正确性。
- 测试目标主机名无法解析的情况
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 isaac@vXXXX.vbrew.com
rewrite: ruleset
3
input: isaac @ vXXXX . vbrew . com
rewrite: ruleset
96
input: isaac < @ vXXXX . vbrew . com >
vXXXX.vbrew.com: Name server timeout
rewrite: ruleset
96 returns: isaac < @ vXXXX . vbrew . com >
rewrite: ruleset
3 returns: isaac < @ vXXXX . vbrew . com >
== Ruleset 3,0 (3) status 75
rewrite: ruleset
0
input: isaac < @ vXXXX . vbrew . com >
rewrite: ruleset 199
input: isaac < @ vXXXX . vbrew . com >
rewrite: ruleset 199 returns: isaac < @ vXXXX . vbrew . com >
rewrite: ruleset
98
input: isaac < @ vXXXX . vbrew . com >
rewrite: ruleset
98 returns: isaac < @ vXXXX . vbrew . com >
rewrite: ruleset 198
input: isaac < @ vXXXX . vbrew . com >
rewrite: ruleset
95
input: < uucp-new : moria > isaac </
@ vXXXX . vbrew . com >
rewrite: ruleset
95 returns: $# uucp-new $@ moria $: isaac </
@ vXXXX . vbrew . com >
rewrite: ruleset 198 returns: $# uucp-new $@ moria $: isaac </
@ vXXXX . vbrew . com >
rewrite: ruleset
0 returns: $# uucp-new $@ moria $: isaac </
@ vXXXX . vbrew . com >
此测试中,规则集3返回错误消息,表明主机名无法解析。我们依靠配置的智能主机来处理这种情况,规则集确定邮件应使用uucp - new邮件程序转发到智能主机moria。
- 测试向非本域主机投递邮件
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 isaac@linux.org.au
rewrite: ruleset
3
input: isaac @ linux . org . au
rewrite: ruleset
96
input: isaac < @ linux . org . au >
rewrite: ruleset
96 returns: isaac < @ linux . org . au . >
rewrite: ruleset
3 returns: isaac < @ linux . org . au . >
rewrite: ruleset
0
input: isaac < @ linux . org . au . >
rewrite: ruleset 199
input: isaac < @ linux . org . au . >
此测试应产生与上一个示例类似的结果,确保任何发往非本域主机的邮件都能正确投递到智能主机。
通过以上测试,可以全面验证sendmail配置的正确性,确保邮件系统的稳定运行。
Sendmail配置与管理全解析
6. 测试流程总结
为了更清晰地展示sendmail配置测试的流程,下面使用mermaid流程图进行说明:
graph TD;
A[启动sendmail地址测试模式] --> B[输入规则集和目标邮件地址];
B --> C{地址类型};
C -->|本地用户地址| D[测试本地投递];
C -->|SMTP地址| E[测试SMTP投递];
C -->|UUCP样式地址| F[测试UUCP投递];
C -->|本域其他主机地址| G[测试本域内转发];
C -->|无法解析的主机地址| H[测试智能主机处理];
C -->|非本域主机地址| I[测试非本域投递];
D --> J{是否正确投递到本地邮件程序};
E --> J;
F --> J;
G --> K{是否正确定向到SMTP邮件程序转发};
H --> L{是否转发到智能主机};
I --> L;
J -->|是| M[测试通过];
K -->|是| M;
L -->|是| M;
J -->|否| N[测试失败,检查配置];
K -->|否| N;
L -->|否| N;
这个流程图展示了从启动sendmail地址测试模式开始,根据不同的地址类型进行相应的测试,最后根据测试结果判断是否通过的整个过程。如果测试失败,需要检查配置以找出问题所在。
7. 配置要点回顾
在配置sendmail时,有几个关键要点需要再次强调:
-
宏的使用
:SMART_HOST、LOCAL_NET_CONFIG等宏在sendmail配置中起着重要作用。SMART_HOST用于指定中继无法直接投递邮件的主机,而LOCAL_NET_CONFIG用于定义本地邮件系统的重写规则。正确使用这些宏可以确保邮件的正确路由。
-
垃圾邮件处理
:实时黑洞列表和访问数据库是处理垃圾邮件的有效手段。实时黑洞列表可以帮助过滤已知的垃圾邮件源,而访问数据库则提供了更灵活的控制,允许你根据主机或用户来决定是否接受邮件或中继邮件。
-
虚拟电子邮件托管
:通过use_cw_file和virtusertable功能,可以轻松实现虚拟电子邮件托管。use_cw_file用于指定接受邮件的域名文件,而virtusertable则用于配置邮件的转发规则。
-
测试配置
:由于m4命令不会检查宏定义文件中的sendmail语法错误,因此彻底测试配置至关重要。使用sendmail的“地址测试”模式可以帮助你识别配置中的问题,确保邮件系统的正常运行。
8. 常见问题及解决方法
在使用sendmail进行配置和管理过程中,可能会遇到一些常见问题,下面是一些问题及相应的解决方法:
| 问题描述 | 可能原因 | 解决方法 |
| ---- | ---- | ---- |
| 邮件无法投递到本地用户 | 本地邮件程序配置错误、重写规则不正确 | 检查本地邮件程序的配置,确保重写规则能正确将邮件定向到本地邮件程序 |
| 收到大量垃圾邮件 | 实时黑洞列表未启用、访问数据库配置不合理 | 启用实时黑洞列表功能,检查并调整访问数据库的规则,拒绝已知的垃圾邮件源 |
| 虚拟域名邮件无法接收 | DNS记录配置错误、use_cw_file文件配置错误 | 检查DNS记录是否将虚拟域名指向正确的主机,确保use_cw_file文件中包含正确的域名 |
| 邮件中继功能异常 | 访问数据库未正确配置、sendmail版本默认禁用中继 | 检查访问数据库中关于中继的规则,对于sendmail 8.9.0及更高版本,使用访问数据库启用个别主机的中继功能 |
9. 总结与建议
通过对sendmail配置与管理的详细介绍,我们了解了如何使用各种功能来实现邮件的正确路由、垃圾邮件处理、虚拟电子邮件托管等。在实际应用中,建议按照以下步骤进行操作:
1.
规划配置
:在开始配置之前,明确自己的需求,例如是否需要处理垃圾邮件、是否需要虚拟电子邮件托管等。根据需求规划好宏的使用、访问数据库的规则等。
2.
逐步配置
:按照本文介绍的顺序,逐步进行配置。先配置基本的宏,如SMART_HOST和LOCAL_NET_CONFIG,再处理垃圾邮件相关的配置,最后进行虚拟电子邮件托管的配置。
3.
充分测试
:在完成配置后,使用sendmail的“地址测试”模式进行充分测试。测试各种类型的地址,包括本地用户地址、SMTP地址、UUCP样式地址等,确保配置的正确性。
4.
定期维护
:定期检查实时黑洞列表的更新情况,调整访问数据库的规则,以适应不断变化的网络环境。同时,关注sendmail的版本更新,及时升级以获取更好的性能和安全性。
通过以上步骤,可以确保sendmail邮件系统的稳定运行,为用户提供可靠的邮件服务。
超级会员免费看
1820

被折叠的 条评论
为什么被折叠?



