必要条件


以Linux为例。操作系统是64位的,CPU是X86架构的。操作系统是Debian 10 (buster)。在Debian 10上安装postfix和opendkim。所有的命令都以Root用户的身份运行。


检查你的服务器

检查系统版本

1.你可以输入以下命令查看发行版信息:

1
cat /etc/issue

2.查看CPU类型和操作系统内核版本

1
uname -a

检查25端口是否开放

1.安装telnet客户端程序

1
apt install telnet -y

2.用telnet命令检查25端口

1
telnet smtp-mail.outlook.com 25

如果能看见 220 字样,说明你的服务器已经成功地主动连上outlook的邮件服务器。outlook的服务器正在用它的25端口来接受你的传入连接。

1
2
3
4
5
~# telnet smtp-mail.outlook.com 25
Trying 2603:1026:207:14::2...
Connected to AMS-efz.ms-acdc.office.com.
Escape character is '^]'.
220 AM8P190CA0023.outlook.office365.com Microsoft ESMTP MAIL Service ready at Fri, 23 Jun 2021 19:29:07 +0000

输入quit 四个字母可以退出telnet的界面。退出成功后,你能看见下面的内容

1
2
3
quit
221 2.0.0 Service closing transmission channel
Connection closed by foreign host.

如果输入telnet smtp-mail.outlook.com 25 后,看到“Connection timed out”字样,说明你服务器的传出连接无法到达其他邮件服务器的25端口。“Connection timed out”提示看起来像下面的样子:

1
2
3
4
5
6
7
8
9
Trying 2603:1026:207:15::2...
Trying 2603:1026:207:177::2...
Trying 2603:1026:c03:3030::2...
Trying 2603:1026:c03:6027::2...
Trying 40.101.12.66...
Trying 52.97.250.242...
Trying 40.101.19.162...
Trying 40.101.121.34...
telnet: Unable to connect to remote host: Connection timed out

看到“Connection timed out”,你需要换一台服务器,或者需要找VPS提供商的客服申请开放25端口。


输入quit退出telnet

1
2
3
quit
221 2.0.0 Service closing transmission channel
closed by foreign host.

尝试解封25端口

1.你可以检查一下VPS提供商的云防火墙(安全组),看看有没有封锁25端口的规则,有的话删掉它们。


2.你可以输入 iptables -L ,检查一下本机的防火墙规则,看看有没有smtp25 之类的字样,有的话删掉它们。删规则之前要想清楚,可能会带来安全问题。输入以下命令可删除本机上所有的防火墙规则:

1
2
iptables -F 
iptables -X

设置PTR记录

修改PTR记录

以VPS提供商 Ramnode 为例。假如发送邮件服务器是 mail.ddd.com ,你服务器的IP地址是2.2.2.2 。在浏览器的地址栏里输入 https://ramnode.com/ ,点击右上角的“Login”。输入账号密码登录网页版的后台,点击“Access Control Panel”进入控制面板。点击屏幕左上角“Cloud“,再点击屏幕左上角的“Instances”,接着点击“Name”下面的区域,点击“INFO”,点击“Get PTR”,在“PTR”一栏下输入 ddd.com ,最后点击“SAVE PTR”。等上半小时再做下一步。


检查PTR记录是否生效

1.安装DNS相关的工具

1
apt install dnsutils -y

2.检查服务器的PTR记录

1
dig -x 2.2.2.2

如果能在“ANSWER SECTION:”下方看到“ PTR mail.ddd.com. ”,说明PTR记录修改成功了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
~# dig -x 2.2.2.2

; <<>> DiG 9.11.5-P4-5.1+deb10u5-Debian <<>> -x 2.2.2.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24839
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;2.2.2.2.in-addr.arpa. IN PTR

;; ANSWER SECTION:
2.2.2.2.in-addr.arpa. 1223 IN PTR mail.ddd.com.

