需求:
今天同事问我一个需求,就是如果用html的mailto scheme,能否当其点击后弹出的outlook中,其内容正文部分是一个带有html的样式或格式的?
我们检查了一下很多文章,包括RFC6068(http://tools.ietf.org/html/rfc6068),还有StackOverflow的相关帖子(http://stackoverflow.com/questions/5620324/mailto-with-html-body) ,都表明这个是不可能实现的。
真是这样的么?因为10年前当刚接触到ActiveX控件时候,讲到ActiveX控件的强大之处甚至可以操作注册表,那么它应该也能对于在注册表中注册的邮件客户端应用做一些高级功能的定制吧,然后我很轻易就实践出来了。
实践:
我们很简单,先创建一个html页面,上面有一个超级链接'Share this link",当点击这个链接时候,会打开Outlook的客户端然后把一些相关的内容填写进去,特别是邮件正文部分必须有样式(比如就简单设置下文字颜色)
附上代码:
我们先写一段js:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<script language=
"javascript"
type=
"text/javascript"
>
/*
* Demo:使用mailto scheme 发送带有html样式的内容作为邮件内容
*/
function
SendMail(subject,toName, ccName, bccName ) {
//以下2行复制自:http://msdn.microsoft.com/en-us/library/office/aa210897(v=office.11).aspx
//创建一个ActiveX控件对象让其对应Outlook应用
var
outlookApp =
new
ActiveXObject(
"Outlook.Application"
);
//MAPI是“消息传递应用程序接口”,如果双方应用程序都启用“MAPI”,就可以相互共享邮件信息
var
nameSpace = outlookApp.getNameSpace(
"MAPI"
);
//开始构造outlook的邮件项
var
mailItem = outlookApp.CreateItem(0);
//设置邮件主题
mailItem.Subject = subject;
//设置邮件to列表
mailItem.To = toName;
//设置邮件cc列表
mailItem.Cc= ccName;
//设置邮件的bcc列表
mailItem.Bcc=bccName;
//这里特别注意了,这里的mailBody是一个可以带html样式的body
var
mailBody=
"<html><body><font color='red'>This is the email body with html style</font></body></html>"
;
//设置邮件的内容为html内容
mailItem.HTMLBody = mailBody;
//显示邮件
mailItem.Display(0);
//重置资源
mailItem =
null
;
nameSpace =
null
;
outlookApp =
null
;
}
</script>
|
然后页面上调用我们的这个方法来用mailto sheme:
测试:
假设这个页面叫testmailto.html ,当我们要在IE浏览器中测试它的时候的时候,首先必须让浏览器启用ActiveX控件的支持:
之后,它会出现这个超级链接Share this link。如果点击它,则会显示如下,提醒你ActiveX控件因为太强大而可能不安全,问你是否允许交互:
选择"Yes"后,可以发现Outlook客户端被打开,除了填写上去的一般信息(Subject,to,cc,bcc)以外,最重要的是, body 部分不再是素文本,而是带有样式的文本。
这正是我们所需要的。
结论:
所以直接用mailto scheme,是不可能创建带有样式文本的邮件内容的的,但是我们可以用 ActiveX控件轻易的击穿它,但是因为ActiveX只有IE支持,而且带有安全隐患。
比如在Firefox中运行相同的例子,则会报以下的错误:
所以我还得继续研究,看下别的浏览器如何去实现这个相同的需求。