邮件 tab 输入框不再预填出厂示例值 (#2)

用户反馈:「邮件通知这个页面里的那些输入框,当我鼠标点完之后,还是没有把里面的内容删除。」

上一轮(#3)只处理了 prefix 和邮件标题两个字段,**漏了 smtp 整段**。

根因同前:config.example.php 的 smtp 段有全套出厂示例值,
fb_cfg() 合并后表单把它们当"已填内容"显示,用户点进去得先删一遍。

## 本次处理

全部改用 fb_form_val():数据库里没设过 = 未自定义 = 显示空,示例只留 placeholder。

| 字段 | 出厂值 | 现在 |
|---|---|---|
| smtp.host | smtp.example.com | 空,placeholder 给真实可用的 smtp.qiye.aliyun.com |
| smtp.user | noreply@example.com | 空 |
| smtp.from | noreply@example.com | 空,placeholder「留空则同登录账号」 |
| smtp.from_name | 轻反馈 | 空,placeholder 显示当前站点名 |
| smtp.port | 465 | 空,placeholder 465 |
| smtp.timeout | 15 | 空,placeholder 15 |
| notify.cooldown_seconds | 300 | 空,placeholder 300 |

## 顺带修两个真问题

1. **留空不能存 0**:端口/超时/冷却原先 `(int)$post()`,留空会变成 0,
   0 端口根本连不上、0 超时立刻断。改成留空即删键,回落 config 默认值。
2. **cooldown 出厂值是 300 不是 60**:我一开始按 60 判,导致 300≠60 被当成
   "用户设过"而回显。核对 config.example.php:80 后改正。

⚠️ 注意 cooldown 的 0 是合法值(表示不限制),所以用「空串」区分"没填",
不能用 0 判断,否则用户真想设 0 会被当成默认。

## 验证
邮件预填专项 33/33:
- 7 个字段 value 全空,示例在 placeholder
- 无任何出厂示例值被预填
- 真实值保存后逐项回显(含 0 这个边界)
- 留空后回显空 + 数据库键被删 + 生效值回落 465/15/300
- 填 0 被正确保留

回归全绿:全新安装 33/33、安装向导 60/60、老基线 25/25、邮件 tab 专项 37/37。
This commit is contained in:
2026-11-01 19:26:42 +08:00
parent 367f78f239
commit b0e6ac9cd8
+41 -14
View File
@@ -357,16 +357,27 @@ function fb_admin_save_settings() {
$sp = (string)(isset($_POST['smtp_pass']) ? $_POST['smtp_pass'] : ''); $sp = (string)(isset($_POST['smtp_pass']) ? $_POST['smtp_pass'] : '');
if (trim($sp) !== '') { fb_set_setting('smtp.pass', $sp); } if (trim($sp) !== '') { fb_set_setting('smtp.pass', $sp); }
$smtpPort = (int)$post('smtp.port', 465); // 端口留空 = 用默认 465。删键回落,不要存成 0(0 端口根本连不上)
$portRaw = trim((string)$post('smtp.port', ''));
if ($portRaw === '') {
fb_unset_setting('smtp.port');
} else {
$smtpPort = (int)$portRaw;
if ($smtpPort <= 0 || $smtpPort > 65535) { $smtpPort = 465; } if ($smtpPort <= 0 || $smtpPort > 65535) { $smtpPort = 465; }
fb_set_setting('smtp.port', $smtpPort); fb_set_setting('smtp.port', $smtpPort);
}
$sec = strtolower(trim((string)$post('smtp.secure', 'ssl'))); $sec = strtolower(trim((string)$post('smtp.secure', 'ssl')));
if (!in_array($sec, ['ssl', 'tls', ''], true)) { $sec = 'ssl'; } if (!in_array($sec, ['ssl', 'tls', ''], true)) { $sec = 'ssl'; }
fb_set_setting('smtp.secure', $sec); fb_set_setting('smtp.secure', $sec);
$smtpTo = (int)$post('smtp.timeout', 15); // 超时留空 = 用默认 15
fb_set_setting('smtp.timeout', max(5, min(60, $smtpTo))); $tmoRaw = trim((string)$post('smtp.timeout', ''));
if ($tmoRaw === '') {
fb_unset_setting('smtp.timeout');
} else {
fb_set_setting('smtp.timeout', max(5, min(60, (int)$tmoRaw)));
}
fb_set_setting('smtp.verify_ssl', (int)(bool)$post('smtp.verify_ssl')); fb_set_setting('smtp.verify_ssl', (int)(bool)$post('smtp.verify_ssl'));
// 没填 from 时用 user 兜底(绝大多数 SMTP 要求两者一致) // 没填 from 时用 user 兜底(绝大多数 SMTP 要求两者一致)
@@ -387,8 +398,14 @@ function fb_admin_save_settings() {
fb_set_setting('notify.enabled', (int)(bool)$post('notify.enabled')); fb_set_setting('notify.enabled', (int)(bool)$post('notify.enabled'));
fb_set_setting('notify.on_every_reply', (int)(bool)$post('notify.on_every_reply')); fb_set_setting('notify.on_every_reply', (int)(bool)$post('notify.on_every_reply'));
fb_set_setting('notify.admin_new_thread', (int)(bool)$post('notify.admin_new_thread')); fb_set_setting('notify.admin_new_thread', (int)(bool)$post('notify.admin_new_thread'));
$cd = (int)$post('notify.cooldown_seconds', 60); // 冷却秒数留空 = 用默认 300(config 里的出厂值)。注意 0 是合法值(表示不限制),
fb_set_setting('notify.cooldown_seconds', max(0, min(86400, $cd))); // 所以要用「空串」而不是「0」来区分"没填"和"填了 0"
$cdRaw = trim((string)$post('notify.cooldown_seconds', ''));
if ($cdRaw === '') {
fb_unset_setting('notify.cooldown_seconds');
} else {
fb_set_setting('notify.cooldown_seconds', max(0, min(86400, (int)$cdRaw)));
}
fb_set_setting('moderation.enabled', $post('moderation.enabled') ? 1 : 0); fb_set_setting('moderation.enabled', $post('moderation.enabled') ? 1 : 0);
@@ -937,12 +954,19 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
<input type="hidden" name="act" value="settings"> <input type="hidden" name="act" value="settings">
<h2 style="margin:24px 0 10px">邮件通知</h2> <h2 style="margin:24px 0 10px">邮件通知</h2>
<?php <?php
// ⚠️ config.example.php 的 smtp 段有全套出厂示例值
// (smtp.example.com / noreply@example.com / 轻反馈 …),
// fb_cfg() 合并后表单会把这些当成"已填内容"显示出来,
// 用户点进去得先删一遍。所以回显一律过 fb_form_val():
// 数据库里没设过 = 没自定义 = 显示空,示例只留在 placeholder。
$smOn = (bool)fb_cfg('smtp.enabled', false); $smOn = (bool)fb_cfg('smtp.enabled', false);
$smHost = (string)fb_cfg('smtp.host', ''); $smHost = fb_form_val(fb_cfg('smtp.host', ''), 'smtp.example.com', 'smtp.host');
$smUser = (string)fb_cfg('smtp.user', ''); $smUser = fb_form_val(fb_cfg('smtp.user', ''), 'noreply@example.com', 'smtp.user');
$smFrom = (string)fb_cfg('smtp.from', ''); $smFrom = fb_form_val(fb_cfg('smtp.from', ''), 'noreply@example.com', 'smtp.from');
$smName = (string)fb_cfg('smtp.from_name', ''); $smName = fb_form_val(fb_cfg('smtp.from_name', ''), '轻反馈', 'smtp.from_name');
$smPort = (int)fb_cfg('smtp.port', 465); // 端口出厂 465,没设过就留空让 placeholder 提示,别预填数字
$smPortRaw = fb_form_val((string)(int)fb_cfg('smtp.port', 465), '465', 'smtp.port');
$smPort = $smPortRaw === '' ? '' : (string)(int)$smPortRaw;
$smSec = (string)fb_cfg('smtp.secure', 'ssl'); $smSec = (string)fb_cfg('smtp.secure', 'ssl');
$smHasPw = (string)fb_cfg('smtp.pass', '') !== ''; $smHasPw = (string)fb_cfg('smtp.pass', '') !== '';
$smTmo = (int)fb_cfg('smtp.timeout', 15); $smTmo = (int)fb_cfg('smtp.timeout', 15);
@@ -959,7 +983,8 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
<label class="field"><span>端口与加密</span> <label class="field"><span>端口与加密</span>
<div style="display:flex;gap:8px"> <div style="display:flex;gap:8px">
<input type="number" name="smtp_port" min="1" max="65535" style="flex:0 0 110px" <input type="number" name="smtp_port" min="1" max="65535" style="flex:0 0 110px"
value="<?php echo (int)$smPort; ?>"> placeholder="465"
value="<?php echo e($smPort); ?>">
<select name="smtp_secure" style="flex:1"> <select name="smtp_secure" style="flex:1">
<option value="ssl"<?php echo $smSec === 'ssl' ? ' selected' : ''; ?>>SSL(通常 465)</option> <option value="ssl"<?php echo $smSec === 'ssl' ? ' selected' : ''; ?>>SSL(通常 465)</option>
<option value="tls"<?php echo $smSec === 'tls' ? ' selected' : ''; ?>>STARTTLS(通常 587)</option> <option value="tls"<?php echo $smSec === 'tls' ? ' selected' : ''; ?>>STARTTLS(通常 587)</option>
@@ -991,7 +1016,8 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
<summary style="cursor:pointer;font-size:13px;color:var(--muted)">高级选项</summary> <summary style="cursor:pointer;font-size:13px;color:var(--muted)">高级选项</summary>
<div class="grid2" style="margin-top:8px"> <div class="grid2" style="margin-top:8px">
<label class="field"><span>超时(秒)</span> <label class="field"><span>超时(秒)</span>
<input type="number" name="smtp_timeout" min="5" max="60" value="<?php echo (int)$smTmo; ?>"></label> <input type="number" name="smtp_timeout" min="5" max="60" placeholder="15"
value="<?php echo e(fb_form_val((string)(int)$smTmo, '15', 'smtp.timeout')); ?>"></label>
<label class="check" style="align-self:end"><input type="checkbox" name="smtp_verify_ssl" value="1"<?php echo $smVerify ? ' checked' : ''; ?>> 校验服务器 SSL 证书 <label class="check" style="align-self:end"><input type="checkbox" name="smtp_verify_ssl" value="1"<?php echo $smVerify ? ' checked' : ''; ?>> 校验服务器 SSL 证书
<span class="hint" style="display:block;margin-left:24px">服务器缺 CA 证书时可临时取消,但不建议。</span></label> <span class="hint" style="display:block;margin-left:24px">服务器缺 CA 证书时可临时取消,但不建议。</span></label>
</div> </div>
@@ -1013,8 +1039,9 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
<label class="check"><input type="checkbox" name="notify_admin_new_thread" value="1"<?php echo fb_cfg('notify.admin_new_thread', false) ? ' checked' : ''; ?>> 有新反馈时通知管理员 <label class="check"><input type="checkbox" name="notify_admin_new_thread" value="1"<?php echo fb_cfg('notify.admin_new_thread', false) ? ' checked' : ''; ?>> 有新反馈时通知管理员
<span class="hint" style="display:block;margin-left:24px">发到「站点信息」里填的官方邮箱。</span></label> <span class="hint" style="display:block;margin-left:24px">发到「站点信息」里填的官方邮箱。</span></label>
<label class="field" style="max-width:280px"><span>同一帖同一收件人的最短发信间隔(秒)</span> <label class="field" style="max-width:280px"><span>同一帖同一收件人的最短发信间隔(秒)</span>
<input type="number" name="notify_cooldown_seconds" min="0" max="86400" <?php /* 出厂默认是 300(见 config.example.php 的 notify.cooldown_seconds) */ ?>
value="<?php echo (int)fb_cfg('notify.cooldown_seconds', 60); ?>"> <input type="number" name="notify_cooldown_seconds" min="0" max="86400" placeholder="300"
value="<?php echo e(fb_form_val((string)(int)fb_cfg('notify.cooldown_seconds', 300), '300', 'notify.cooldown_seconds')); ?>">
<i class="hint">0 = 不限制。</i></label> <i class="hint">0 = 不限制。</i></label>
<div class="form-actions"> <div class="form-actions">
<button class="btn primary" type="submit">保存邮件设置</button> <button class="btn primary" type="submit">保存邮件设置</button>