Использование Javascript для создания электронной почты HTML в Microsoft Outlook

Я хотел бы создать письмо из веб-приложения Javascript. Я полностью осведомлен о многих вопросах SO по этому поводу (например, Открыть Outlook HTML с Chrome). Есть проблемы с типичными ответами:

  • Mailto: link: это позволит вам создать электронное письмо, но только в виде обычного текста (без HTML), и оно не позволяет вложения.

  • ActiveX: только IE, мое приложение также нужно запускать в Firefox и Chrome. FF и Chrome для включения ActiveX являются угрозами безопасности и кажутся ошибочными.

  • Серверные сообщения отправляются через SMTP: письмо не попадает в папку "Отправлено" для пользователя. Плюс препятствия, позволяющие пользователю редактировать HTML в браузере и прикреплять файлы.

  • Создайте файл Outlook.MSG. Кажется, нет библиотек и мало написано об этом. По-видимому, в файловом формате имеется встроенная система хранения файлов FAT.

Основные различия между многими другими вопросами SO и моими:

  • У меня do есть доступ к клиентским машинам, поэтому я могу установить вспомогательные приложения или надстройки, изменять настройки по мере необходимости и т.д.
  • Интерфейс не требует фактической отправки почты, он нужен только для его настройки для пользователя.
  • Мне также нужно предоставить электронное письмо от JS (например, PDF).

Я не могу быть первым разработчиком веб-приложений, которому стоит столкнуться с этим, но пока я не могу найти решение как коммерческого, так и открытого источника.

Update:

Я использовал метод файла 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

Ответ 1

Формат файла MSG документирован, но это, конечно, не весело... Почему бы не создать файл EML (MIME)?

Тем, кто хочет удалить или уменьшить этот ответ: рекомендуется использовать формат EML (MIME). Согласно OP, он считал формат файла MSG (№ 4), но был обескуражен из-за сложности или отсутствия JS-библиотек, которые обрабатывают этот формат. Если бы рассматривался MSG файл, MIME намного лучший выбор - он основан на тексте, поэтому для его создания не требуются специальные библиотеки. Outlook сможет открыть его так же легко, как файл MSG. Чтобы убедиться, что Outlook рассматривается как неотправленное сообщение, установите для заголовка X-Unsent MIME значение 1.

UPDATE: Простейший файл EML будет выглядеть следующим образом:

To: Joe The User <[email protected]>
Subject: Test EML message
X-Unsent: 1
Content-Type: text/html

<html>
<body>
Test message with <b>bold</b> text.
</body>
</html>

Ответ 2

Используя идею простых текстовых файлов eml, я придумал следующее: http://jsfiddle.net/CalvT/un3hapej/

Это редактирование чего-то, что я нашел - создать файл .txt и загрузить его. Поскольку файлы .eml практически являются файлами .txt, я подумал, что это сработает. И это так. Я оставил textarea с примером электронного письма, чтобы вы могли легко протестировать. Когда вы нажимаете кнопку "Создать файл", она дает вам ссылку для загрузки файла .eml. Единственное препятствие, которое я вижу, - это заставить браузер открывать файл .eml после его загрузки.

ОБНОВЛЕНИЕ: И, думая об этом, так как у вас есть доступ к клиентским машинам, вы можете настроить браузер так, чтобы он всегда открывал файлы этого типа. Например, в Chrome вы можете нажать на стрелку рядом с загрузкой и выбрать всегда открытые файлы этого типа.

Здесь код

HTML:

(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);
})();
<textarea id="textbox" style="width: 300px; height: 200px;">
To: User <[email protected]>
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>

Ответ 3

Никто, кажется, не ответил на вопрос вложения, поэтому вот мое решение: создайте EML как составное/смешанное сообщение.

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

С этим вы можете иметь несколько частей в вашей электронной почте. Несколько частей позволяют добавлять вложения, как это.

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

Начните с заголовков электронной почты, затем добавьте границу, затем содержимое детали (расположение новой строки очень важно, в противном случае клиенты не смогут правильно проанализировать ваш файл). Вы можете добавить несколько частей. Ниже приведен пример. Обратите внимание, что последняя граница отличается от других (2 черточки в конце).

To: Demo-Recipient <[email protected]>
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, если хотите узнать больше о том, как это работает.