如何在 Gmail 邮件到达时对其进行编辑?
Posted
技术标签:
【中文标题】如何在 Gmail 邮件到达时对其进行编辑?【英文标题】:How to edit Gmail messages as they arrive? 【发布时间】:2015-10-14 05:42:26 【问题描述】:我的最终目标是防止通过带有唯一链接的自动加载图像进行电子邮件跟踪。我知道Google uses a proxy to load the images,所以至少他们不会透露我的 IP 地址,但是有些个人和组织会烦人地将跟踪器嵌入到他们的电子邮件中——他们会主动检查我是否阅读了他们的电子邮件。
特别是在 Gmail 应用程序中,我可以关闭图像的自动加载,但我希望对没有此设置的其他应用程序有类似的保护。例如,显然是there isn't a way to do this with Google Inbox。
我目前的想法是编写一个可以在新邮件(从事件或频繁轮询中接收)上运行的后端脚本,以将嵌入的 html 图像转换为指向这些图像的超链接——仅在我真的需要时使用图片。这样,无论我使用什么应用程序打开电子邮件,我都可以控制如何/何时跟踪我。编辑电子邮件是我使用 MS Exchange Server API 完成的工作,我正在寻找一种使用 Gmail 的方法——通过任何可用的方式。
我从 2010 年发现了几个关于如何使用 Google Apps Script 和 Gmail itself 修改主题行的主题。当时,您还不能这样做,但从那时起这些似乎已经更新,或者有使用 Gmail API 或 IMAP 的解决方案。
tl;博士
对于我的 Gmail 帐户,我如何以编程方式修改(并保存更改)收到的电子邮件?
可能的解决方案:
Google Apps 脚本 Gmail API IMAP 其他?【问题讨论】:
【参考方案1】:我认为 Gmail API 将完全满足您的需求。
假设我每分钟都在使用Users.messages.list()
-request 轮询收件箱中的新邮件。我小心地将after
中的after
参数与我最后一次检查收件箱的值一起使用,作为纪元以来的秒数。我只询问潜在新消息的 ID。您还可以subscribe to push events 来降低用户在轮询和更改消息之前按下消息的风险,正如 @Max 在 cmets 中提到的那样。如果脚本只适合您,则可能不是问题。
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" >
.
.
.
</html>
肯定包含很多img
-tags。
我只是提取img
-tags,获取网址,然后删除邮件中我最喜欢的XML Parser 中的所有img
-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..."
我修改后的新邮件现在在收件箱中!
【讨论】:
虽然是主要的竞争条件....希望您的用户在您的删除传播给他们之前不要点击原始条件,这对于移动客户端可能需要相当长的时间。 @Max 这是真的 :) 添加了推送通知的编辑。 这看起来是一个很好的解决方案。此外,我需要跟踪我已清理过哪些电子邮件,因此我可能会使用“不卫生”标签(使用标准的 Gmail 过滤器)标记所有收到的邮件,并在完成后用我的脚本删除标签。如果可能,我会将这些邮件发送到垃圾箱,而不是使用 DELETE,以防我的脚本最终损坏电子邮件。 @ElephantsonParade 听起来很棒!是的,把它们扔进垃圾桶可能更安全。 :)以上是关于如何在 Gmail 邮件到达时对其进行编辑?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# (web) 中集中维护一个数学公式,以便在需要时对其进行更改?