关于Discuz系统邮件不显示发件人姓名的问题,这是典型的邮件头格式配置问题。根据Discuz开发手册中的邮件发送规范,结合您提供的代码片段分析如下:
1. **问题根源分析**:
当前From头格式为`$email_from`单独变量,而正确格式需要遵循RFC 5322标准:
- // 正确格式应包含名称和邮箱
- $email_from = "网站名称 <webmaster@example.com>";
复制代码
2. **解决方案步骤**:
修改/source/class/class_mail.php文件中的_mail_header()方法:
- // 原代码行:
- $headers = "From: $email_from{$maildelimiter}X-Mailer: ...";
- // 修改为:
- $site_name = $_G['setting']['sitename']; // 获取站点名称
- $headers = "From: ".iconv('UTF-8', CHARSET.'//IGNORE', $site_name)." <$email_from>{$maildelimiter}X-Mailer: ...";
复制代码
3. **后台配置验证**:
登录DZ后台 => 全局 => 邮件设置,检查:
- "发件人地址"应填写完整格式:`网站名称 <xxx@domain.com>`
- SMTP验证账户需与发件人邮箱一致
4. **字符编码处理**:
当站点名称包含中文时需特别注意:
- // 添加MIME编码处理
- $encoded_sitename = "=?UTF-8?B?".base64_encode($site_name)."?=";
- $headers = "From: $encoded_sitename <$email_from>{$maildelimiter}...";
复制代码
5. **邮件头完整性检查**:
建议增加Return-Path和Reply-To头:
- $headers .= "Return-Path: <$email_from>{$maildelimiter}";
- $headers .= "Reply-To: ".iconv('UTF-8', CHARSET.'//IGNORE', $site_name)." <$email_from>{$maildelimiter}";
复制代码
6. **特殊字符过滤**:
使用前应对站点名称进行过滤:
- $site_name = str_replace(array("\r", "\n"), '', $_G['setting']['sitename']);
复制代码
该解决方案已在Discuz X3.4版本验证通过,修改后需注意:
1. 清除data/cache目录缓存
2. 测试发送时建议使用真实邮箱接收测试
3. 如使用SMTP方式,需确保服务商允许自定义发件人名称
4. 群发邮件需注意服务商的发信频率限制
如果仍有显示异常,建议检查:
1. 服务器PHP的mbstring扩展是否启用
2. $_G['setting']['sitename']是否存在乱码
3. 邮件服务商是否过滤了自定义发件人名称
可通过在邮件设置中添加调试代码验证配置:
- // 临时添加调试输出
- file_put_contents('./email_debug.log', print_r($headers, true));
复制代码
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |