0

我創建了一個Chrome打包的應用,作爲CRX從Chrome商店下載。我想讓用戶使用mailto:鏈接從應用程序發送郵件。看起來,這是不允許的,因爲安全限制(當我嘗試開發時,這是我得到的錯誤)。從Chrome打包的應用打開mailto:鏈接

我發現了另一個線程,他們說,它的工作通過設置location.href,但這個問題是很老了,我假設安全限制可能是新的。

所以...有沒有辦法從Chrome封裝應用中打開用戶本地的郵件客戶端,這樣他們就可以發送郵件?

+0

請問您是否可以發佈一些代碼(因爲它似乎對我來說工作得很好 - 至少在開發中)。 – gkalpak

+0

沒有太多。我的清單沒有沙盒的東西,因爲我需要訪問「存儲」API。我的主頁只是一個將我的內容頁面加載到IFRAME中的包裝器。我的內容頁面顯示'location.href =「mailto:blah ...」'。它對你有用的事實很有趣。我想知道我是否需要設置window.top.location.href或者什麼來突破IFRAME ... –

+0

爲什麼使用'location.href = ...'?我使用了'...',它工作。我誤解了你之後的情況嗎? – gkalpak

回答

1

一個幾句話:

  • 這個問題是關於在主窗口從iframe內提供mailto功能。
  • 添加鏈接(用適當的href)工作正常,但需要用戶交互(點擊鏈接):<a href="mailto:...">...</a>
  • 使用location.href = ...從內容安全策略(可有可能放寬阻止 - 我沒有進一步瞭解它)。
  • 使用window.top.location.href = ...導致以下錯誤: 無法打開同一窗口鏈接「的mailto:...」;嘗試目標=「_空白」。

解決方案是:

它使用爲我工作:

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

爲了完整起見,下面是一個示例擴展的源代碼的說明上述

的manifest.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> 

main.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> 

main.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); 
    }); 

});

+0

使用window.open工作就像一個冠軍!請注意,就我而言,窗口需要在異步xmlhttp請求返回後打開,因此它不是用戶操作的直接結果,並且仍然有效。 –

+0

既然你很容易地把這個問題弄明白了,我可以請你看看這個沒有得到任何愛的人: http://stackoverflow.com/questions/19035195/how-to-launch-a- PDF-從-A - 鉻 - 包裝 - 應用 –