在很久以前就想自己搭建一个邮件服务器,正好假期又换了新的服务器,于是原来的那台又闲置了,于是我决定在上面搭建SMTP服务。虽然最后搭起来了,不过我更常用的邮箱是这个→
postfix
首先需要安装postfix
sudo apt install postfix
postfix给我们提供了SMTP服务,我们需要修改postfix的配置文件,postfix在/etc/postfix
目录下有两个主要的配置文件:main.cf
和master.cf
在main.cf
中需要修改以下配置:
myhostname = smtp.example.com mydomain = example.com myorigin = example.com mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
这几个选项的含义如下
-
myhostname:系统的主机名
-
mydomain:域名
-
myorigin:发邮件时这个选项指定的域名会作为发件人的域名,默认值为
/etc/mailname
,也可以去这个文件里面修改它 -
mydestination:这个选项指定收邮件时收件人的域名
-
mynetworks:通过服务器发送邮件的可信列表
在设置完这些这些之后SMTP服务器已经拥有了收发邮件的功能,不过还没绑定域名,收邮件只能先用nc模拟一下。
配置SMTPS
配置SMTPS需要在main.cf
中设置证书目录,可以使用默认设置,不需要修改。然后在master.cf
中加入下面的配置:
smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_reject_unlisted_recipient=no -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth
其中使用了dovecot进行SASL认证,这段等下会用到,如果还没配置Dovecot但需要测试SMTPS可先注释掉
测试收发功能
发送邮件
使用sendmail命令可以发送邮件,输入下面的命令就可以开始写邮件了,邮件以点号结尾
printf "123\r\n.\r\n"|sendmail root@example.com
输入上面这一行命令就可以向目标邮箱发送邮件,不过由于没有绑域名,大概率会被标记为垃圾邮件
收邮件
使用nc模拟收邮件的功能:
ncat 192.168.8.129 465 --ssl
交互过程如下:
220 smtp.example.com ESMTP Postfix (Ubuntu) MAIL FROM: <im@eastjun.top> 250 2.1.0 Ok RCPT TO: <eastjun@example.com> 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: mytest 123 . 250 2.0.0 Ok: queued as 971CC120D65 QUIT 221 2.0.0 Bye
完成这一段交互之后就能在/var/mail/
下看到邮件
Dovecot
Ubuntu下安装dovecot的命令如下:
sudo apt install dovecot-imapd dovecot-pop3d
dovecot可以给我们提供POP3/IMAP服务以及SASL认证,dovecot的配置文件在/etc/dovecot/
下,其中大部分的设置都在/etc/dovecot/conf.d
目录下按照不同功能放在不同的文件中
设置外部可以服务POP3/IMAP服务
在dovecot.conf
中加入以下配置就可以在远程连接POP3/IMAP服务
login_trusted_networks = 0.0.0.0/0
然后用下面这条命令可以看到dovecot监听了4个端口
netstat -lntp | grep dovecot
POP3s/IMAPs
默认在10-master.conf
和10-ssl.conf
中已经设置好了,在10-ssl.conf
中可以修改证书目录
设置SASL认证
在10-auth.conf
中修改这一行:
auth_mechanisms = plain login
在10-master.conf
中取消这几行的注释:
unix_listener /var/spool/postfix/private/auth { mode = 0666 }
测试SASL认证
在这里首先要输入一条HELO命令,然后在输入账号密码时需要用base64的格式:
测试POP3/IMAP4
同样使用nc工具进行测试:
ncat 192.168.8.129 995 --ssl
交互的过程如下:
+OK [XCLIENT] Dovecot (Ubuntu) ready. USER eastjun +OK PASS ********** +OK Logged in. STAT +OK 6 3411 RETR 6 +OK 317 octets Return-Path: <im@eastjun.top> X-Original-To: eastjun@example.com Delivered-To: eastjun@example.com Received: from unknown (unknown [192.168.8.1]) by smtp.example.com (Postfix) with SMTP id 971CC120D65 for <eastjun@example.com>; Mon, 14 Feb 2077 12:42:24 +0800 (CST) Subject: mytest 123 .
测试完就可以使用Foxmail进行如下设置:
然后就能用foxmail取邮件了,发邮件也是可以的:
域名解析
完成了这些之后如果还想收邮件则需要绑定域名,我手上正好有一个闲置的域名,在DNS中需要添加两条A记录和一条MX记录(IP地址需要设置自己的公网IP),然后将MX记录指向自己的子域名:
然后就能从QQ邮箱发送邮件到服务器上了:
设置SPF
为了提高邮箱发送至外域邮箱的成功率,同时防止其他人伪造我的邮箱发信,还应该在DNS中添加一条TXT记录:
v=spf1 ip4:发信ip ~all
踩坑
-
Recipient address rejected: Access denied
输入
RCPT TO
之后跳出这条错误,可能是域名没有被加入到mydestination
中,也可能被smtpd_recipient_restrictions
拦截了,可以检查一下这条规则。 -
服务器连不上25端口
端口被封了,请配置好SMTPS用465端口发邮件
-
连不上服务器的465/995/993/110/143端口,但本地能连上
检查防火墙,将这几个端口开放。也可能是dovecot没有设置
login_trusted_networks