本文最后一次在 2020 年 5 月 23 日更新,部分内容可能已经过时!

视频点此

我已经说过不少服务器的应用了。日常来讲,你可以拥有自己的博客网站、自己的云盘、自己的离线下载服务、自己的RSS订阅工具、自己的软件下载站,甚至开一个自己的Minecraft服务器。这其实已经差不多了吧?

但有一点是肯定的,只要你想,那么一台服务器肯定就不止这点用处。就比如今天要来说说的——搭建一个自己的发件服务器。


一、几个解答

1、这个发件服务器有什么用

显摆。因为你的邮箱地址,@之后的内容是别人没有的。

当然,不只是这样。

举个例子:如果你去过我的博客,你就会看到公告,说评论邮件提醒服务已上线。这就是发件服务器应用的地方。因为使用第三方的smtp服务,一来,每天的发件数量有限制;二来,发件的频率有限制。可不要说什么我这博客到不了发件上限,那是因为有很多的垃圾评论被我给屏蔽掉了,你看不到而已。

2、为什么只发不收

我之前说过,这个系列一定程度上是我自己使用我VPS的记录。而对于邮件,我用不到收信功能,所以没有赋予这个功能。

3、可以有收信功能吗

当然可以。改多一些配置文件就可以了。

4、增加收信功能难吗

给你这么一个答案:可以难。

你可以在自己的服务里配置收件箱、邮件解析功能,从而实现一个完整的邮箱服务,这听起来就相当麻烦;但也可以搞成一个中继,所有发到这个地址的邮件,自己不做解析,而是直接转发到别的邮箱——比如说自己的hotmail邮箱——里边,用户通过hotmail来管理这些邮件,这样难度就下来了很多。所以说,增加收信功能,可以是难的。

5、我需要有什么基础条件

与之前介绍的不同,搞一个自己的信使服务还真需要你有几个基础条件:

  1. 25端口开放——如果你想远程使用这个邮箱,而不只是给部署在同一台服务器的博客来用的话。当然,你也可以把端口放到465,但如何做我就不说了。因为我也没弄过。
  2. 有自己的域名。这样才能显示一个正常的邮箱地址,并最大程度避免被邮箱服务商当做垃圾邮件的概率。
  3. 如果想随时随地使用,部署在VPS是必不可少的。但还是那句话,如果只是给部署在同一台服务器的博客来用的话,那便无所谓了。

6、有什么安全措施

像我已经在用的这个,因为官方的25端口是封闭的,所以从根源上便拒绝了非法用户通过这个服务向外派件的可能性;加之我这个方法最终会使用独立的用户名和密码,而不是默认的使用登录用户做用户名,登录密码做邮箱认证密码,所以不至于泄露自己服务器的用户名。只是要注意,这样得到的邮箱是不带有SSL加密的。所以传输过程中的信息就不保证安全了。

好,介绍了这么多,来看看到底要如何配置。


二、配置

1、调整组件

CentOS里边默认会安装postfix。而有些系统默认的邮件服务是sendmail而这个服务公认的差。所以为了调整服务,先来调整好组件。同时,也保证需要的用户组被创建。

yum remove sendmail #卸载sendmail
yum remove postfix #卸载postfix
yum install postfix #重新安装postfix
#yum安装会自动建立postfix用户组和用户名
yum install crontabs #因为卸载postfix的时候系统定时服务可能会被卸载所以也运行一次安装命令确保组件存在

2、增加组件

postfix默认的邮箱账户名是登录系统的用户名,密码则是登录系统用户的密码。所以为了得到独立的用户名密码,需要安装相应的服务。

yum install cyrus-sasl*  #提供smtp的虚拟账户和密码服务

3、配置MTA

MTA就是邮件发送端。刚刚卸载又安装的postfix就是为了完成这个任务的。因此现在,需要调整系统默认的MTA到postfix。

/usr/sbin/alternatives --set mta /usr/sbin/sendmail.postfix

alternatives --display mta #查看调整结果
#如果输出的最后一行显示如下:
#Current `best' version is /usr/sbin/sendmail.postfix.
#说明设置完毕

4、配置自启动

既然是服务,那自然希望它会在服务器重新启动后的第一时间上线。所以设置自启动。

systemctl enable postfix

5、配置postfix

编辑/etc/postfix/main.cf,更改下述内容。

myhostname = #二级域名。如smtp.bwsl.wang
mydomain = #主域名,即删去二级域名剩下的东西。如bwsl.wang
myorigin=$mydomain
inet_interfaces=#localhost或本地回环地址
#填入公网ip会对外开放(25端口未封闭的话)
#默认应该是all,收发皆可
#如此更改即关闭收件功能
mydestination = $myhostname, localhost.$mydomain, localhost
#这里默认值应该就是这样,是则保持,不是则改
mynetworks=#公网地址,127.0.0.1
#填这两个就可以了

