J'aimerais créer un email à partir d'une application web Javascript. Je suis tout à fait au courant des nombreuses SO questions à ce sujet (par exemple, Ouvrez Outlook HTML avec Chrome ). Il y a des problèmes avec les réponses typiques:
Mailto: link: Cela vous permettra de créer un email, mais uniquement en texte brut (pas de HTML) et ne permettra pas les pièces jointes.
Activex: IE uniquement, mon application doit également fonctionner sous Firefox et Chrome. Les plug-ins FF et Chrome permettant à ActiveX représentent un risque pour la sécurité et semblent bogués.
Envoi côté serveur via SMTP: le courrier électronique ne se retrouve pas dans le dossier "Envoyé" de l'utilisateur. Des obstacles supplémentaires permettent à l'utilisateur de modifier le code HTML dans le navigateur et de joindre des fichiers.
Créez un fichier .MSG Outlook: Il semble qu’il n’y ait pas de bibliothèques et que peu de choses soient expliquées à ce sujet. Apparemment, le format de fichier intègre en réalité un système de stockage de fichiers FAT complet.
Principales différences entre de nombreuses autres SO questions et la mienne:
Je ne peux pas être le premier développeur d'applications Web à y faire face et pourtant, je ne parviens pas à trouver une solution commerciale ou open source.
Mettre à jour:
J'ai utilisé la méthode de fichier EML et cela fonctionne bien jusqu'à présent. Voici mon code JS pour le créer et le déclencher:
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
Le format de fichier MSG est documenté , mais ce n’est certainement pas amusant ... Pourquoi ne pas créer un fichier EML (MIME)?
À ceux qui veulent supprimer ou réduire cette réponse: il est suggéré d'utiliser le format EML (MIME). Selon l'OP, il a envisagé le format de fichier MSG (# 4), mais a été découragé en raison de la complexité ou de l'absence de bibliothèques JS qui traitent ce format. Si le fichier MSG a été pris en compte, MIME est un bien meilleur choix. Il est basé sur du texte et ne nécessite donc aucune bibliothèque spéciale. Outlook pourra l’ouvrir aussi facilement qu’un fichier MSG. Pour vous assurer qu'il est traité comme un message non envoyé par Outlook, définissez l'en-tête MIME X-Unsent
sur 1.
UPDATE: Le fichier EML le plus simple ressemblerait à ceci:
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>
En utilisant l’idée des fichiers texte eml, j’ai proposé ceci: http://jsfiddle.net/CalvT/un3hapej/
Ceci est une édition de quelque chose que j'ai trouvé - créer un fichier .txt
puis le télécharger. Comme les fichiers .eml
sont pratiquement des fichiers .txt, j’ai pensé que cela fonctionnerait. Et ça le fait. J'ai laissé la textarea
avec l'exemple de courrier électronique afin que vous puissiez facilement tester. Lorsque vous cliquez sur Créer un fichier, un lien de téléchargement vous permet de télécharger votre fichier .eml
. Le seul obstacle que je vois est que le navigateur ouvre le fichier .eml
après son téléchargement.
EDIT: Et en y réfléchissant, puisque vous avez accès aux ordinateurs clients, vous pouvez configurer le navigateur pour qu'il ouvre toujours les fichiers de ce type. Par exemple, dans Chrome, vous pouvez cliquer sur la flèche en regard du téléchargement et sélectionner de toujours ouvrir les fichiers de ce type.
Voici le code
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>
Personne ne semble avoir répondu à la question sur les pièces jointes. Voici donc ma solution: Créez la EML sous forme de message multipart/mixte.
Content-Type: multipart/mixed; boundary=--boundary_text_string
Avec cela, vous pouvez avoir plusieurs parties dans votre courrier électronique ..__ Plusieurs parties vous permettent d'ajouter des pièces jointes, comme ceci.
Content-Type: application/octet-stream; name=demo.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment
Commencez par les en-têtes de vos e-mails, puis ajoutez votre limite, puis le contenu de la pièce (l'emplacement des nouvelles lignes est très important, les clients n'analyseront pas correctement votre fichier). Vous pouvez ajouter plusieurs parties. Voici un exemple. Notez que la dernière limite est différente des autres (2 tirets à la fin).
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--
Cela vous donne un fichier eml avec deux pièces jointes ..__/Voir RFC 1371 si vous voulez en savoir plus sur son fonctionnement.