如何将Mongo存储的HTML邮件模板转为可读文本并替换变量?
如何将Mongo中带占位符的HTML邮件内容转换为纯文本并替换变量
问题描述
我在Mongo中存储了包含变量占位符的HTML格式邮件内容:
<div>Dear Customer,</div><div>An amount of Rs. <a data-value="Payment - Amount to Pay" data-mention="" class="wysiwyg-mention" href="payment_new.amount_to_pay_3xkhkenphf">@Payment - Amount to Pay</a> for your Loan Account Number <a data-value="Payment - Loan Number" data-mention="" class="wysiwyg-mention" href="payment_new.loan_number_rtcivc45ok">@Payment - Loan Number</a> has been received on <a data-value="Payment - Date" data-mention="" class="wysiwyg-mention" href="payment_new.payment_date">@Payment - Date</a> ,vide receipt no <a data-value="Payment - Receipt Number" data-mention="" class="wysiwyg-mention" href="payment_new.receipt_number_5dow863ae">@Payment - Receipt Number</a>.</div> <div>Payment Mode: <a data-value="Payment - Payment Mode" data-mention="" class="wysiwyg-mention" href="payment_new.payment_mode_chw0gfq6vo">@Payment - Payment Mode</a>.</div> <div>Please find the receipt attached below.</div>直接读取Mongo内容通过外部API发送时,邮件正文会显示原始HTML标签和占位符:
<div>Dear Customer,</div> <div>An amount of Rs. <a data-value="Payment - Amount to Pay" data-mention="" class="wysiwyg-mention" href="payment_new.amount_to_pay_3xkhkenphf">@Payment - Amount to Pay</a> for your Loan Account Number <a data-value="Payment - Loan Number" data-mention="" class="wysiwyg-mention" href="payment_new.loan_number_rtcivc45ok">@Payment - Loan Number</a> has been received on <a data-value="Payment - Date" data-mention="" class="wysiwyg-mention" href="payment_new.payment_date">@Payment - Date</a> ,vide receipt no <a data-value="Payment - Receipt Number" data-mention="" class="wysiwyg-mention" href="payment_new.receipt_number_5dow863ae">@Payment - Receipt Number</a>.</div> <div>Payment Mode: <a data-value="Payment - Payment Mode" data-mention="" class="wysiwyg-mention" href="payment_new.payment_mode_chw0gfq6vo">@Payment - Payment Mode</a>.</div> <div>Please find the receipt attached below.</div>我需要将其转换为无HTML标签、占位符替换为实际值的可读文本,示例如下:
Dear Customer, An amount of Rs. 111 for your Loan Account Number 8204221103679 has been received on 24-Jul-2023 ,vide receipt no 1690195463903291.Payment Mode: Cash. Please find the receipt attached below.
解决方案
核心思路
先提取HTML中的纯文本内容,再将占位符替换为实际业务数据,最后优化文本格式使其连贯可读。
具体实现步骤(以Node.js环境为例)
解析HTML提取纯文本
使用HTML解析库(如cheerio)去除所有HTML标签,保留包含占位符的文本内容:const cheerio = require('cheerio'); // 从Mongo读取的原始HTML内容 const htmlContent = '<div>Dear Customer,</div><div>An amount of Rs. <a data-value="Payment - Amount to Pay" ...>@Payment - Amount to Pay</a>...</div>'; const $ = cheerio.load(htmlContent); let plainText = $.text(); // 此时plainText包含@开头的占位符,无HTML标签替换占位符为实际值
准备存储实际数据的对象,通过正则匹配所有@XXX格式的占位符并替换:// 实际业务数据,可从数据库或业务接口获取 const paymentData = { '@Payment - Amount to Pay': '111', '@Payment - Loan Number': '8204221103679', '@Payment - Date': '24-Jul-2023', '@Payment - Receipt Number': '1690195463903291', '@Payment - Payment Mode': 'Cash' }; // 正则匹配所有@开头的占位符,替换为对应数据 plainText = plainText.replace(/@[\w\s-]+/g, match => paymentData[match] || match);优化文本格式
清理提取过程中产生的多余换行和连续空格,让内容更连贯:// 替换所有连续空白字符为单个空格,去除首尾空格 plainText = plainText.replace(/\s+/g, ' ').trim();发送纯文本邮件
将处理后的纯文本传递给邮件API,确保API以纯文本格式发送邮件(而非HTML格式)。
注意事项
- 若使用Python等其他语言,可选用对应HTML解析库(如
BeautifulSoup),替换逻辑一致。 - 确保占位符名称和业务数据的键完全匹配,避免替换失败。
- 若有特殊格式需求,可根据实际场景调整文本处理规则。
内容的提问来源于stack exchange,提问作者Aakarshit
相关产品推荐
相关产品推荐