;; Query time: 7 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Jun 23 19:47:48 UTC 2021
;; MSG SIZE rcvd: 109


修改系统设置

假设发送邮件服务器是 mail.ddd.com ,你的根域名是 ddd.com


修改主机名

1.显示主机名(hostname)

1
hostname

2.修改主机名(hostname)

1
hostnamectl set-hostname ddd.com

修改hosts文件

用文本编辑器修改文件hosts

1
nano /etc/hosts

可以参考下面进行修改:

1
2
3
4
5
6
7
127.0.0.1    localhost
127.0.0.1 ddd.com mail

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

修改mailname

清空文件mailname

1
cat /dev/null > /etc/mailname

安装相关软件

以电子邮件服务端(mail server)Postfix 为例 。假设发送邮件服务器是 mail.ddd.com ,你的根域名是 ddd.com


1.删除Debian自带的exim4

1
apt-get --purge remove exim4 exim4-base
1
dpkg -l | grep exim
1
dpkg -P exim_*

2.安装邮件服务端程序Postfix和垃圾邮件过滤器OpenDKIM

1
apt install -y postfix opendkim opendkim-tools

按一下Tab键,选中 <OK> ,按一下Enter键。按方向键↑和方向键↓移动光标,选中“Internet Site”,按一下Enter键。输入 ddd.com ,按一下Tab键,选中 <OK>


调整Postfix的设置

1.用文本编辑器修改postfix的配置文件。Postfix被设定成只能发邮件不能收邮件

1
nano /etc/postfix/main.cf

打开文件,按方向键↓,使画面向下滚动,可参考下面的内容进行修改。…代表两行中间有被省略的内容。#号后面的内容只是注释,可以不写。

1
2
3
4
5
6
7
8
9
10
11
...
smtp_tls_security_level=encrypt # 强制要求其他的邮件服务器也使用加密的连接
...
myhostname = ddd.icu # 设置hostname
mydomain = ddd.icu
...
mydestination = $myhostname, localhost.$mydomain, $mydomain
mynetworks = 127.0.0.0/8 # 指定内网和本地的IP地址范围
...
inet_interfaces = loopback-only # 只处理来自环回接口的邮件,不接收来自外界的邮件
inet_protocols = ipv4 # 使用ipv4

2.重启postfix

1
systemctl restart postfix

3.检查postfix的运行状况

1
systemctl status postfix

如果能看见“active (exited)”字样,说明postfix已正常启动。如果有红字,请检查一下postfix的配置文件,它位于/etc/postfix/main.cf,看看有没有写错。可以按 CTRL + C 组合键退出systemctl的界面。


调整Opendkim的设置

1.用文本编辑器修改opendkim的配置文件

1
nano /etc/opendkim.conf 

可参考下面修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# This is a basic configuration for signing and verifying. It can easily be
# adapted to suit a basic installation. See opendkim.conf(5) and
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for complete
# documentation of available configuration parameters.

Syslog yes
SyslogSuccess yes
#LogWhy no

# Common signing and verification parameters. In Debian, the "From" header is
# oversigned, because it is often the identity key used by reputation systems
# and thus somewhat security sensitive.
Canonicalization relaxed/simple
#Mode sv
#SubDomains no
OversignHeaders From

# Signing domain, selector, and key (required). For example, perform signing
# for domain "example.com" with selector "2020" (2020._domainkey.example.com),
# using the private key stored in /etc/dkimkeys/example.private. More granular
# setup options can be found in /usr/share/doc/opendkim/README.opendkim.
Domain ddd.com
Selector ddd
KeyFile /etc/dkimkeys/ddd.private

# In Debian, opendkim runs as user "opendkim". A umask of 007 is required when
# using a local socket with MTAs that access the socket as a non-privileged
# user (for example, Postfix). You may need to add user "postfix" to group
# "opendkim" in that case.
UserID opendkim
UMask 007

