使用Javascript在Microsoft Outlook中创建HTML电子邮件

使用Javascript在Microsoft Outlook中创建HTML电子邮件,javascript,web-applications,outlook,Javascript,Web Applications,Outlook,我想从Javascript web应用程序创建一封电子邮件。我完全知道在这方面有这么多问题(例如)。典型答案存在以下问题: Mailto:link:这将允许您创建一封电子邮件,但只能使用纯文本(无HTML),并且不允许使用附件 Activex:仅IE,我的应用程序也需要在Firefox和Chrome中运行。允许ActiveX的FF和Chrome插件存在安全隐患,似乎有缺陷 服务器端通过SMTP发送:电子邮件不会在用户的“已发送”文件夹中结束。此外,还存在允许用户在浏览器中编辑HTML和附加文件的

我想从Javascript web应用程序创建一封电子邮件。我完全知道在这方面有这么多问题(例如)。典型答案存在以下问题:

  • Mailto:link:这将允许您创建一封电子邮件,但只能使用纯文本(无HTML),并且不允许使用附件

  • Activex:仅IE,我的应用程序也需要在Firefox和Chrome中运行。允许ActiveX的FF和Chrome插件存在安全隐患,似乎有缺陷

  • 服务器端通过SMTP发送:电子邮件不会在用户的“已发送”文件夹中结束。此外,还存在允许用户在浏览器中编辑HTML和附加文件的障碍

  • 创建一个Outlook.MSG文件:似乎没有库,也很少有关于这样做的文章。显然,文件格式实际上嵌入了一个完整的FAT文件存储系统

  • 许多其他SO问题与我的问题之间的关键差异

    • 没有访问客户端计算机的权限,因此我可以安装 助手应用程序或外接程序,根据需要更改设置等
    • 接口不需要实际发送邮件,它只需要 为用户设置它
    • 我还需要能够给电子邮件从JS的附件(如PDF)
    我不能成为第一个面对这种情况的web应用程序开发人员,但我无法找到商业或开源的解决方案

    更新:

    我使用了EML文件方法,到目前为止效果很好。下面是我创建和触发它的JS代码:

    var emlContent = "data:message/rfc822 eml;charset=utf-8,";
    emlContent += 'To: '+emailTo+'\n';
    emlContent += 'Subject: '+emailSubject+'\n';
    emlContent += 'X-Unsent: 1'+'\n';
    emlContent += 'Content-Type: text/html'+'\n';
    emlContent += ''+'\n';
    emlContent += htmlDocument;
    
    var encodedUri = encodeURI(emlContent); //encode spaces etc like a url
    var a = document.createElement('a'); //make a link in document
    var linkText = document.createTextNode("fileLink");
    a.appendChild(linkText);
    a.href = encodedUri;
    a.id = 'fileLink';
    a.download = 'filename.eml';
    a.style = "display:none;"; //hidden link
    document.body.appendChild(a);
    document.getElementById('fileLink').click(); //click the link
    
    MSG文件格式是,但它肯定不是有趣的。。。 为什么不创建一个EML(MIME)文件

    对于那些想要删除或否决此答案的人来说:建议使用EML(MIME)格式。根据OP的说法,他考虑了MSG文件格式(#4),但由于复杂性或缺少处理该格式的JS库,因此不鼓励使用该格式。如果考虑MSG文件,MIME是一个更好的选择-它是基于文本的,所以不需要特殊的库来创建它。Outlook将能够像打开MSG文件一样轻松地打开它。要确保Outlook将其视为未发送邮件,请将
    X-unsent
    MIME标头设置为1

    更新:最简单的EML文件如下所示:

    To: Joe The User <joe@domain.demo>
    Subject: Test EML message
    X-Unsent: 1
    Content-Type: text/html
    
    <html>
    <body>
    Test message with <b>bold</b> text.
    </body>
    </html>
    
    To:Joe用户
    主题:测试EML消息
    X-Unsent:1
    内容类型:text/html
    用粗体文本测试消息。
    
    利用纯文本eml文件的思想,我提出了以下建议:

    这是我找到的东西的编辑-创建一个
    .txt
    文件,然后下载它。由于
    .eml
    文件实际上是.txt文件,所以我认为这会起作用。确实如此。我将
    textarea
    与示例电子邮件一起放在这里,以便您可以轻松地进行测试。当你点击创建文件时,它会给你一个下载链接来下载你的
    .eml
    文件。我能看到的唯一障碍是在下载后让浏览器打开
    .eml
    文件

    编辑:考虑一下,当您可以访问客户端计算机时,您可以将浏览器设置为始终打开该类型的文件。例如,在Chrome中,您可以单击“下载”旁边的箭头,然后选择“始终打开此类型的文件”

    这是密码

    HTML:

    (函数(){
    var textFile=null,
    makeTextFile=函数(文本){
    var data=newblob([text],{type:'text/plain'});
    if(textFile!==null){
    window.URL.revokeObjectURL(文本文件);
    }
    textFile=window.URL.createObjectURL(数据);
    返回文本文件;
    };
    var create=document.getElementById('create'),
    textbox=document.getElementById('textbox');
    create.addEventListener('click',函数(){
    var link=document.getElementById('downloadlink');
    link.href=makeTextFile(textbox.value);
    link.style.display='block';
    },假);
    })();
    
    
    收件人:用户
    主题:主题
    X-Unsent:1
    内容类型:text/html
    测试消息
    创建文件
    
    下载
    似乎没有人回答附件问题,因此我的解决方案如下: 将EML创建为多部分/混合消息

    Content-Type: multipart/mixed; boundary=--boundary_text_string
    
    有了这个,你可以在你的电子邮件中有多个部分。 使用多个部件可以添加附件,如下所示

    Content-Type: application/octet-stream; name=demo.pdf
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment
    
    从电子邮件标题开始,然后添加边界,然后添加部分内容(换行符位置非常重要,否则客户端将无法正确解析文件)。可以添加多个零件。下面是一个例子。请注意,最后一个边界与其他边界不同(末尾有两条破折号)

    收件人:演示收件人
    主题:带附件的EML
    X-Unsent:1
    内容类型:多部分/混合;边界=--边界\文本\字符串
    ----边界\文本\字符串
    内容类型:text/html;字符集=UTF-8
    范例

    ----边界\文本\字符串 内容类型:应用程序/八位字节流;name=demo.txt 内容传输编码:base64 内容配置:附件 ZxHbXBszq== ----边界\文本\字符串 内容类型:应用程序/八位字节流;name=demo.log 内容传输编码:base64 内容配置:附件 ZxHbXBszq== ----边界\文本\字符串--
    这将为您提供一个包含两个附件的eml文件。
    查看您是否想了解有关如何工作的更多详细信息。

    我在创建带有非英语字符的.eml文件并在Outlook中打开该文件时遇到了编码问题。 问题是我把“charset=”放错了位置,没有在编码周围加引号(“)。 解决方案:

    function createShiftReportEmail() {
        const title = "Shift Összefoglaló";
        const body = "ÁÉŐÚŰÓÜÖÍűáéúőóöí";
    
        const emlContent = new Blob([`data:message/rfc822 eml,\nSubject: ${title}\nX-Unsent: 1\nContent-Type: text/plain;charset="utf-8"\n\n${body}`]);
    
        if (!document.querySelector('#downloadEmail')) {
            document.body.insertAdjacentHTML('beforeend', '<a id="downloadEmail" download="ShiftReport.eml" style="display: none">Download</a>');
        }
        const downloadBtn = document.querySelector('#downloadEmail');
        downloadBtn.href = URL.createObjectURL(emlContent);
        downloadBtn.click();
    }
    
    函数createShiftReportEmail(){
    const title=“ShiftÖsszefoglaó”;
    const body=“ÁŐÚŰÜÍűúőóí”;
    const emlContent=new Blob([`data:message/rfc822 eml,\n对象:${title}\nX Unsent:1\n内容类型:text/plain;charset=“utf-8”\n\n${body}`];
    如果(!document.querySelector('#downloadmail')){
    document.body.insertAdjacentHTML('beforeend','Download');
    }
    const downloadBtn=document.querySelector('#downloadEma
    
    function createShiftReportEmail() {
        const title = "Shift Összefoglaló";
        const body = "ÁÉŐÚŰÓÜÖÍűáéúőóöí";
    
        const emlContent = new Blob([`data:message/rfc822 eml,\nSubject: ${title}\nX-Unsent: 1\nContent-Type: text/plain;charset="utf-8"\n\n${body}`]);
    
        if (!document.querySelector('#downloadEmail')) {
            document.body.insertAdjacentHTML('beforeend', '<a id="downloadEmail" download="ShiftReport.eml" style="display: none">Download</a>');
        }
        const downloadBtn = document.querySelector('#downloadEmail');
        downloadBtn.href = URL.createObjectURL(emlContent);
        downloadBtn.click();
    }