前言

终于上大学了!

来到大学干的第一件科技相关还是把所有的服务迁移到我的 Contabo VPS 上,所以就迟来地记录一下安装邮件服务的过程吧(

开整!

在这里,我选择 hanxuan.ya 作为示例域名,hxsel 作为示例的选择器(selector)名称,10.20.30.40 作为示例的服务器 IP。

Prerequisite

安装 dovecot (IMAP 服务器)和 postfix(SMTP 服务器):

[bai@duesseldorf-vps ~]$ sudo apt install dovecot-core dovecot-imapd dovecot-imaptest postfix

postfix 的配置阶段,将 Mail Server Configuration Type 设置为 Internet Site,并设置 System Mail Name。

折腾一下 dovecot

首先把 imaps 给打开。

如此编辑 /path/to/dovecot/conf.d/10-master.conf

...
service imap-login {
    ...
    inet_listener imaps {
        port = 993
        ssl = yes
    }
    ...
}

顺手联动一下 Postfix

...
unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
}
...

然后打开 /path/to/dovecot/conf.d/10-auth.conf,把明文登录给禁咯:

...
disable_plaintext_auth = yes
...

再在 /path/to/dovecot/conf.d/10-ssl.conf 设置一下要使用的 SSL 证书:

...
ssl = required

ssl_cert = </path/to/your/ssl/cert/fullchain.pem
ssl_key = </path/to/your/ssl/key/privkey.pem
...

其中,如果你和我一样也在使用 Let’s Encrypt 的证书,格式大概像这样:

ssl_cert = </etc/letsencrypt/live/hanxuan.ya/fullchain.pem
ssl_key = </etc/letsencrypt/live/hanxuan.ya/privkey.pem

折腾一下 postfix

如此编辑 /path/to/postfix/main.cf

...
smtpd_tls_cert_file = /path/to/your/ssl/cert/fullchain.pem
smtpd_tls_key_file = /path/to/your/ssl/key/privkey.pem
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_tls_auth_only = yes
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
...

鉴于我在我自己的邮件服务器上使用的是 Maildir,这里只展示使用它的配置:

home_mailbox = Maildir/

如此编辑 /path/to/postfix/master.cf

...
submission inet n   -   y   -   -   smtpd
    -o syslog_name=postfix/submission
    -o smtpd_tls_security_level=encrypt
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_tls_auth_only=yes
    -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
...

其他要设置的东西

在 DNS 服务商处,需要添加这些记录:

mail    IN      A   10.20.30.40
@       IN      MX  10  mail.hanxuan.ya.
@       IN      TXT "v=spf1 a:mail.hanxuan.ya ip4:10.20.30.40 ~all"
_dmarc  IN      TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected], mailto:[email protected]; pct=100; adkim=r; aspf=r"

其中,

  1. _dmarc 段不一定要像我这么写,网上有很多的 DMARC 记录生成器,可以自己按照需求去生成一个(
  2. spf 记录中,如果设置了 a 段,则必须在 ip4ip6 段对应的 IP 地址设置一个指向 a 段所示域名的 PTR 记录。1

如果你有别的需求,那 spf 可能会长这样:

@   IN  TXT "v=spf1 a:mail6.hanxuan.ya ip6:1a1a::3 ~all" -- 来!给他整个 IPv6!(
@   IN  TXT "v=spf1 a:mail-double.hanxuan.ya ip4:10.20.30.39 ip6:1a1a::4 ~all" -- 双栈其实也可以啦(
@   IN  TXT "v=spf1 a:mail-bulk.hanxuan.ya ip4:10.0.0.0/8 ~all" -- 以防你有好多好多 IP

杂七杂八的东西

opendkim

如果你还想使用 opendkim,可以先安装一下:

[bai@duesseldorf-vps ~]$ sudo apt install opendkim

然后如此编辑 /path/to/opendkim.conf

Mode sv
...
KeyTable /storage/for/KeyTable
SigningTable refile:/storage/for/SigningTable
ExternalIgnoreList refile:/storage/for/TrustedHosts
InternalHosts refile:/storage/for/TrustedHosts
...
Socket inet:8891@localhost
...
Domain hanxuan.ya
RequireSafeKeys False

创建一个 /storage/for/KeyTable 文件,大概这么写一写:

hxsel._domainkey.hanxuan.ya hanxuan.ya:hxsel:/path/to/hxsel.private

然后是 /storage/for/SigningTable

*@hanxuan.ya  hxsel._domainkey.hanxuan.ya

/storage/for/TrustedHosts:

127.0.0.1
::1
*.hanxuan.ya

然后去生成一个 key:

opendkim-genkey --domain=hanxuan.ya --bits=1024 --directory=/path/to/ --selector=hxsel

这样,在 /path/to/ 文件夹中会生成两个文件,一个是 hxsel.private,另外一个是 hxsel.txt

其中, hxsel.txt 是对应的 TXT 记录,需要自行导入到相应的 DNS 提供商处。

再在 postfix 那边联动一下:

# /path/to/postfix/main.cf
...
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_defaule_action = accept
...

然后重启就可以了(!

letsencrypt

可以设置一个 crontab 每天自动重启一下服务(因为我的服务比较小 也一般不会有人大半夜给我发消息)以便刷新证书:

[bai@duesseldorf-vps ~]$ sudo crontab -e
0 0 * * * systemctl restart dovecot; systemctl restart postfix

完成!现在我们有了自己的邮件服务器(!


  1. Google (n.d.). Google Email Sender Guidelines. IP Addresses. https://support.google.com/a/answer/81126?p=sender-guidelines-ip#ip The sending IP address must match the IP address of the hostname specified in the PTR record. ↩︎