# Socket for the MTA connection (required). If the MTA is inside a chroot jail,
# it must be ensured that the socket is accessible. In Debian, Postfix runs in
# a chroot in /var/spool/postfix, therefore a Unix socket would have to be
# configured as shown on the last line below.
#Socket local:/run/opendkim/opendkim.sock
Socket inet:8891@localhost
#Socket inet:8891
#Socket local:/var/spool/postfix/opendkim/opendkim.sock

PidFile /run/opendkim/opendkim.pid

# Hosts for which to sign rather than verify, default is 127.0.0.1. See the
# OPERATION section of opendkim(8) for more information.
#InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12

# The trust anchor enables DNSSEC. In Debian, the trust anchor file is provided
# by the package dns-root-data.
TrustAnchorFile /usr/share/dns/root.key
#Nameservers 127.0.0.1

2.为你的域名(ddd.com)生成密钥对。密钥对由一个公钥和一个私钥组成。-s 是 Selector(过滤器) 的名字。-d 是 Domain(域名),用来告诉别人邮件是从哪一台电脑发出来的。

1
sudo -u opendkim opendkim-genkey -D /etc/dkimkeys -d ddd.com -s ddd

上面的命令将在目录 /etc/dkimkeys 下创建两个新的文件,分别 ddd.private 和 ddd.txt 。私钥在文件 ddd.private 里。公钥在文件 ddd.txt 里。


3.重启opendkim

1
systemctl restart opendkim

4.用文本编辑器修改Postfix的配置文件

1
nano /etc/postfix/main.cf

在文件末尾添加下面两行内容

1
2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milters

5.重新载入postfix

1
systemctl reload postfix

修改DNS记录

以DNS托管服务商 Cloudflare 为例。假设你服务器的IPv4地址是2.2.2.2 ,你的主域名(Primary Domain)是 ddd.com ,你的邮件服务器是 mail.ddd.com


1.添加一条A记录:

1
2
类型        名称        IPv4地址        TTL        代理状态
A mail 2.2.2.2 自动 仅限DNS

2.添加一条MX记录:

1
2
类型        名称        邮件服务器        TTL        优先级
MX @ mail.ddd.com 自动 30

3.添加一条SPF记录:

1
2
类型        名称        TTL        内容                
TXT @ 自动 v=spf1 ip4:81.4.109.130 ~all

4.设置DKIM记录:

查看文件ddd.txt

1
cat /etc/dkimkeys/ddd.txt

( “ “)内的内容就是DKIM记录。


添加DKIM记录

1
2
类型        名称                      TTL        内容                
TXT ddd._domainkey 自动 v=DKIM1; K=rsa; p=xxxxxx;

xxxx是一串长长的数字和字母,中间没有双引号,记得删掉多余的双引号 。


5.添加DMARC记录:

1
2
类型        名称        TTL                     
TXT _dmarc 自动
1
2
内容
v=DMARC1; p=none; rua=mailto:example@outlook.com;

其中 example@outlook.com 是你的邮箱地址


6.等DNS记录自动生效。等半小时后再做下一步。


发送测试邮件

1.安装电子邮件客户端mailutils。mailutils可以帮我们写邮件,也可以帮我们把邮件传给postfix。

1
apt-get install mailutils

2.输入命令发送邮件。 其中 userx@example.com 是你另一个邮箱的地址

1
mail userx@example.com

1
2
3
4
user@mail:~# mail userx@example.com
Cc:
Subject: Postfix Testing
Postfix Send-Only Server

其中 Subject 是邮件的主题,Subject 下面的区域是邮件的正文。输入主题和正文后,按Ctrl+D来发送邮件。


3.打开你另一个邮箱看看有没有收到邮件。如果迟迟收不到邮件,可以检查一下日志文件 mail.log,文件 mail.log/var/log/mail.log


一切顺利的话,你的服务器现在有能力发邮件了,只是还不能收邮件而已。