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

时间:2015-01-14 20:28:21

标签: javascript web-applications outlook

我想从Javascript网络应用程序创建一封电子邮件。我完全了解这方面的许多SO问题(例如Open Outlook HTML with Chrome)。典型答案存在问题:

  1. Mailto:link:这将允许您创建一个电子邮件,但仅限于纯文本(无HTML),并且不允许附件。

  2. Activex:仅限IE,我的应用程序也需要在Firefox和Chrome中运行。 FF&允许使用ActiveX的Chrome插件存在安全隐患,而且似乎有问题。

  3. 通过SMTP发送服务器端:电子邮件不会在用户的“已发送”文件夹中结束。加上障碍让用户在浏览器中编辑HTML并附加文件。

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

  5. 关键差异之间的许多其他SO问题:

    • 可以访问客户端计算机,所以我可以安装 帮助应用程序或加载项,根据需要更改设置等。
    • 界面需要实际发送邮件,它只需要 为用户设置。
    • 我还需要能够通过电子邮件向JS发送附件(例如PDF)。

    我不能成为第一个面对此问题的网络应用开发者,但我无法找到商业或开源的解决方案。

    更新

    我使用了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
    

4 个答案:

答案 0 :(得分:14)

MSG文件格式为documented,但肯定不好玩...... 为什么不创建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>

答案 1 :(得分:8)

使用纯文本eml文件的想法,我想出了这个:http://jsfiddle.net/CalvT/un3hapej/

这是我发现的内容的编辑 - 创建.txt文件然后下载它。由于.eml文件实际上是.txt文件,我认为这样可行。确实如此。我已将textarea留下了示例电子邮件,以便您轻松测试。当您单击创建文件时,它会为您提供下载.eml文件的下载链接。我能看到的唯一障碍是让浏览器在下载后打开.eml文件。

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

这是代码

HTML:

&#13;
&#13;
(function () {
var textFile = null,
  makeTextFile = function (text) {
    var data = new Blob([text], {type: 'text/plain'});

    if (textFile !== null) {
      window.URL.revokeObjectURL(textFile);
    }

    textFile = window.URL.createObjectURL(data);

    return textFile;
  };


  var create = document.getElementById('create'),
    textbox = document.getElementById('textbox');

  create.addEventListener('click', function () {
    var link = document.getElementById('downloadlink');
    link.href = makeTextFile(textbox.value);
    link.style.display = 'block';
  }, false);
})();
&#13;
<textarea id="textbox" style="width: 300px; height: 200px;">
To: User <user@domain.demo>
Subject: Subject
X-Unsent: 1
Content-Type: text/html

<html>
<body>
Test message
</body>
</html>
  
</textarea>

<button id="create">Create file</button>
  
<a download="message.eml" id="downloadlink" style="display: none">Download</a>
&#13;
&#13;
&#13;

答案 2 :(得分:4)

似乎没有人回答附件问题,所以这是我的解决方案: 将EML创建为多部分/混合消息。

Content-Type: multipart/mixed; boundary=--boundary_text_string

有了这个,您可以在电子邮件中包含多个部分。 多个部分可让您添加附件,像这样。

Content-Type: application/octet-stream; name=demo.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment

从您的电子邮件标题开始,然后添加边界,然后添加零件内容(换行符非常重要,否则客户端将无法正确解析您的文件)。您可以添加多个部分。下面是一个例子。请注意,最后一个边界不同于其他边界(末尾有两个破折号)。

To: Demo-Recipient <demo@demo.example.com>
Subject: EML with attachments
X-Unsent: 1
Content-Type: multipart/mixed; boundary=--boundary_text_string

----boundary_text_string
Content-Type: text/html; charset=UTF-8

<html>
<body>
<p>Example</p>
</body>
</html>

----boundary_text_string
Content-Type: application/octet-stream; name=demo.txt
Content-Transfer-Encoding: base64
Content-Disposition: attachment
ZXhhbXBsZQ==

----boundary_text_string
Content-Type: application/octet-stream; name=demo.log
Content-Transfer-Encoding: base64
Content-Disposition: attachment
ZXhhbXBsZQ==

----boundary_text_string--

这将为您提供带有两个附件的eml文件。 如果您想了解更多有关其工作原理的信息,请参见RFC 1371

答案 3 :(得分:0)

在创建带有非英语字符的.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();
}

编辑:根本不需要引号(“)。只有位置对我来说是错误的。