使用 mailto 在电子邮件中发送当前 HTML 页
Sending current HTML page in an email with mailto
我有一个页面(特别是 Chrome 开发人员扩展)用于调试某些软件的客户端安装。如果客户需要更多帮助来解决他们正在观察的特定问题,我们希望他们能够通过电子邮件向我们发送问题文档。
是否有办法让 mailto 添加(作为电子邮件正文中的附件或框架)mailto 所在的当前 html 页面的文件?该页面是在本地动态生成的,因此如果页面不必上传到电子邮件以外的任何地方,那就更好了。
简答:否
a
标签中的 mailto
仅用于指定电子邮件的 link,而不是该电子邮件的内容。您需要使用某种 server-side AJAX 调用。如果可以的话,我建议使用 PHP 的 mail()
函数。
例子
您需要将电子邮件 header 设置为 HTML 兼容。
因此,如果您使用 PHP mail()
函数:
$headers = "From: " . strip_tags($_POST['req-email']) . "\r\n";
$headers .= "Reply-To: ". strip_tags($_POST['req-email']) . "\r\n";
$headers .= "CC: susan@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
mail("target@something.com", "subject", "PLACE HTML HERE", $headers);
那么理论上您可以在 AJAX 请求页面中的所有数据时通过:
$.ajax({
url: "http://my.url.com/endpoint/",
method: "POST",
data: {
page: $("html").html()
}
});
然后您只需将其嵌入电子邮件的某个位置,或直接嵌入 body。您甚至可以为存在的 GET 和 POST 参数添加额外数据。
备注
虽然我可以看到它被用于一些调试,但很多错误是由 Javascript 以某种方式失败或您的 PHP/server-side 代码失败引起的。我建议无论您选择什么路径,包括我没有涉及的路径,您还应该包括来自控制台的数据、POST 和 GET 变量(如果您有权访问这些变量)(尽管小心不要暴露POST 和 GET 变量)。
还有很多像 Chrome Remote Desktop 这样的工具可以帮助您查看用户遇到的特定错误和问题。
或者,为了绕过 mail()
函数,您可以嵌入调试 Javascript,它可以动态地将调试信息从浏览器(通过 AJAX 请求)发送到服务器,截取它供你分析和调试。
看看这个 w3schools 示例:http://www.w3schools.com/html/tryit.asp?filename=tryhtml_links_mailto_subject
(格式化摘录,您会希望 href=""
全部在一行中)
<a href="
mailto:someone@example.com?cc=someoneelse@example.com
&bcc=andsomeoneelse@example.com&subject=Summer%20Party
&body=You%20are%20invited%20to%20a%20big%20summer%20party!" target="_top">
Send mail!
</a>
您可以根据需要使用 javaScript 将页面插入 link。
编辑:
刚刚注意到您可能需要小心处理 'larger' 个页面,因为 GET 请求(这是)的长度是有限制的:
tl: 博士:
如果使用此方法,您可能希望缩小包含代码的范围
无法使用 mailto 添加附件:
一种方法是使用 mailto: 创建带有两个链接的文本消息:
页面url
url 页面的 png 截图。
有 chrome 个 API 可以捕获屏幕,您可以使用您的服务器或类似 imgur 的东西来保存捕获。可能最好使用您自己的服务器来接收图像,因为 imgur 可能是您用户的隐私问题。
似乎不可能得到完整的答案,但我想我会分享我走过的路线。
我有一个 id='save-log' 的按钮。在我添加所有必要事件的页面中,我有
document.getElementById('save-log').addEventListener('click',
function(e){
chrome.runtime.sendMessage({
log: document.body.innerHTML
});
}
);
然后在后台页面我有
chrome.runtime.onMessage.addListener(
function(message, sender, sendResponse) {
chrome.tabs.create({
url: "save-log.html?" + message.log
});
}
);
最后,在 save-log.html 中,我有必要的样式信息,主体是空的,运行 脚本:
document.write(decodeURIComponent(location.search.substring(1)));
现在有一个包含开发人员扩展面板完整副本的新选项卡,用户可以保存 html 页面并将其发送给任何他们想要的人。
我有一个页面(特别是 Chrome 开发人员扩展)用于调试某些软件的客户端安装。如果客户需要更多帮助来解决他们正在观察的特定问题,我们希望他们能够通过电子邮件向我们发送问题文档。
是否有办法让 mailto 添加(作为电子邮件正文中的附件或框架)mailto 所在的当前 html 页面的文件?该页面是在本地动态生成的,因此如果页面不必上传到电子邮件以外的任何地方,那就更好了。
简答:否
a
标签中的 mailto
仅用于指定电子邮件的 link,而不是该电子邮件的内容。您需要使用某种 server-side AJAX 调用。如果可以的话,我建议使用 PHP 的 mail()
函数。
例子
您需要将电子邮件 header 设置为 HTML 兼容。
因此,如果您使用 PHP mail()
函数:
$headers = "From: " . strip_tags($_POST['req-email']) . "\r\n";
$headers .= "Reply-To: ". strip_tags($_POST['req-email']) . "\r\n";
$headers .= "CC: susan@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
mail("target@something.com", "subject", "PLACE HTML HERE", $headers);
那么理论上您可以在 AJAX 请求页面中的所有数据时通过:
$.ajax({
url: "http://my.url.com/endpoint/",
method: "POST",
data: {
page: $("html").html()
}
});
然后您只需将其嵌入电子邮件的某个位置,或直接嵌入 body。您甚至可以为存在的 GET 和 POST 参数添加额外数据。
备注
虽然我可以看到它被用于一些调试,但很多错误是由 Javascript 以某种方式失败或您的 PHP/server-side 代码失败引起的。我建议无论您选择什么路径,包括我没有涉及的路径,您还应该包括来自控制台的数据、POST 和 GET 变量(如果您有权访问这些变量)(尽管小心不要暴露POST 和 GET 变量)。
还有很多像 Chrome Remote Desktop 这样的工具可以帮助您查看用户遇到的特定错误和问题。
或者,为了绕过 mail()
函数,您可以嵌入调试 Javascript,它可以动态地将调试信息从浏览器(通过 AJAX 请求)发送到服务器,截取它供你分析和调试。
看看这个 w3schools 示例:http://www.w3schools.com/html/tryit.asp?filename=tryhtml_links_mailto_subject
(格式化摘录,您会希望 href=""
全部在一行中)
<a href="
mailto:someone@example.com?cc=someoneelse@example.com
&bcc=andsomeoneelse@example.com&subject=Summer%20Party
&body=You%20are%20invited%20to%20a%20big%20summer%20party!" target="_top">
Send mail!
</a>
您可以根据需要使用 javaScript 将页面插入 link。
编辑:
刚刚注意到您可能需要小心处理 'larger' 个页面,因为 GET 请求(这是)的长度是有限制的:
tl: 博士: 如果使用此方法,您可能希望缩小包含代码的范围
无法使用 mailto 添加附件:
一种方法是使用 mailto: 创建带有两个链接的文本消息:
页面url
url 页面的 png 截图。
有 chrome 个 API 可以捕获屏幕,您可以使用您的服务器或类似 imgur 的东西来保存捕获。可能最好使用您自己的服务器来接收图像,因为 imgur 可能是您用户的隐私问题。
似乎不可能得到完整的答案,但我想我会分享我走过的路线。
我有一个 id='save-log' 的按钮。在我添加所有必要事件的页面中,我有
document.getElementById('save-log').addEventListener('click',
function(e){
chrome.runtime.sendMessage({
log: document.body.innerHTML
});
}
);
然后在后台页面我有
chrome.runtime.onMessage.addListener(
function(message, sender, sendResponse) {
chrome.tabs.create({
url: "save-log.html?" + message.log
});
}
);
最后,在 save-log.html 中,我有必要的样式信息,主体是空的,运行 脚本:
document.write(decodeURIComponent(location.search.substring(1)));
现在有一个包含开发人员扩展面板完整副本的新选项卡,用户可以保存 html 页面并将其发送给任何他们想要的人。