惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
IT之家
IT之家
T
The Blog of Author Tim Ferriss
V
V2EX
博客园 - 聂微东
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
U
Unit 42
Vercel News
Vercel News
L
LangChain Blog
博客园 - 司徒正美
H
Help Net Security
Recent Announcements
Recent Announcements
Recorded Future
Recorded Future
V
Visual Studio Blog
Jina AI
Jina AI
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
Y
Y Combinator Blog
C
Check Point Blog
博客园 - 三生石上(FineUI控件)
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
The Register - Security
The Register - Security
The GitHub Blog
The GitHub Blog
B
Blog RSS Feed
F
Fortinet All Blogs
B
Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
罗磊的独立博客
博客园_首页
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
量子位
I
InfoQ
小众软件
小众软件
P
Proofpoint News Feed

达拉斯・卢

OpenWRT 使用 udp2raw 对抗 WireGuard 阻断 博客程序架构的思考与展望 如何证明你是原创作者 Nginx 泛域名配置的隐患与对策 WISeID S/MIME 证书 V2EX 刑满释放记 使用 Radicale 在 Ubuntu 24.04 中搭建 vCards CardDav 服务 邮件服务的域名成功从 SURBL 黑名单移除 网站多语言的设计细节 网站评论系统的目前进展和展望 在公网使用 iptables 转发端口时保留客户端 IP 邮件投递平台 Postal 的使用经验 互联网在崩塌吗,然后呢 在 SvelteKit 应用中使用 JSON-LD 网页的打印样式应该怎么写 “茴字的四种写法”之 IP 与域名 怎么伪造 Git 提交的时区 供大众交流的论坛和其它替代产品还是不好用 改编不是照搬 一次排查诡异的网络问题的经历
自建 Postal 完美替代 SendGrid
达拉斯・卢 · 2024-06-28 · via 达拉斯・卢

Cloudflare 的邮件路由功能很好用。作为补充,我一直使用 SendGrid 来发信,也一直在寻找替代品。自托管邮件有 Mail-in-a-box,Docker-mailserver,MailCow 等等选择。不过,有时我并不需要收件箱,因此我决定尝试 Postal 作为 SendGrid 的替代方案。本文记录 Postal 的安装与使用。

准备

一个域名

一般使用二级域名即可,比如 postal.example.com。仅作为管理和配置使用,安装成功后,可以随意绑定新域名来收发邮件。

一台 VPS

最好有一台专门用来运行 Postal 的 VPS,允许 25 端口的出入流量,有 IPv4 和 IPv6 的公网 IP,同时为其设置 rDNS 解析到 postal.example.com,这是发信成功率的一个重要因素。

如何测试 VPS 是否允许 25 端口的流量

测试能否连接其他服务器的 25 端口
telnet smtp.google.com 25
测试外部服务器能否连接本机的 25 端口

在本机监听 25 端口:

nc -l -p 25

放行 25 端口入站流量,例如使用 UFW:

ufw allow 25/tcp

从外部连接本地 25 端口

telnet <YOUR_VPS_IP> 25

很幸运,我所用的 ServerHub 独立主机没有 25 端口的限制。与此同时,我使用的 DMIT 并不允许 IPv4 的 25 端口出站流量。但允许 25 端口的入站流量,这一点可能应该有涛叔的功劳1

安装 Postal

Postal 建议至少 4GB 内存,以及 25GB 的存储空间。我使用了一台全新安装的 Ubuntu 22.04 来运行 Postal。

apt install git curl jq
git clone https://github.com/postalserver/install /opt/postal/install
sudo ln -s /opt/postal/install/bin/postal /usr/bin/postal

Docker

Postal 并没有声明其支持 Podman,因此我们还是老实地安装 Docker:

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

MariaDB

可以使用 Docker。

docker run -d \
   --name postal-mariadb \
   -p 127.0.0.1:3306:3306 \
   --restart always \
   -e MARIADB_DATABASE=postal \
   -e MARIADB_ROOT_PASSWORD=postal \
   mariadb

当然也可以不用 Docker,注意 Postal 需要对数据库 postal postal-% 有全部的权限。

GRANT ALL PRIVILEGES ON `postal`.* TO 'postal'@'%' IDENTIFIED BY 'YOUR_PASSWORD' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `postal\-%`.* TO 'postal'@'%' IDENTIFIED BY 'YOUR_PASSWORD' WITH GRANT OPTION;
FLUSH PRIVILEGES;

为了记录邮件,需要确认 innodb_log_file_size 为邮件大小上限的十倍。查看当前的配置2

SHOW GLOBAL VARIABLES LIKE 'innodb_log_file_size';

准备 Postal

运行:

postal bootstrap postal.yourdomain.com

编辑生成的配置文件,设置数据库密码等:

vim /opt/postal/config/postal.yml

ghcr.io

访问 https://github.com/settings/tokens/new 生成一个 classic token3

export CR_PAT=YOUR_TOKEN
export ghcr_user=YOUR_GITHUB_USERNAME
echo $CR_PAT | docker login ghcr.io -u $ghcr_user -password-stdin

初始化数据库等

postal initialize

创建管理员

postal make-user

启动 Postal

postal start

Caddy

docker run -d \
   --name postal-caddy \
   --restart always \
   --network host \
   -v /opt/postal/config/Caddyfile:/etc/caddy/Caddyfile \
   -v /opt/postal/caddy-data:/data \
   caddy

配置 DNS 解析

需要为 postal.example.com 创建 A 和 AAAA 记录,指向服务器 IP。根据 https://docs.postalserver.io/getting-started/dns-configuration 继续配置其他解析记录。

配置文件中,dns.mx_records 中的域名,都应该 CNAME 到 postal.example.com。

使用 Postal

访问 postal.example.com,创建一个组织,再创建一个邮件服务器,添加域名,按页面提示配置好邮件域名的 DNS 解析记录并验证。

访问 Messages -> Send Message,可以发送测试邮件。访问 https://www.mail-tester.com 获得一个测试邮件地址,并发送测试邮件,看看能否达到满分。

访问 Credentials,可以添加 SMTP 凭据,就可以愉快地发信了。

建议打开设置中的隐私模式,以避免泄漏 SMTP 客户端的 IP。

结语

Postal 同样支持类似 Cloudflare 邮件路由的收信功能,可以转发到邮箱或者 HTTP 接口。不久前,我的 SendGrid 账户因为未知原因无法登陆,发了工单,客服回复说我的账户来自外部系统,因为技术原因不能登录了。用了一段时间的 Postal,基本上可以完全替代 SendGrid 之类的服务,并且更加自由。


  1. 涛叔. 记录开通 25 号端口的经历. Taoshu.in. 2022. ↩

  2. https://mariadb.com/docs/server/storage-engines/innodb/operations/configure-redo-log/

  3. Andrew Hoog. Authorizing GitHub Container Registry. DON'T PANIC. 2023 ↩