最近被 Google 弄得贼闹心,加上邮件转发的需要,所以尝试用开源软件在 CentOS 7 上搭建了邮件服务。之前买过 exchange server,也用过 zimbra 都太臃肿,这次用 postfix 来搭建。
注意 这只是一个学习,非常不建议个人搭建邮局服务器,时间成本,维护成本等等非常不划算,邮局系统是非常复杂的。
2GB/2CPUs 的 vps
CentOS 7.5
因为域名是 tourcoder.com,所以先将 hostname 改成 mail.tourcoder.com,执行命令 hostnamectl set-hostname mail.tourcoder.com
postfix
域名 tourcoder.com
提前做好解析(1)创建 name 为 mail 的 A 记录到本 VPS 的 IP(2)创建 name 为 @ 的 mx 记录到 mail.tourcoder.com,优先级为 10(3)设置 SPF,记录为 v=spf1 a mx 123.123.123.123 ~all
,这里的 ip 地址是服务器的 ip 地址,可以去掉
便于理解,这里我画了一张图
发件人通过 MUA (邮件用户代理,即我们常用的邮件客户端) 操作,让 MTA (邮件传输代理,即 postfix) 将邮件传输到 MDA (邮件投递代理,保存在某一个地方,比如数据库中),而收件人通过 MUA 访问 MDA 投递的位置收取邮件。
基本是这么一个原理,但实际产品要比这个复杂得多。
默认的情况下, CentOS 自带了 postfix,只需要进行配置,打开 postfix 的配置文件
vi /etc/postfix/main.cf
按照下面的内容进行配置
第 75 行(vi/vim 命令 :75)
myhostname = mail.tourcoder.com
第 83 行
mydomain = tourcoder.com
第 99 行
myorigin = $mydomain
第 116 行
inet_interfaces = all
第 119 行
inet_protocols = ipv4
取消第 165 行的注释,注释掉 164 行
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
第 264 行,这里的 123.123.123.123
表示当前服务器的 IP 地址,是为了授权其他网络通过本服务器发送邮件。
mynetworks = 127.0.0.0/8 123.123.123.123
第 419 行
home_mailbox = Maildir/
第 425 行
mail_spool_directory = /var/mail
main.cf
文件的配置就结束了,打开 /etc/postfix/master.cf
文件将 smtps 的注释取消
smtps inet n - y - - smtpd
最后重启 postfix
service postfix restart
这时 postfix 基本就配置完成了。
为了方便,就直接在同台机器上进行测试,用 telnet,操作步骤如下
连接 SMTP 服务器,命令 telnet 127.0.0.1 25
连接成功后,输入命令 MAIL FROM:<[email protected]>
,告诉服务器发件人的地址,回车
输入命令 RCPT TO:<[email protected]>
,告诉服务器收件人的地址,回车
输入命令 DATA
回车
输入命令 FROM:[email protected]
,回车
输入命令 TO:[email protected]
,回车,这和上面一行结合解决 undisclosed recipients
的问题
输入命令 Subject: test
回车
输入命令 test body
,回车
输入命令 .
,回车,注意这里就是一个命令点,表示内容结束,传输邮件
这时候会得到 250 2.0.0 Ok:queued as ADFSDAFLJ
,这样的内容,表示邮件已经进入发送队列。此时你可以用命令 quit
退出关闭 telnet。
也可以通过 cyrus
来配置 STMP 用户,一般在 centOS 会自动安装,也可以通过 rpm -qa | grep cyrus
来检查是否已经安装
先更改 /etc/postfix/main.cf
文件
vi /etc/postfix/main.cf
在底部增加
smtpd_client_restrictions = permit_sasl_authenticated
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
然后重启 postfix,接着增加用户
saslpasswd2 -c -u tourcoder.com noreply
这里的 noreply
是用户名,回车会要求给该用户增加密码。完成后可以通过 sasldblistusers2
命令查看是否成功。最后配置 /etc/sasl2/smtpd.conf
文件
vi /etc/sasl2/smtpd.conf
将里面的内容替换成
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login CRAM-MD5 DIGEST-MD5
同样重启后完成即可。
有时候有些服务商会屏蔽 25 这个端口,比如我当前服务器使用的服务商就屏蔽了,可以通过其他的端口来发送邮件,比如 250,操作
编辑 /etc/postfix/master.cf
文件,增加一行 smtp2 inet n - n - - smtpd
编辑 /etc/services
,增加 smtp2 2525/tcp mail2
和 smtp2 2525/udp mail2
防火墙增加该端口
重启 service postfix restart
220 服务就绪
250 请求邮件动作正确,完成(HELO,MAIL FROM,RCPT TO,QUIT 指令执行成功会返回此信息)
235 认证通过
221 正在处理
354 开始发送数据,结束以 .(DATA指令执行成功会返回此信息)
500 语法错误,命令不能识别
550 命令不能执行,邮箱无效
552 中断处理:用户超出文件空间来自:
查看 postfix 的发送记录,vi /var/log/maillog
查看发送队列中的邮件 postqueue -p
或者 mailq
删除所有发送队列中的邮件 postsuper -d ALL
删除所有发送队列中 deferred 的邮件 postsuper -d ALL deferred
incoming 收信箱
active 正在准备发送的邮件
defered 无法发送的邮件,等待重发
corrupt 无法读取或者损坏的邮件
hold 暂停的邮件,需要手工启动 DELIVERY STATUS REPORTS
bounce 每一位收件者的送信状态,记录为什么退信由 bounce(8) 管理
defer 每一位收件者的寄送状态,说明为什么延迟由 defer(8) 管理
trace 每一位收件者的寄送状态信息,说明被 Postfix 用 sendmail -v
或 sendmail -bv
命令执行的状态由 trace(8) 管理
更多说明看 https://postfix.org
> 可在 Twitter/X 上评论该篇文章或在下面留言(需要有 GitHub 账号)