Используйте 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).
Я не могу быть первым разработчиком веб-приложений, столкнувшимся с этим, и все же я не могу найти решение с коммерческим или открытым исходным кодом.
обновление:
я использовал метод файла 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
3 ответов
формат файла MSG -документирована, но это конечно не весело... Почему бы не создать файл EML (MIME)?
для тех, кто хочет удалить или downvote этот ответ: предложение заключается в использовании формата EML (MIME). Согласно OP, он рассмотрел формат файла MSG (#4), но был обескуражен из-за сложности или отсутствия библиотек JS, которые обрабатывают этот формат. Если файл MSG рассматривался, MIME является гораздо лучшим выбором - он основан на тексте, поэтому нет специальных для его создания требуются библиотеки. Outlook сможет открыть его так же легко, как файл MSG. Чтобы убедиться, что Outlook обрабатывает его как Неотправленное сообщение, установите X-Unsent
заголовок MIME до 1.
UPDATE: самый простой файл 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>
используя идею текстовых файлов eml, я придумал следующее:http://jsfiddle.net/CalvT/un3hapej/
это редактирование чего - то, что я нашел - создать скачать. As .eml
файлы практически .txt-файлы, я подумал, что это сработает. Так оно и есть. Я оставил textarea
С электронной почтой образца внутри поэтому вы можете легко испытать. Когда вы нажимаете на create file, он затем дает вам ссылку для загрузки, чтобы загрузить ваш . Единственное препятствие может видеть, что браузер открывает .eml
файл после его загрузки.
EDIT: и думая об этом, поскольку у вас есть доступ к клиентским машинам, вы можете установить браузер, чтобы всегда открывать файлы этого типа. Например в 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 <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>
никто не ответил на вопрос привязанности, вот мое решение: создайте 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 <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 если вы хотите знать больше подробностей о том, как это работает.