在IE浏览器中,当邮件正文过长时,mailto链接失效。有没有解决这个问题的方法?

15

我在使用IE8打开带长信息的mailto链接时遇到了问题。

用户单击链接后,IE会切换到一个about:blank页面,并且永远不会完成调用Outlook以创建电子邮件。

以下是一个示例:

<a href="mailto:name@name.com?subject=123456789&amp;body=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111">mailto fails in IE8</a>
如果我缩短1的列表,电子邮件将会生成并且可以发送。 这是已知的IE问题吗?有哪些限制?

4
那些 IE 的人很讨厌。 - MedicineMan
1
我同意,在IE11上,当邮件正文过长时,mailto仍然会失败。 - Marco Demaio
这篇文章现在已经有9年了。我简直不敢相信人们仍然在看它。难道还没有更好的解决方案吗???? - MedicineMan
5个回答

32

我从未能让 location.href = mailtoHref 这个方法起效。然而,我发现以下方法是有效的。

$('body').append($('<iframe id="mailtoHack" src="' + mailtoHref + '"/>');
$('#mailtoHack').remove();

编辑

以下是一种不使用jQuery的方法:

function mailtoHack(href) {
    var iframeHack;
    if (href.indexOf("mailto:") === 0) {
        iframeHack = document.createElement("IFRAME");
        iframeHack.src = href;
        document.body.appendChild(iframeHack);
        document.body.removeChild(iframeHack);
    }
}

为了完整起见,这里有一个 Knockout 自定义绑定可用作 data-bind="mailto: foo"

ko.bindingHandlers.mailto = {
    init: function (element, valueAccessor) {
        ko.utils.registerEventHandler(element, "click", function (e) {
            var href = ko.unwrap(valueAccessor()), iframeHack;
            if (href.indexOf("mailto:") === 0) {
                iframeHack = document.createElement("IFRAME");
                document.body.appendChild(iframeHack);
                document.body.removeChild(iframeHack);
            } else {
                e.preventDefault();
            }
        });
    }
};

5
天才。我正在处理一个企业内部网络,里面有各种奇怪的IE7修改。这个技巧打败了他们的修改,让我的客户很满意!谢谢! - Kevin
1
在我看来,这应该是答案——上面那个给我的问题和直接使用mailto一样,但这个解决了它。 - Matt
1
这个黑科技很神奇,它在IE11中也能运行。IE是不稳定的典型! - Marco Demaio
在Firefox中使用此方法,mailto URL仍然被剪切,但在1963-1965个字符处(同样,没有确切数字的原因)。使用此解决方案,用户有时不会怀疑他的电子邮件无法到达某些收件人,除非电子邮件客户端提醒他们存在损坏的地址。这可能会在域名后缀处剪切地址。而且长的mailto:在Opera中无法工作。 - ajeh
在IE9中,限制似乎在1920个字符左右。超过这个限制后,它会悄无声息地失败。 - ajeh
2
你的 jQuery 第一行缺少一个 ) - jehna1

12

我也遇到了在IE8中出现的这个问题。令人惊讶的是这种情况的发生,感觉像是1998年以前就已经遇到过的问题!

无论如何,我做了一些测试,并想出了一个使用Javascript的解决方法:

<a href="javascript:doMailto()">Send Email</a>

然后定义这个脚本:

<script type="text/javascript">
   var sMailto = "mailto:name@name.com?subject=123456789&amp;body=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111234567890";

   function doMailto() {
      document.location.href = sMailto;
   }

</script>

因为某些原因,IE可以毫无问题地“转发”长URL(我的测试场景使用了800多个字符)。在存在多个mailto链接的情况下,您可以定义多个URL变量,并向doMailto()发送一个参数,让它切换到适当的链接。

这很丑吗?当然。但在紧急情况下它是可行的。


3
就我个人而言,我发现URL长度超过约505个字符时会经常出问题。因此,即使512个字符可能不是严格的规定。感谢IE8! - CBono
1
经过大量测试,似乎它的最高值恰好为509。至少对我来说是这样。 - Jeff
1
嗯,奇怪的是,我在使用类似你的JavaScript解决方案时遇到了531的限制。 - Andreas
4
在IE11上,当URL长度超过507个字符时,此方法无法正常工作。 - Marco Demaio
似乎没有什么规律可以确定 mailto: URL 的确切长度是什么,这个问题在我使用 IE9 发送到多个地址时也出现了(不使用 Subj 或 Body),答案中的解决方法并不起作用。 - ajeh

2

我也尝试了CBono发布的解决方案,但是仍然不能使它工作。当您直接在浏览器中粘贴mailto URL时,无论字符串有多长都没有问题。因此,我实现了以下内容:

<a href ="#" onclick="javascript:doMailto(); return false;">Send Email</a>

<script type="text/javascript">
   var sMailto = "mailto:mail@something.com;mail@something.com;mail@something.com?subject=A really long subject can go here if you want and it will work Im telling you&body=Click for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profileClick for detailed profile&cc= &bcc= mail@something.com";

   function doMailto() {
      window.open(sMailto);
   }

</script>

如CBono所提到的,如果您希望此操作是动态的,您只需要将mailto字符串作为参数传递给函数,并将其分配给sMailto变量即可。
希望这有所帮助。

2

我的建议是停止滥用可怜的mailto链接。如果您想要预填写这么多信息,请为用户构建一个联系表格。


1

看起来以下超链接似乎有效。它有512个字符长,每次使用都有效。您可以增加收件人的长度,但必须从主题或正文中减去一些。主题也是如此。

我希望这个信息能够被记录下来,我只是通过实验猜测出来的。

<a href="mailto:name@name.com?subject=123456789&amp;body=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111234">

我很乐意接受任何人提供的答案,只要他们能找到证明这是一个已知问题的文档。


512是一个相当奇怪的数字。2038是IE支持URL的最长长度,但512使得它变得非常奇怪。 - Earlz

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