You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

表单中使用TinyMCE插件的富文本数据处理与邮件发送问题求助

解决方案:TinyMCE内容获取与PHP发送RTF邮件

嘿,我来帮你搞定这两个棘手的问题!咱们一步一步来:

一、正确获取TinyMCE的富文本内容

你用jQuery直接取textarea的值没成功,是因为TinyMCE会把原textarea替换成自己的编辑器实例,直接操作textarea拿不到实时编辑的内容。得用TinyMCE官方提供的API来获取:

方法1:获取当前激活的编辑器内容

如果页面只有一个TinyMCE编辑器,用这个最简单:

$('form').submit(function(e) {
  e.preventDefault(); // 阻止默认表单提交
  
  // 获取富文本内容
  var richContent = tinymce.activeEditor.getContent();
  
  // 接下来你可以:
  // 1. 把内容存入隐藏域,让PHP通过POST获取
  $('input[name="blog_content"]').val(richContent);
  // 2. 或者直接用AJAX提交到PHP脚本
  $.post('send-mail.php', { content: richContent }, function(response) {
    console.log('提交成功:', response);
  });
});

方法2:指定编辑器ID获取(更可靠)

如果页面有多个编辑器,建议通过ID定位:

// 初始化时指定ID
tinymce.init({
  selector: '#blog-editor', // 你的textarea的ID
  // 其他配置项...
});

// 提交时获取内容
var richContent = tinymce.get('blog-editor').getContent();

二、通过PHP mail()发送RTF格式内容

TinyMCE默认输出的是HTML,要发送RTF文件,需要先把HTML转换成RTF格式,再作为附件发送。这里分两步:

1. HTML转RTF(基础版)

如果你的博文只有简单格式(加粗、斜体、换行),可以用简单的字符串替换实现:

$htmlContent = $_POST['content'];

// 基础HTML转RTF规则
$rtfContent = "{\\rtf1\\ansi\\deff0\n";
// 处理加粗
$rtfContent = str_replace('<strong>', '\\b ', str_replace('</strong>', '\\b0 ', $htmlContent));
// 处理斜体
$rtfContent = str_replace('<em>', '\\i ', str_replace('</em>', '\\i0 ', $rtfContent));
// 处理换行和段落
$rtfContent = str_replace('<br>', '\\line ', $rtfContent);
$rtfContent = str_replace('<p>', '\par ', str_replace('</p>', '\par ', $rtfContent));
// 收尾
$rtfContent .= "}";

如果需要支持复杂样式(比如字体、颜色、列表),建议用专门的PHP库,比如php-rtf(直接下载源码引入项目即可),它能完美处理HTML到RTF的转换。

2. 用mail()发送带RTF附件的邮件

PHP的mail()函数默认只发纯文本,要发附件需要构建MIME格式的邮件内容:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $htmlContent = $_POST['content'];
  
  // 第一步:HTML转RTF(上面的代码)
  $rtfContent = "{\\rtf1\\ansi\\deff0\n";
  $rtfContent = str_replace('<strong>', '\\b ', str_replace('</strong>', '\\b0 ', $htmlContent));
  $rtfContent = str_replace('<em>', '\\i ', str_replace('</em>', '\\i0 ', $rtfContent));
  $rtfContent = str_replace('<br>', '\\line ', $rtfContent);
  $rtfContent = str_replace('<p>', '\par ', str_replace('</p>', '\par ', $rtfContent));
  $rtfContent .= "}";
  
  // 邮件配置
  $to = '收件人邮箱@example.com';
  $subject = '用户提交的工作博文';
  $plainMessage = '请查看附件中的RTF格式博文';
  
  // 生成邮件边界(用于区分正文和附件)
  $boundary = uniqid();
  $filename = 'user_work_blog.rtf';
  // 对RTF内容进行base64编码(邮件传输要求)
  $encodedRtf = chunk_split(base64_encode($rtfContent));
  
  // 构建邮件头
  $headers = "From: 你的邮箱@example.com\r\n";
  $headers .= "MIME-Version: 1.0\r\n";
  $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
  
  // 构建邮件主体
  $body = "--$boundary\r\n";
  $body .= "Content-Type: text/plain; charset=UTF-8\r\n";
  $body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
  $body .= $plainMessage . "\r\n\r\n";
  
  // 添加附件部分
  $body .= "--$boundary\r\n";
  $body .= "Content-Type: application/rtf; name=\"$filename\"\r\n";
  $body .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
  $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
  $body .= $encodedRtf . "\r\n\r\n";
  $body .= "--$boundary--";
  
  // 发送邮件
  if (mail($to, $subject, $body, $headers)) {
    echo "邮件发送成功!";
  } else {
    echo "邮件发送失败,请检查服务器邮件配置。";
  }
}
?>

最后提醒

  • 确保TinyMCE初始化正确,selector对应你的textarea元素
  • 如果邮件发送失败,检查服务器的sendmail配置(比如PHP.ini里的sendmail_path)
  • 复杂格式的HTML转RTF一定要用专业库,避免格式错乱

内容的提问来源于stack exchange,提问作者Rahul Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:53:54