mailto特殊字符

19

有没有办法让电子邮件客户端(Outlook)接受来自HTML中mailto链接的特殊字符?我试图在邮件正文中使用带有德语字符的mailto链接,但是在Outlook中我只得到了奇怪的字符。

谢谢。


1
我有同样的问题。你能选择一个答案或者发表你自己的吗? - Andrew Magill
10个回答

22
我刚花了两天时间调查这个问题。我们的问题是,如果subject=字符串包含非ASCII字符(例如挪威字符),则UTF-8编码的网页上的mailto:链接对Outlook用户无效。例如: “mailto:mail@coretrek.no?subject=julegløgg og fårikål”
从目前为止我所学到的,Outlook仅处理ASCII和ISO-8859-1字符。因此,在尝试从IE或Firefox点击上述mailto链接时,Outlook无法解码字符,导致主题损坏并包含“奇怪”的字符。
因此,下一步是尝试在ISO-8859-1中重新编码页面。我们所做的是将utf-8页面上的原始mailto链接替换为指向“电子邮件到iso”服务的链接,如下所示:

http://url.com/service.php?service=util.mailtoencode&mailto=mail%40coretrek.no%3Fsubject%3Demne+%C3%B8%C3%A6%C3%A5+emne

这个页面会将mailto字符转换为ISO-8859-1,然后将整个页面内容输出为ISO-8859-1。页面上的javascript包含"location.href='mailto:...'",可自动打开客户端的电子邮件客户端。到目前为止,一切似乎都很好。在Internet Explorer中,无论是Thunderbird还是Outlook(在WinXP上测试了IE7与Outlook Express和TB 2),都可以正常工作。但现在问题实际上是Firefox。它似乎无法解码仅在ISO-8859-1而不在ASCII中找到的字符的url编码URL(例如挪威语的å,当编码时表示为%E5)。如果页面编码为UTF-8,则相同的å被正确处理,但似乎Firefox开发人员已经忘记了测试特殊字符与ISO-8859-1字符集一起使用的情况。结果是Firefox将未解码的字符串(仍包含%E5而不是å)传递给电子邮件客户端。令人惊讶的是,Outlook可以正确处理此问题(它可以自己解码字符串),但Thunderbird不能,它可能有与Firefox相同的错误。如果您不对主题进行URL编码,则该字符串将正确传递给Thunderbird,但不会传递给Outlook。我们还尝试过其他编码方法,如php的htmlentities、htmlspecialchars、base64编码等,但所有这些方法都有某种失败。总结一下:UTF-8编码的页面:IE始终失败;FF->Thunderbird:OK;FF->Outlook:FAIL。ISO-8859-1编码的页面:IE:OK。

FF -> Thunderbird: 如果主题进行了url编码,则失败,否则正常。

FF -> Outlook: 如果主题未进行url编码,则失败,如果已编码则正常。 (这是在Windows上,在Ubuntu Linux上,FF和TB始终正常工作)。

希望这对其他遇到同样问题的人有所帮助。


10

在PHP中,我认为与Outlook最兼容的函数是rawurlencode()


我自己摸索出来的,尝试了各种其他方法后才成功。+1 - yuttadhammo
运行得非常好 :-) - Salvi Pascual

3

3
我认为使用urlencode方法可以实现你想要的功能。JavaScript中的字符串对象有.encodeURI()方法,而.NET则有HttpUtility.UrlEncode方法。
你在使用哪种编程语言?

我正在使用Razor的UrlEncode。你有任何想法吗,@John?http://stackoverflow.com/questions/33097643/mailto-link-encoding-in-mvc-razor - Sebastian

2

您需要为mailto:协议启用UTF-8支持

从主要的Outlook窗口,点击“工具” -> “选项” -> “邮件格式” -> “国际选项” -> “启用mailto:协议的UTF-8支持”。


1
唉,当你设计一个可能需要在mailto:中使用特殊字符的网站时,你无法控制希望点击链接的各种人的配置。 - ghoti

2

rawurlencode()函数最适合在Outlook中使用,已在Firefox、Chrome和IE中进行测试。


这个答案与马里奥·楚卡在2010年提供的答案相同。 - jogojapan

1

正如yandr所指出的,这个问题是Outlook持续存在的问题。

微软已经发布了文档指出,正确配置的Outlook 2003和2007连接到正确配置的Exchange服务器将默认支持Unicode,但这并不能帮助你解决普遍存在的问题。

供参考,你需要参考RFC 2047标准。

我实现的解决方法(实际上是用瑞典语)是使用Web表单而不是mailto链接。它需要在服务器端进行更多的设置,但可以更好地控制联系过程。

我知道这不是你想听到的,但在世界停止使用来自Microsoft的有缺陷的软件之前,我们将继续需要像这样的解决方法。


0

听起来你需要包含mailto链接的页面使用Outlook期望的编码方式。如果不了解更多情况,我建议尝试使用UTF-8和ISO-8859-1编码方式。

更多相关情况包括出现了哪些奇怪字符以及页面当前使用的编码方式。


0
如果使用SharePoint 2010,似乎微软已经意识到了这个问题,并提供了一些函数来解决它。
以下将正确转义当前页面的链接
escapeProperly(escapeProperlyCoreCore($(location).attr('href'), false, false, true))

0
在JavaScript中,您可以使用encodeURIComponent函数来处理主题和正文。这样,邮件中的所有特殊字符都会被正确显示。
const emailRequest = {
    to: "abc@xyz.com",
    cc: "abc@xyz.com",
    subject: "Email Request - for <CompanyName>",
    body: `Hi All, \r\n \r\n This is my company <CompanyName> 
            \r\n Thanks`,
};

const subject = encodeURIComponent(emailRequest.subject.replace("<CompanyName>", 'ABC & ** Company'));
const body = encodeURIComponent(emailRequest.body.replace("<CompanyName>", 'ABC & ** Company'));
window.location.href = (`mailto:${emailRequest.to}?cc=${emailRequest.cc}&subject=${subject}&body=${body}`);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接