多软件区分:邮件按软件换色+图标+软件名;补提交回执邮件
用户要求:多软件并存时,用「颜色 + 图标 + 名字」三重区分,
邮件也要跟着所属软件变,一眼能看出是哪款软件的来信。
1. software 表加 icon / download_url 字段(幂等迁移)
- icon 存单个字符(emoji / 汉字 / 字母),不存图片路径:
前端与邮件用同一个字符渲染,天然一致,不用再管一套上传与权限
- 没配 icon 时取名首字兜底,任何地方都不出现空图标
- 后台软件编辑加图标快选(12 个常用 emoji)
2. 邮件配色改为跟随软件(fb_mail_brand 取 fb_software_colors)
- 头部色条、按钮、引用块色条、徽标全部跟着软件走
- 邮件头部改为「图标色块 + 软件名」,下面再小字标站点名
- 主题行统一加【软件名】前缀,不点开就能分辨
3. 新增 receipt 事件:提交后立即给提问人发「已收到、待审核、请耐心等待」
- 独立开关 notify.receipt_enabled(与「回复通知」是两件事)
- 新增 7 处调用前的静默 return 也一并写日志
4. reply 邮件补上下文:原提问摘要 + 本次回复,像博客评论通知
5. status=resolved 文案改为「已完成并上线」,配了下载地址时给下载按钮
验证:多软件配色/图标/前缀全部通过(含反向验证),XSS 转义通过,
空图标兜底通过;页面顶栏、页头、选择器图标渲染正确。
This commit is contained in:
@@ -280,21 +280,41 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['act'])) {
|
||||
$msg = '#' . $id . ' 已删除。';
|
||||
|
||||
} elseif ($act === 'mail_test') {
|
||||
// 发送测试邮件:只验证 SMTP 通不通,不改任何配置
|
||||
// 发送测试邮件:只验证 SMTP 通不通,不改任何配置。
|
||||
// 可选 sw=<软件id>:按那个软件的样子渲染(配色 / 图标 / 软件名),
|
||||
// 便于在后台直接预览「不同软件的邮件长什么样」。
|
||||
$to = trim((string)(isset($_POST['to']) ? $_POST['to'] : ''));
|
||||
if ($to === '') { $to = trim((string)fb_cfg('admin_email', '')); }
|
||||
if ($to === '') { $to = trim((string)fb_cfg('smtp.user', '')); }
|
||||
if (!filter_var($to, FILTER_VALIDATE_EMAIL)) {
|
||||
$msg = '请填写有效的收件邮箱。';
|
||||
$msgType = 'error';
|
||||
} else {
|
||||
$sc = (array)fb_cfg('smtp', []);
|
||||
$site = (string)fb_cfg('site_name', '轻反馈');
|
||||
$body = '<p>这是一封来自 <b>' . htmlspecialchars($site, ENT_QUOTES, 'UTF-8')
|
||||
. '</b> 的测试邮件。</p>'
|
||||
. '<p>如果你收到了它,说明 SMTP 配置正确,回复通知可以正常发出。</p>'
|
||||
. '<p style="color:#888;font-size:12px">发送时间:'
|
||||
. date('Y-m-d H:i:s') . '</p>';
|
||||
list($ok, $err) = fb_smtp_send($sc, $to, '【' . $site . '】邮件测试', $body);
|
||||
|
||||
// 选中的软件(没选就用默认软件,保证测试邮件也带软件标识)
|
||||
$swId = (int)(isset($_POST['sw']) ? $_POST['sw'] : 0);
|
||||
$swRow = $swId > 0 ? fb_software($swId) : fb_default_software();
|
||||
|
||||
// 用真实的回执模板发,比一句「测试邮件」更能看出实际效果
|
||||
$fake = [
|
||||
'id' => 0,
|
||||
'software_id' => $swRow ? (int)$swRow['id'] : 0,
|
||||
'title' => '这是一封测试邮件,用来检查排版与配色',
|
||||
'body' => "这是测试用的反馈正文。\n如果你收到这封信,说明 SMTP 配置正确,配色与图标也应当对应「"
|
||||
. ($swRow ? (string)$swRow['name'] : '默认软件') . "」。\n\n发送时间:" . date('Y-m-d H:i:s'),
|
||||
'author_name' => '测试',
|
||||
'author_email' => $to,
|
||||
'author_phone' => '',
|
||||
'status' => 'open',
|
||||
'visible' => 1,
|
||||
];
|
||||
list($subject, $html) = fb_notify_render('receipt', $fake,
|
||||
['software' => $swRow], $to);
|
||||
$subject = '【测试】' . $subject;
|
||||
|
||||
list($ok, $err) = fb_smtp_send($sc, $to, $subject, $html);
|
||||
if ($ok) {
|
||||
$msg = '测试邮件已发出,请查收 ' . $to . '(也看一下垃圾箱)。';
|
||||
$msgType = 'ok';
|
||||
@@ -574,6 +594,7 @@ function fb_admin_save_settings() {
|
||||
$save('notify.enabled', (int)(bool)$post('notify.enabled'));
|
||||
$save('notify.on_every_reply', (int)(bool)$post('notify.on_every_reply'));
|
||||
$save('notify.admin_new_thread', (int)(bool)$post('notify.admin_new_thread'));
|
||||
$save('notify.receipt_enabled', (int)(bool)$post('notify.receipt_enabled'));
|
||||
|
||||
// 冷却秒数留空 = 用默认 300(config 里的出厂值)。注意 0 是合法值(表示不限制),
|
||||
// 所以要用「空串」而不是「0」来区分"没填"和"填了 0"
|
||||
@@ -1317,13 +1338,21 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
|
||||
<div class="mail-test">
|
||||
<span class="muted" style="font-size:13.5px">配好后先发一封测试邮件确认能通:</span>
|
||||
<input type="email" id="mailTestTo" placeholder="收件邮箱,默认发给自己"
|
||||
value="<?php echo e((string)fb_cfg('admin_email', '')); ?>">
|
||||
value="<?php echo e((string)fb_cfg('admin_email', '') !== '' ? (string)fb_cfg('admin_email', '') : (string)fb_cfg('smtp.user', '')); ?>">
|
||||
<select id="mailTestSw" title="按哪个软件的样子发送">
|
||||
<?php foreach (fb_softwares(true) as $swOne): ?>
|
||||
<option value="<?php echo (int)$swOne['id']; ?>"><?php echo e((string)$swOne['name']); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<button type="button" class="btn" id="mailTestBtn" data-csrf="<?php echo e(fb_csrf_token()); ?>">发送测试邮件</button>
|
||||
<span id="mailTestOut" class="mail-test-out"></span>
|
||||
</div>
|
||||
<p class="hint" style="margin:6px 0 0">测试邮件用的是「提交回执」模板,会带上所选软件的图标与配色 —— 可以直接看出不同软件的邮件长什么样。</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<h3 style="margin:20px 0 8px;font-size:15px">通知规则</h3>
|
||||
<label class="check"><input type="checkbox" name="notify_receipt_enabled" value="1"<?php echo fb_cfg('notify.receipt_enabled', true) ? ' checked' : ''; ?>> 提交后立即给提交人发「已收到」回执
|
||||
<span class="hint" style="display:block;margin-left:24px">告诉对方反馈已送达、正在等审核,请耐心等待。提交完就让用户干等着是最容易丢信任的环节。</span></label>
|
||||
<label class="check"><input type="checkbox" name="notify_enabled" value="1"<?php echo fb_cfg('notify.enabled', true) ? ' checked' : ''; ?>> 有人回复时通知提交人</label>
|
||||
<label class="check"><input type="checkbox" name="notify_on_every_reply" value="1"<?php echo fb_cfg('notify.on_every_reply', false) ? ' checked' : ''; ?>> 每次回复都通知(默认只在官方回复时通知,避免刷屏)</label>
|
||||
<?php
|
||||
|
||||
Reference in New Issue
Block a user