准备条件
-
-
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:<test@tourcoder.com>,告诉服务器发件人的地址,回车 -
输入命令
RCPT TO:<hi@test.tourcoder.com>,告诉服务器收件人的地址,回车 -
输入命令
DATA回车 -
输入命令
FROM:test@tourcoder.com,回车 -
输入命令
TO:hi@test.tourcoder.com,回车,这和上面一行结合解决undisclosed recipients的问题 -
输入命令
Subject: test回车 -
输入命令
test body,回车 -
输入命令
.,回车,注意这里就是一个命令点,表示内容结束,传输邮件
这时候会得到 250 2.0.0 Ok:queued as ADFSDAFLJ,这样的内容,表示邮件已经进入发送队列。此时你可以用命令 quit 退出关闭 telnet。
配置 STMP 用户
也可以通过 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
MAIL QUEUES
-
incoming 收信箱
-
active 正在准备发送的邮件
-
defered 无法发送的邮件,等待重发
-
corrupt 无法读取或者损坏的邮件
-
hold 暂停的邮件,需要手工启动 DELIVERY STATUS REPORTS
-
bounce 每一位收件者的送信状态,记录为什么退信由 bounce(8) 管理
-
defer 每一位收件者的寄送状态,说明为什么延迟由 defer(8) 管理
-
trace 每一位收件者的寄送状态信息,说明被 Postfix 用
sendmail -v或sendmail -bv命令执行的状态由 trace(8) 管理
更多说明看
参考:
https://tourcoder.com/install-postfix-on-centos-7/