ksweb 中文文档 下载 App

KSWEB Msmtp 命令行发信 配合 PHP mail() 解决网站邮件问题

CMS 邮件发不出去

WordPress 安装时让填邮箱、忘记密码要发重置链接、订单完成要发通知——这些功能都依赖 PHP 的 mail() 函数。但 Android 没有系统级的 MTA(邮件传输代理),直接调用 mail() 会报错或被拦截。

KSWEB 内置 Msmtp v1.8.32,这是一个轻量级的命令行发信工具,专门解决这个问题。

配置 Msmtp

Msmtp 本质上是一个 SMTP 客户端——它需要一个外部邮箱的 SMTP 服务来代发。以 Gmail 为例:

  1. 到 Google 账号安全设置里开应用专用密码(不是常规登录密码)
  2. 在 KSWEB 的 msmtp 配置文件里写:
account gmail
host smtp.gmail.com
port 465
from 你的Gmail@gmail.com
user 你的Gmail@gmail.com
password 应用专用密码
tls on
auth on

account default : gmail
  1. 测试一下:echo "hello" | msmtp 收件人@example.com
  2. 收件人应该能收到邮件

其他邮箱的 SMTP 地址:

邮箱主机端口
Gmailsmtp.gmail.com465
QQ 邮箱smtp.qq.com465
163 邮箱smtp.163.com465
Outlooksmtp.office365.com587

配置 PHP 使用 Msmtp

PHP 的 mail() 函数默认会找系统的 sendmail,Android 上没有。在 php.ini 里改一行:

sendmail_path = /data/data/ru.kslabs.ksweb/files/msmtp/bin/msmtp -t

php.ini 在 KSWEB 的 PHP 标签页里点 Edit 直接改。保存后重启 Web 服务器,CMS 的邮件发送就走 Msmtp 了。

CMS 里进一步配置

虽然改了 php.ini 后 mail() 能工作,但推荐在 CMS 里用专用 SMTP 插件,更可控:

插件方案让邮件发送不依赖 PHP 的 mail() 函数本身,绕过了 Android sendmail 缺失的问题,也方便追踪发信日志。

为什么不用内置邮件客户端

Android 上有很多邮件客户端能发信,但它们是 GUI 应用,PHP 脚本调不了。Msmtp 是一个命令行工具,PHP 通过 exec() 或 shell 里调用它,发信就能完全自动化——WordPress 注册、密码重置、评论通知全不用人工干预。