准备条件
-
-
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/