使用 JQuery / JavaScript 调用 / 点击 mailto 链接

87

我想从JavaScript中调用mailto链接 - 也就是说,我想要一种方法,让我能够在用户的电脑上打开邮件客户端,就像他们点击普通的mailto链接一样。

我该如何做到这一点?


工作示例:https://jsfiddle.net/gaboom/h81qov5g/ - sibidiba
1
尝试 <button onclick="window.open('mailto:KingRider<contato@sandroalvares.com.br>');">联系我</button> - KingRider
6个回答

150

你可以在这里使用 window.location.href,像这样:

window.location.href = "mailto:address@dmail.com";

4
我该如何添加正文内容呢?mailto:address@dmail.com?body=myBody 和 mailto:address@dmail.com&myBody 对我都不起作用... - Max
@jipiboily,请问您能否再详细解释一下?您尝试过哪些浏览器,它们都无法工作? - Adi
据我记得,它不能与Opera和其他浏览器一起使用。根据您的需求,您可能可以解决这个问题。 - jipiboily
@Rolf 我刚在最新版本的Chrome稳定版中测试了一下,仍然可以工作。 - Nick Craver
可以在不打开新标签页或更改任何窗口可见内容的情况下完成吗:window.location.href = "tel:+4812345";? - Yoda
11
Max,你可能已经想到了,但是为了未来的读者:window.location.href = 'mailto:address@dmail.com&subject=Hello there&body=This is the body';。不要用 ?&amp;,只需使用 & - cssyphus

10

您可以通过在页面上使用链接并使用 .click() 来避免上面讨论的空白页问题:

document.getElementById('mymailto').click();
...
<a href="mailto:...." id="mymailto" style="display:none"></a>

我尝试了这个代码:`function Call(){ document.getElementById('mymailto').click(); }`,但新标签页仍然打开。 - Yoda

6

对于我来说可行的解决方案,在chrome、IE和firefox中进行了测试,并与outlook一起使用:

window.location.href = 'mailto:address@dmail.com?subject=Hello there&body=This is the body';

%0d%0a 是邮件中 mailto 链接的换行符号。

%20 是应该使用的空格符号,但我也用普通空格成功了。


3

建议使用

window.open('mailto:address@mail.com?subject=sub&body=this is body')

如果我们使用window.location.href,Chrome浏览器在网络选项卡中会出现错误,显示 Provisional headers are shown Upgrade-Insecure-Requests: 1


这对我帮助很大,谢谢@Prabin Tp - JonSnow

1

实际上,有可能避免空白页面。

我发现,你可以简单地将带有mailto链接的iframe插入到dom中。 这在当前的Firefox/Chrome和IE上都有效(即使IE也会显示一个短的确认对话框)。

使用jQuery,我得到了以下代码:

var initMailtoButton = function()
{
    var iframe = $('<iframe id="mailtoFrame" src="mailto:name@domain.com" width="1" height="1" border="0" frameborder="0"></iframe>');
    var button = $('#mailtoMessageSend');    
    if (button.length > 0) {            
        button.click(function(){
            // create the iframe
            $('body').append(iframe);
            //remove the iframe, we don't need it any more
            window.setTimeout(function(){
                iframe.remove();    
            }, 500);

        });
    }
}

1

这是一个老问题,但我结合了几个 Stack Overflow 来编写这个函数:

//this.MailTo is an array of Email addresses
//this.MailSubject is a free text (unsafe) Subject text input
//this.MailBody is a free text (unsafe) Body input (textarea)
//SpawnMail will URL encode /n, ", and ', append an anchor element with the mailto, and click it to spawn the mail in the users default mail program
SpawnMail: function(){
    $("#MyMailTo").remove();
    var MailList="";
    for(i in this.MailTo)
        MailList+=this.MailTo[i]+";";
    var NewSubject=this.MailSubject.replace(/\n/g, "%0d%0a");
    NewSubject=NewSubject.replace(/"/g, "%22");
    NewSubject=NewSubject.replace(/'/g, "%27");
    var NewBody=this.MailBody.replace(/\n/g, "%0d%0a");
    NewBody=NewBody.replace(/"/g, "%22");
    NewBody=NewBody.replace(/'/g, "%27");
    $("#mainNavBar").after("<a id='MyMailTo' style='display:none;' href='mailto:"+MailList+"?subject="+NewSubject+"&body="+NewBody+"'>&nbsp;</a>");
    document.getElementById('MyMailTo').click();
}

这个的酷之处(以及我的计划如何使用它)在于我可以将其放入循环中,并将单独的消息拆分给数组中的每个人,或者让每个人保持在一起(这就是该函数当前的工作方式)。 无论如何,感谢@Toskan的提示。
跟进 - 请注意,新的HTML5标准不允许循环mailto(或其他弹出相关js),除非有“必需的用户手势”。这里有一个很酷的文章:https://github.com/WICG/interventions/issues/12 因此,您不能使用此功能来批量生成单独的电子邮件,但它在当前设计中与发送给许多人一起使用效果很好。

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