【问题标题】:Opening a mailto: link from a chrome packaged app打开 mailto:来自 chrome 打包应用程序的链接
【发布时间】:2013-11-22 18:55:57
【问题描述】:

我创建了一个 chrome 打包的应用程序,它作为 CRX 从 Chrome 商店下载。我想让用户使用 mailto: 链接从应用程序发送邮件。由于安全限制,这似乎是不允许的(当我尝试开发时,这是我得到的错误)。

我发现了另一个线程,他们说通过设置 location.href 可以工作,但这个问题已经很老了,我假设安全限制可能是新的。

那么……有没有办法从 chrome 打包的应用程序中打开用户的本地邮件客户端,以便他们发送消息?

【问题讨论】:

  • 能否请您发布一些代码(因为它似乎对我来说工作得很好 - 至少在开发中)。
  • 没什么大不了的。我的清单没有沙盒,因为我需要访问“存储”API。我的主页只是一个将我的内容页面加载到 IFRAME 中的包装器。我的内容页面显示location.href="mailto:blah…"。它对你有用的事实很有趣。我想知道我是否需要设置 window.top.location.href 或其他东西来打破 IFRAME...
  • 为什么使用location.href=...?我使用了<a href="mailto:...">...</a>,它可以工作。我误解了你的目的吗?
  • 我会做一个实验。 mailto URL 是根据用户操作动态生成的,因此使用 会有点棘手。但如果它有效,那将是一个合适的解决方法。

标签: google-chrome google-chrome-extension google-chrome-app


【解决方案1】:

几点说明:

  • 这个问题是关于在主窗口的iframe 中提供mailto 功能。
  • 添加链接(使用适当的href)可以正常工作,但需要用户交互(单击链接):<a href="mailto:...">...</a>
  • 内容安全策略禁止使用 location.href = ...(可能会放宽 - 我没有进一步研究)。
  • 使用window.top.location.href = ... 会导致以下错误: 无法打开“mailto:...”的同窗口链接;尝试目标 =“_blank”。

解决办法:

它对我有用:

    window.open("mailto:...");

为了完整起见,下面是说明上述内容的示例扩展的源代码

ma​​nifest.json:

{
    "manifest_version": 2,
    "name":    "Test App",
    "version": "0.0",

    "app": {
        "background": {
            "scripts": ["background.js"]
        }
    }
}

background.js:

chrome.app.runtime.onLaunched.addListener(function() {
    chrome.app.window.create("wrapper.html");
});

wrapper.html:

<!DOCTYPE html>
<html>
    <head></head>
    <body><iframe src="main.html"></iframe></body>
</html>

ma​​in.html:

<!DOCTYPE html>
<html>
    <head><script type="text/javascript" src="main.js"></script></head>
    <body>
        <form id="frm1">
            <input type="email" id="inp1" placeHolder="Recipient's e-mail"
                   required /><br />
            <input type="text" id="inp2" placeHolder="Message's subject"
                   required /><br />
            <input type="submit" id="btn1" value="Send e-mail" />
        </form>
    </body>
</html>

ma​​in.js:

window.addEventListener("DOMContentLoaded", function() {
    var frm1 = document.getElementById("frm1");
    var inp1 = document.getElementById("inp1");
    var inp2 = document.getElementById("inp2");
    var btn1 = document.getElementById("btn1");

    frm1.addEventListener("submit", function(evt) {
        evt.preventDefault();
    });

    btn1.addEventListener("click", function() {
        var email = inp1.value;
        var subject = encodeURIComponent(inp2.value);
        var mailToStr = "mailto:" + email + "?Subject=" + subject);
        console.log(mailToStr);
        window.open(mailToStr);
    });

});

【讨论】:

  • 使用 window.open 就像一个冠军!请注意,在我的情况下,窗口需要在异步 xmlhttp 请求返回后打开,因此它不是用户操作的直接结果,它仍然有效。
  • 既然你这么容易就解决了这个问题,请问你看看这个没有得到任何爱的:stackoverflow.com/questions/19035195/…
猜你喜欢
  • 2014-03-14
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多