如何在 Gmail 邮件到达时对其进行编辑?

How to edit Gmail messages as they arrive?

最终我的 objective 是通过带有唯一链接的自动加载图像来防止电子邮件跟踪。我知道 Google uses a proxy to load the images 所以至少他们不会透露我的 IP 地址,但有些个人和组织讨厌地将跟踪器嵌入到他们的电子邮件中——他们会主动检查我是否阅读了他们的电子邮件。

特别是在 Gmail 应用程序中,我可以关闭图像的自动加载,但我希望对没有此设置的其他应用程序也有类似的保护。例如,显然 there isn't a way to do this with Google Inbox.

我目前的想法是编写一个后端脚本,可以 运行 在新邮件(从事件或频繁轮询中收到)上将嵌入的 HTML 图像转换为超链接链接到那些图片——只有在我真的需要图片时才使用。这样,无论我使用什么应用程序打开电子邮件,我都可以控制 how/when 我被跟踪了。编辑电子邮件是我用 MS Exchange Server APIs 完成的事情,我正在寻找一种方法来用 Gmail 来完成这项工作——通过任何可用的方式。

我在 2010 年找到了几个关于如何使用 and Gmail itself 修改主题行的话题。当时,你不能那样做,但似乎有可能从那时起这些已经更新,或者有使用 Gmail API 或 IMAP 的解决方案。

tl;博士

对于我的 Gmail 帐户,如何以编程方式修改(并保存更改)收到的电子邮件?

可能的解决方案:

我认为 Gmail API 可以完美满足您的需求。

假设我使用 Users.messages.list() 请求每分钟轮询一次收件箱以获取新消息。我小心地将 query 中的 after 参数与我上次检查收件箱时的值一起使用,作为纪元以来的秒数。我只要求提供潜在新消息的 ID。您还可以 subscribe to push events 来减轻用户在轮询和更改消息之前按下消息的风险,正如@Max 在评论中提到的那样。如果脚本适合您,可能不是问题。

q = after:<TIME_IN_SECONDS_SINCE_EPOCH_OF_LAST_POLL>
fields = messages/id

GET https://www.googleapis.com/gmail/v1/users/me/messages?fields=messages%2Fid&q=after%3A1437677475478&access_token={YOUR_API_KEY}

响应:

{
 "messages": [
    {
     "id": "14ebc16800d1fdc0"
    }, ...
  ]
}

哈!我有一条新消息。我得到它的原始内容,对其 URL 安全的 base64 编码内容进行解码,然后查看。

format = raw
fields = raw

GET https://www.googleapis.com/gmail/v1/users/me/messages/14eb68cb028163ba?fields=raw&format=raw&access_token={YOUR_API_KEY}

响应:

{
 "raw": "RGVsaXZlcmVk..."
}

让我们进行前面提到的 base64 解码。将所有“-”替换为“+”,将“_”替换为“/”,将其从 URL 安全的 base64 数据转换为常规的 base64 编码数据。

atob("RGVsaXZlcmVk...".replace(/\-/g, '+').replace(/\_/g, '/'));

结果:

<html lang="en">
<head>
<title>
Computerphile just uploaded a video
</title>

.
.
.


<img class="open_tracking_img" src="http://www.youtube.com/attribution_link?a=vi-KC3YA0Qc&u=/gen_204%3Fa%3Dem-uploademail" width="1" height="1">

.
.
.
</html>

肯定包含很多 img 标签。

我只是提取img-tags,得到URLs,并删除邮件中所有带有我最喜欢的XML Parserimg-tags。

删除标签后,我只是将 URL 插入邮件中我认为合适的位置,并将其编码回 URL 安全的 base64 编码数据,它是在其中检索到的。

btoa("<html lang="en">...".replace(/\+/g, '-').replace(/\//g, '_'));

最后,我删除了原来的邮件,插入了修改后的邮件。

DELETE https://www.googleapis.com/gmail/v1/users/me/messages/14eb68cb028163ba?access_token={YOUR_API_KEY}

POST https://www.googleapis.com/gmail/v1/users/me/messages?access_token={YOUR_API_KEY}

{
 "raw": "RGVsaXZlcmVkLVRvO..."
}

我修改后的新邮件现在在收件箱中!