引
之前我有和大家分享过如何搭建自定义域名邮箱,现在这台搬瓦工的服务器我已经出掉了,所以要把邮箱服务器迁移到哪里就成了一个困扰我的问题。当然,如果你也想搭建邮件服务器的话可以去看一下那篇文章,本文所讲的内容是建立在那篇文章的基础上的。
问题
很多 IDC 的机器都是不允许用户向其它服务器的 25 端口建立连接的,这是为了保护 IP 段的信誉,毕竟如果 IDC 的客户多的话 IP 滥用很严重,而那几个邮箱黑名单的解封价格又贵得离谱,很多时候 IDC 并不愿意支付这笔额外开支。而像 DMIT 就更狠了,直接封禁 25 端口的出站,也就是本机的 25 端口无法向外发送数据,但是其它机器向它的 25 端口发送是可以收到的。也就是说在 DMIT 的机器上我连收件也做不到——因为 25 端口只接收数据还不够,回程的包也是从 25 出的,直接被拦截了。但是这也只是一个个例,大部分的 IDC 都是只封目标端口为 25 的连接的。
我肯定不会为了一个邮件服务器去单独买个不封 25 的 VPS,结果我在查询资料的时候发现了 SMTP Relay 这种东西。而 SMTP2GO 是一个可以免费提供 SMTP Relay 服务的商家,虽然免费账户每天只能发 200 封邮件,每月只能发 1000 封邮件,但对于我这种个人用户来说已经足够了。
部署
先打开 SMTP2GO 的官网,注册一个账户,然后在 Dashboard 里它会提示你按 4 步走。
第一步,「Enter the domain you’d like to add」,输入你想要添加的域名,就是你邮箱的「@」后面的部分,比如我的就是「insmtr.cn」。
第二步,「Add a Verified Sender」,这一步它会让你添加 3 条 TXT 记录到你的域名。如果你用的是一些主流的 DNS 服务商(比如 Cloudflare),它会提供一键添加 TXT 记录的功能,直接点一下按钮就自动添加了。如果你的 DNS 服务商不支持一键添加,你也可以手动添加这些 TXT 记录。完成之后点击「Verify」验证成功即可。
完成之后,在 DNS 设置中将原来的 v=spf1 mx ~all 这条根 TXT 记录改成 v=spf1 -all。原来的 v=spf1 mx ~all 表示只有你的域名的 MX 记录所示的域名可以代你发送邮件,而修改之后的 v=spf1 -all 表示允许其它 IP 代表你的域名发送邮件,搭配刚才 SMTP2GO 让我们添加的 em 开头的 TXT 记录,表示只有 SMTP2GO 的服务器可以代表你的域名发送邮件。em 开头的那个域名就是 SMTP2GO 发件时候用的 Return-Path 里显示的域名,邮件服务器会检查这个域名的 SPF 记录来判断发件服务器的 IP 地址是否有权限代表这个域名发送邮件。
第三步,「Get an SMTP username or API key」,这一步就是邮件服务器连接 SMTP2GO 的凭据了。SMTP2GO 提供了两种接入方式,一种是 SMTP User,可以把邮件用 SMTP 协议转发给上游,上游再代为发送;另一种是 HTTP API,可以直接通过 HTTP API 调用 SMTP2GO 的服务。而我用的 maddy 服务器只支持 SMTP User 模式,所以我们在左侧的 Sending 里面找到 SMTP Users,创建一个 SMTP User,记录下它的用户名和密码。
接下来我们去修改 maddy 的配置文件,如果你用的是其它邮件服务器,可以自行搜索教程,道理类似。
找到 target.remote outbound_delivery 这段,内容是这样的:
target.remote outbound_delivery {
limits {
# Up to 20 msgs/sec across max. 10 SMTP connections
# for each recipient domain.
destination rate 20 1s
destination concurrency 10
}
mx_auth {
dane
mtasts {
cache fs
fs_dir mtasts_cache/
}
local_policy {
min_tls_level encrypted
min_mx_level none
}
}
}
给它整段注释掉,然后在下面添加新的配置:
target.smtp smtp2go_relay {
targets tcp://mail.smtp2go.com:587
starttls yes
auth plain "你刚刚创建的 SMTP User 用户名" "你刚刚创建的 SMTP User 密码"
}
然后下面的 target.queue remote_queue 里把 target &outbound_delivery 改成 target &smtp2go_relay 就行了。
target.queue remote_queue {
# target &outbound_delivery
target &smtp2go_relay
autogenerated_msg_domain $(primary_domain)
bounce {
destination postmaster $(local_domains) {
deliver_to &local_routing
}
default_destination {
reject 550 5.0.0 "Refusing to send DSNs to non-local addresses"
}
}
}
最后改一下 DKIM 签名,找到 submission 相关的这段:
modify {
dkim $(primary_domain) $(local_domains) default
}
给它注释掉,注意就只注释这一小段。注释之后,DKIM 签名就由 SMTP2GO 接管,确保你的域名信誉不受影响。
第四步,重启邮件服务器,大功告成!现在你就可以通过 SMTP2GO 的服务器来发送邮件了,即使你的服务器被封了 25 目的端口也没关系了,理论上随便找台 VPS 大概率都没问题。
惊喜
本来我以为这么配置之后只是可以绕过 25 端口发件了而已,结果在测试的时候发现,我向 Outlook 邮箱发送邮件时,Outlook 竟然没有把邮件扔进垃圾箱!众所周知,Outlook 自己有一套非常严格的垃圾邮件过滤机制,即使你的发件服务器的 IP 不在任何黑名单内,也是有极大概率直接进垃圾箱的,包括我之前那台搬瓦工。这说明 SMTP2GO 的服务器的 IP 地址的信誉非常好,这真是一个意外的惊喜!
结语
总之,SMTP2GO 是一个非常好用的 SMTP Relay 服务商,免费账户的限制对于个人用户来说已经足够了,而且可以绕过烦人的 25 端口限制。如果你也想搭建邮件服务器的话,不妨试试 SMTP2GO 吧!