Others · 2022年2月14日 0

如何搭建邮件服务器

前言

在很久以前就想自己搭建一个邮件服务器,正好假期又换了新的服务器,于是原来的那台又闲置了,于是我决定在上面搭建SMTP服务。虽然最后搭起来了,不过我更常用的邮箱是这个→im@eastjun.top

postfix

首先需要安装postfix

sudo apt install postfix

postfix给我们提供了SMTP服务,我们需要修改postfix的配置文件,postfix在/etc/postfix目录下有两个主要的配置文件:main.cfmaster.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

输入上面这一行命令就可以向目标邮箱发送邮件,不过由于没有绑域名,大概率会被标记为垃圾邮件

send

收邮件

使用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.conf10-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的格式:

SASL

测试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进行如下设置:

image-20220214131304724

然后就能用foxmail取邮件了,发邮件也是可以的:

foxmail

域名解析

完成了这些之后如果还想收邮件则需要绑定域名,我手上正好有一个闲置的域名,在DNS中需要添加两条A记录和一条MX记录(IP地址需要设置自己的公网IP),然后将MX记录指向自己的子域名:

image-20220214151341293

然后就能从QQ邮箱发送邮件到服务器上了:

ok

设置SPF

为了提高邮箱发送至外域邮箱的成功率,同时防止其他人伪造我的邮箱发信,还应该在DNS中添加一条TXT记录:

v=spf1 ip4:发信ip ~all

踩坑

  1. Recipient address rejected: Access denied

    输入RCPT TO之后跳出这条错误,可能是域名没有被加入到mydestination中,也可能被smtpd_recipient_restrictions拦截了,可以检查一下这条规则。

  2. 服务器连不上25端口

    端口被封了,请配置好SMTPS用465端口发邮件

  3. 连不上服务器的465/995/993/110/143端口,但本地能连上

    检查防火墙,将这几个端口开放。也可能是dovecot没有设置login_trusted_networks