获取带有chrome扩展名的打开邮件的gmail邮件正文

时间:2012-12-13 09:28:24

标签: javascript google-chrome google-chrome-extension gmail

对于一个项目,我需要获取当前打开的消息的正文,并将该消息传递给Web服务,以便处理和存储它的一些数据。

我认为最好的方法是使用扩展来获取邮件正文(以及一些其他信息),然后将其作为webrequest发送到服务以插入数据库。

但我不知道应该如何应对。我按照一些教程让我开始使用chrome插件,但是我找不到如何获取消息的正文。

我发现你需要内容脚本,但即便如此,我也不知道。

有谁可以给​​我一个开头呢?

8 个答案:

答案 0 :(得分:2)

每封电子邮件都有自己的唯一消息ID。

使用content.js从元素中获取“ messageId”,然后将其传递给Gmail API以获取电子邮件数据。

示例:

<div class="adn ads" style="display:" data-message-id="189******56e***3" data-legacy-message-id="189******56e***3">

API以各种格式返回电子邮件的数据。其中一种是“原始”格式,该格式将完整的电子邮件正文作为base64url编码的字符串返回。将此数据直接发送到您的服务器,然后解密电子邮件并将其保存到数据库。

答案 1 :(得分:1)

以下是我提出的代码,请务必在附加部分添加按钮,并为其提供带有count的ID。这等待div在加载时到达click或onload它将附加的材料插入指定的区域。不需要担心随机类,因为它们是静态的。该代码已经工作了两年。

    window.addEventListener("DOMNodeInserted", function(event) {
       //TEST TO SEE WHERE CSS IS AT
        // $(event.target).append($(event.target).parent()[0].className);
        if($(event.target).parent()[0].className == 'oc gU')
        {

            //ADD SEND BUTTON FOR MESSAGES
            //SUBJECT OF ENTIRE EMAIL GLOBAL
            var subject = $(event.target).parents().eq(28).children(1).find(".hP").text();

            //GET DATA EMAIL AND NAME 
            //Can assign via id or data-name and jid for email
            var imageid = $(event.target).parents().eq(18).find("img[jid]").attr("id");

           //THIS IS THE SEND BUTTON IN REPLAY ADD A BUTTON NEXT TO IT WITH THIS                     
           $(event.target).parents().eq(1).find(".gU.Up").children(0).append("addbuttonid here");
           //set click event for button
            $('#'+addbuttonid).click(function(){       
                //TO DO HERE
                //BODY FROM the REPLY MESSAGE
                var body = $(event.target).parents().eq(11).find('.Am').text();
                //PREVIOUS THREAD MESSAGES OPTIONAL
                var body = body + $(event.target).parents().eq(11).find('.gmail_extra').text();

            });


        }
        else if($(event.target).parent()[0].className == "aCi")
        {
           //THREAD MESSAGE
           //GET EMAIL SUBJECT
           var subject = $(event.target).parents().eq(17).children(1).find(".hP").text();
           //GET TO INFO
           var to = $(event.target).parents().eq(7).find('.g2');
           //GET NAME AND EMAIL
           var imageid = $(event.target).parents().eq(7).find("img[jid]").attr("id");
           var value = $("#\\"+imageid).attr("jid");
           var vname = $("#\\"+imageid).attr("data-name");
           //GET DOCUMENT BODY
           var tmp = $(event.target).parents().eq(6).find(".gs");
           var body = tmp.text();

           //GET DOCUMENT DATE
           var date = $(event.target).parents().eq(7).find('.g3').attr('title');
           date = date.replace(" at ", " ");
           //ADD THE BUTTONS HERE WITH INITIAL VALUES
            $(event.target).parents().eq(6).append('addbutton2');

            $("#"+addbutton2).click(function(event){
                var email = $("#\\"+$(this).attr("data-imageid")).attr("jid");
                var name = $("#\\"+$(this).attr("data-imageid")).attr("data-name");
                var body = $(this).attr("data-body");
                //TOD FOR BUTTON NEXT TO REPLY ICON ON THREAD AS OPENED

            });

        }
});

正如您在此代码中看到的,您现在可以在回复部分或线程中的任何消息中添加按钮i gmail UI,以及您的欢迎:)。 这是唯一的代码,除非你自己通过Chrome扩展工作。 Gmail.js或使用API​​根本不是必需的,因为您可以从页面中提取数据

