表单中使用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
相关产品推荐
相关产品推荐