再新增下述内容,开启单独的登录名和密码服务

#SMTP Config
smtpd_client_restrictions = permit_sasl_authenticated
#指定可以向postfix发起SMTP连接的客户端的主机名或ip地址
#此处permit_sasl_authenticated意思是允许通过sasl认证(也就是smtp链接时通过了账号、密码效验的用户)的所有用户
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#发件人在执行RCPT TO命令时提供的地址进行限制规则
smtpd_sasl_auth_enable = yes
#启用smtp并要求进行账号、密码效验
smtpd_sasl_security_options = noanonymous
#取消smtp的匿名登录
message_size_limit = 5242880
#指定通过postfix发送邮件的体积大小。单位字节

6、创建连接邮箱服务的用户名和密码

先来编辑/etc/sasl2/smtpd.conf。对于32位机,这个文件路径是/usr/lib/sasl2/smtpd.conf

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login CRAM-MD5 DIGEST-MD5

现在,就可以创建账号了。使用命令:

saslpasswd2 -c -u `postconf -h mydomain` username

回车后,会提示输入密码。输入一次,重复一次,用户名为username的邮箱便建立好了。邮箱地址将会是[email protected]

你可以通过这个命令建立多个用户和密码。日后也可以通过命令sasldblistusers2来查看已有的用户名。密码不能看,只会显示userPassword

7、调整权限

需要调整sasl的用户数据权限,让postfix可以读取:

chmod 755 /etc/sasldb2

现在,设置几乎全部完成,可以启动信使服务了。使用命令

systemctl start postfix

三、测试服务

为避免网络端口封闭问题而导致的莫名其妙的问题,我们最好是通过服务器本机连本机来进行服务的测试。所以还是在服务器的窗口内,运行telnet命令(没有则先安装telnet):

telnet localhost 25

我们还需要额外准备两个内容:

  • 刚刚建立的邮箱用户(带@之后的内容)的base64编码
  • 用户对应密码的base64编码

这两个的获得很容易,百度base64就有很多转换工具,随便一个就好。

然后便可以回到服务器的命令行,进行验证过程

HELO bwsl.wang #尝试握手,返回消息后继续
AUTH LOGIN #请求smtp账户密码校验,返回消息后继续
#输入刚刚获得的用户名base64,返回消息后继续
#输入刚刚获得的密码base64

输入密码后回车,应该就可以看到Authentication successful认证成功的消息。这便证明,一个发件服务已经搭好了。

四、调整域名解析

别着急应用到博客里。现在应用,那发出去的邮件一定连垃圾箱都不进,直接就被拒收了。我们还需要进行最后一步:配置域名解析。

进入你的域名解析调整页面,新增三项:

  • myhostname对应的二级域名,A类解析到服务器IP
  • @域名,MX解析到myhostname对应的二级域名
  • @域名,TXT解析成v=spf1 a mx ip4:服务器ip -all

至此,一个发件服务便建立完成了。你可以通过linux的mail命令来尝试发送一个带有独一无二邮件后缀的邮件了。好好利用吧。


可以通过 https://www.mail-tester.com 对你的服务进行测试,并根据提示进行对应的修改以提高得分

已有 8 条评论

  1. 希望下期能教我们搭建广告拦截服务器 —— ScottLiu ScottLiu 发表。 回复TA
  2. 希望下一期教安装Minecraft Fabric客户端&Minecraft1.14模组(如replaymod&opifine),因为我在Linux下老打不开Fabric安装程序。 —— ScottLiu ScottLiu 发表。 回复TA
  3. 如果把发件服务器的域名设为子域名,该如何修改? —— laomocode laomocode 发表。 回复TA
    1. 最简单的,这个文章里边所有提到的域名都增加一级就行了 —— 等我稍后补充昵称 等我稍后补充昵称 [作者] 于 发表。 回复TA
  4. 服务器在大陆,域名没备案能用吗? —— 参没有商 参没有商 发表。 回复TA
    1. 最好备案。不备案域名可能就被暂停解析了 —— 等我稍后补充昵称 等我稍后补充昵称 [作者] 于 发表。 回复TA
  5. 为啥我用mail命令发送邮件后显示发件域名是root@mail.我的域名,怎么才能把mail去掉,直接显示@我的域名呢 —— oneperson oneperson 发表。 回复TA
    1. 在一开始配置的时候就不要用mail子域名,直接用根域名配置 —— 等我稍后补充昵称 等我稍后补充昵称 [作者] 于 发表。 回复TA

添加新评论