场景:项目中收集错误信息,在某个时机,将信息发送指定的邮箱中。
①通过a标签或window.open实现,优点:快捷,缺点:无法携带较长的数据。
let params = {
to: '指定的邮箱',
subject: '邮箱标题',
body: '邮箱内容'
};
window.open(`mailto:${params.to}?subject=${params.subject}&body=${params.body}`,'_parent');
②通过form标签,优点:比①的结构清晰,缺点:无法携带较长的数据,存疑。
let params = {
to: '指定的邮箱',
subject: '邮箱标题',
body: '邮箱内容'
};
let template = `
<form action="mailto:${params.to}">
<input name="subject" value="${params.subject}" />
<textarea name="body">${params.body}</textarea>
</form>`;
let form = new DOMParser().parseFromString(template, 'text/html').querySelector('form');
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
看样子接近成功,可是数据却挂在url上,这点导致数据长度受限,当数据长度增大5倍时,协议发出,但邮箱客户端没有被启动。
③通过nodejs的nodemailer等模块,前端上传数据给服务端,服务端发出邮件。优点:无须考虑数据量和终端的邮箱客户端问题,且支持附件,缺点:需指定发送人的邮箱,授权码/密码,邮箱服务器域名。
④前端通过a标签导出文件,提示使用者手动上传文件发邮件。优点:简单粗暴,缺点:体验不是很好。
目前能想到的有以上4种方案
方案③可行,至于缺点有的是方法避开,只是某些原因,导致当前场景与该方案不大适合。
个人倾向于方案②,如果有办法解决②的缺点那就爽了。
以上4种方案外,可有其他方案推荐
完全本地
将要发送的内容复制到剪切板,然后提醒用户已复制。
单独用
maillto://
scheme 来打开本地的邮件发送工具,让用户手动粘贴。更多的时候
大部分情况下,这些东西都在用户认证后,通过后端服务器 同步/异步发送。