摘要訊息 : 當伺服器無法正常發送電子郵件時的修復教學.

0. 前言

很多伺服器提供商的邮件发送连接埠 25 是预设被阻挡的, 这是因为有不少垃圾邮件是从这些伺服器发出的. 像我用过的 Vultr 和腾讯云. 我们首先都要发起一份服务单, 像伺服器提供商说明我们需要这个连接埠来发送邮件. 一般来说, 伺服器提供商都会为我们解除 SMTP 连结埠的阻挡.

我不再建议采用自行配置的方案发送邮件, 更倾向于使用某些伺服器提供商专门提供的邮件发送服务.

本文于 2022 年 3 月 17 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. 配置

在伺服器提供商为我们解除连结埠阻挡之后, 我们需要对服务器进行一些配置.

首先安装依赖 : yum install -y sendmail sendmail-cf m4. 因为 sendmail 安装完成之后是默认开机启动的, 所以不需要做开机启动配置, 需要对 postfix 做开机启动 : systemctl enable postfix.

我们在 /etc/mail/local-host-name 中加入你的网域名称, 不需要加 www. 之后设定配置文件 : vim /etc/mail/sendmail.mc, 查找 DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl, 把 127.0.0.1 改为 0.0.0.0. 设定完成之后进行转换 m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf.

然后进入 /etc/mail, 制作 Hash 格式的资料库 : makemap hash access < access. 修改 submit.cf 文件 vim /etc/mail/submit.cf, 找到 Dj$w.Foo.COM, 改为 Dj你的域名 (例如 Djjonny.vip).

现在我们要对 PHP 进行配置. 打开 php.ini 档案, 查找 sendmail_path, 改为 sendmail_path=/usr/sbin/sendmail -t -i -f'xxx@xxx.xxx' (其中 xxx@xxx.xxx 替换为你想要的发件人邮箱, 可以是任意的, 但是不建议随便填写, 因为这一般都会违反伺服器提供商的规定). 这样可以防止出现 "由 xxx 代发" 的问题. 修改为 PHP 的配置档案, 需要重新启动 PHP-FPM.

最终我们启动服务 : systemctl start postfix sendmail, 并且使用 mail -s "test" xxx@xxx.xxx 指令, 随便输入一些内容然后按 Control + D 发送. 如果发送成功会返回 EOT.

登录邮箱我们便可以看到

Figure 1. 成功接收到测试邮件

2. 一些问题的解决方案

当遇到 unable to qualify my own domain name (xxx) -- using short name 这个问题的时候, 我们可以在 /etc/hosts 的最后增加一行 127.0.0.1 你的网域名称.

如果遇到 fatal: parameter inet_interfaces: no local interface found for ::1 这样的问题, 我们编辑 /etc/postfix/main.cf, 然后把 inet_interfaces = localhost 修改为 inet_interfaces = all.