答案 2 :(得分:1)

这是您的流程应该是:

  1. 当邮件打开时,您应该会在电子邮件正文或Gmail中的某个位置看到一个按钮。

  2. 点击该按钮应复制电子邮件的正文并将其推送到网络服务器。

  3. 如果您想自动复制粘贴邮件,可以默认点击此按钮。

  4. 对于这个过程 -

    1. 创建一个content_script.js文件并将该按钮放在gmail DOM中。

    2. 点击该按钮后,向eventpage.js发送消息,该消息将包含当前打开的电子邮件正文。 请注意,我没有使用background.js,而是使用eventpage.js,因为Google要求您避免使用background.js,并且两者都是相同的,但持久性几乎没有差异。

    3. 您的网络服务器可以接收消息并存储它。

    4. 如果您想避免按钮处理,则content_script.j应自动查找电子邮件消息打开事件并重复上述过程。但我建议你保留按钮,因为有时你可能会点击你不想复制的邮件。

答案 3 :(得分:0)

如果我必须这样做,我会尝试在GMAIL客户端上找到包含正文的DIV的ID ... 使用jQuery抓取DIV的HTML或文本内容非常简单......看看:http://api.jquery.com/html/

一个简单的jQuery选择器看起来像这样:

$("#gmailsBodyDivID").html()

如果jQuery不是一个选项,你可以使用JavaScript getElementByID(http://www.w3schools.com/jsref/met_doc_getelementbyid.asp)获取DIV

最后,如DudeOnRock所述,您应该对您的Web服务使用Ajax请求。

困难的部分是知道Gmail如何命名你正在寻找的DIV ...我只是快速浏览一下,我的,有一些奇怪的命名......

<div id=":w1" class="ii gt adP adO"><div id=":w2">

我不确定“:w1”或“:w2”代表什么,也不知道如何将它们与jQuery选择器一起使用......也许更有知识的人可能会在那里发光。

...所以我想你应该首先关注那个......

如果ID证明很难,你可能想要按类名使用jQuery选择器......

祝你好运!

答案 4 :(得分:0)

我不确定您的项目的具体要求是什么,但是可以设置一个电子邮件地址来转发这些电子邮件吗?

从那里开始,您只需要使用首选语言设置服务器以检查新电子邮件并处理它们(过滤内容,插入数据库等)。

优点:

  • 您没有被锁定使用Chrome +扩展程序
  • 您可以使用任何浏览器,设备,电子邮件应用转发电子邮件
  • 您无需破译凌乱的Gmail HTML
  • 对Gmail中的HTML / JS / CSS的更改不会破坏您的内部流程
  • 无需维护/更新Chrome扩展程序的更改(他们会)

答案 5 :(得分:0)

很难。正如@frenetix指出的那样,你可以获取你想要的元素的ID,并遵循他(或她)的方法。很难的是,Google实际上几乎每次加载Gmail时都会更改元素ID,这几乎是不可能的。

您可以做的一件事是假设您(或用户)正在点击撰写窗口。然后你可以做“document.activeElement”来获得正确的DOM元素。这至少可以让你进一步做到你想要做的事情,尽管还没有完成。

祝你好运。我现在正在这个领域工作,这非常艰难。

答案 6 :(得分:0)

这是一个老问题,但经过几天的尝试后我找到了答案。 要获取电子邮件标题,请迭代HTMLCollection,其中包含可以使用类名hP找到的电子邮件标题:

var list= document.getElementsByClassName("hP");
for (var i = 0; i < list.length; i++) {
    console.log(list[i].innerText);
}

获取电子邮件正文,迭代包含电子邮件正文的HTMLCollection(第ii类):

var list= document.getElementsByClassName("ii");
for (var i = 0; i < list.length; i++) {
    console.log(list[i].innerText);
}

答案 7 :(得分:-1)

Chrome扩展程序基本上是用JavaScript编写的。如果没有至少对JavaScript的一些理解,你打算做的事情会非常困难。以下是一些指示:为了访问网站元素,我建议您了解使用JavaScript进行DOM操作。要将数据发送到网站,您将不得不使用HTTPRequests(AJAX)。