繁体   English   中英

如何从 Gmail email 中提取内嵌图像? (所有可用的解决方法都不再起作用)

[英]How can I extract inline images from a Gmail email? (all available workarounds do not work anymore)

我编写了一个脚本来将收到的电子邮件从 Gmail 导出到 PDF。 一切正常,除了我无法提取使用 Gmail 帐户发送给我的内联图像。 问题是,html 代码中的内联图像附件(如果每次复制和粘贴时插入的名称相同,例如graphic.png)和cid(例如ii_l5vcyjv50)之间没有联系。

互联网上似乎有数百种解决方法可以从message.getRawContent()中提取图像的 base64 代码,并用它替换 html 中的相应 cid。 但是所有这些都不再起作用了,因为 getRawContent() 的结构已经改变并且使用的 RegEx 不起作用或者谷歌改变了内联图像的链接方式(cid 格式)。

访问内联图像真的有那么难吗? 如何将 X-Attachment-Ids 和所属的 base64 代码提取到数组中? 不幸的是,base64 代码前面没有使用任何标签,RegEx 绝对让我不知所措。

非常感谢

...
Dies ist ein Screenshot:
[image: grafik.png]

Dies ist eine per Drag und Drop eingef=C3=BCgte Bilddatei:
[image: amsel.jpg]


Dies ist ein Bild aus Word:
[image: grafik.png]


Dies ist ein Bild direkt aus dem Browser =C3=BCber "Grafik kopieren"
[image: grafik.png]

--=20
Viele Gr=C3=BC=C3=9Fe
Benni

--0000000000008333b505e48ad3d1
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=
=3D"gmail_attr">---------- Forwarded message ---------<br>Von: <b class=3D"=
gmail_sendername" dir=3D"auto">Summer Moon</b> <span dir=3D"auto">&lt;<a hr=
ef=3D"mailto:summermoonair@gmail.com">summermoonair@gmail.com</a>&gt;</span=
><br>Date: Do., 21. Juli 2022 um 20:24=C2=A0Uhr<br>Subject: Gmail Inline Im=
age<br>To: Summer Moon &lt;<a href=3D"mailto:summermoonair@gmail.com">summe=
rmoonair@gmail.com</a>&gt;<br></div><br><br><div dir=3D"ltr"><div>Dies ist =
ein Screenshot:</div><div><img src=3D"cid:ii_l5vd00311" alt=3D"grafik.png" =
width=3D"468" height=3D"263"><br><br></div><div>Dies ist eine per Drag und =
Drop eingef=C3=BCgte Bilddatei:</div><div><img src=3D"cid:ii_l5vd1fs22" alt=
=3D"amsel.jpg" width=3D"468" height=3D"222"><br><br></div><div><br></div><d=
iv>Dies ist ein Bild aus Word:</div><div><img src=3D"cid:ii_l5vd44ms3" alt=
=3D"grafik.png" width=3D"468" height=3D"468"><br><br></div><div><br></div><=
div>Dies ist ein Bild direkt aus dem Browser =C3=BCber &quot;Grafik kopiere=
n&quot;<br></div><div><img src=3D"cid:ii_l5vcyjv50" alt=3D"grafik.png" widt=
h=3D"468" height=3D"222"><br><br>-- <br><div dir=3D"ltr" data-smartmail=3D"=
gmail_signature"><div dir=3D"ltr">Viele Gr=C3=BC=C3=9Fe=C2=A0<div>Benni</di=
v></div></div></div></div>
</div></div>

--0000000000008333b505e48ad3d1--
--0000000000008333b605e48ad3d2
Content-Type: image/png; name="grafik.png"
Content-Disposition: inline; filename="grafik.png"
Content-Transfer-Encoding: base64
Content-ID: <ii_l5vcyjv50>
X-Attachment-Id: ii_l5vcyjv50

iVBORw0KGgoAAAANSUhEUgAAB4AAAAOPCAYAAAAqu9wAAAAABHNCSVQICAgIfAhkiAAAIABJREFU
eF7svdmXJOd53vnmXllbV29oNIAGAZAUaZImJYqmRGksjzSWfSEf6VbnzPHV3M7dXMyl+WdoLnx0
xvacIx/bc6GjsWXNcEYSTJEUKYIUuADEjsbS6LX23DPmeSMruqOiMjIyKzMrt182ClUZ8S3v9/u+
iKzKJ5/3ywVBJwiCnPlXNzB9t9ijq5/z8QP8DAEIQAACEIBAjEAul4bj1AtqWqGpHc+nBza1Pgc1
fDac2fIZFCvnIJBFQL82j/nw37HTH7lgvN+/AxscoH7zT+88PDO4vv5iGFg/yI07vjH7T0zQ2fvP
wPAzT57+e+lJ8WH78b+5Bj3yGcNPqx7FdSqO3NnSfQ6Fcx7Vj+YvlxhQtG6y1ld8bP37elLiXNdS
VqWMTjNOD5qa8NyY3We2P26BrPiy2s/mM3iB5mIXSDyWYePq1/+wdX1suZP7V5Bxn8ricN7z8f77
jaVfuz6+fnEPWz8c98mlHrFKYxZvM61MFOMo/aeNq9/xcY5FnFLbSLtBn1SY9ZizmCbvu6njPOeJ
s68IpxsafHWfs1OqQQACEIAABCAAAQjMjEBxZj3TMQQgAAEIQAACEIAABFaSwHgC7/wjW/bxnZ2B
YcXfszU5MjKBLAVl5AapAAEIQAACEIAABCAAAQhAAAIQWD4CCMDLN6eMCAIQgAAEIAABCEAAAhAQ
gWkIs95mhslsIPtpxDSww1FPRg70M0JrJOxnechG7ZDyy0Qgy2G5TGOd9lhCZ3Dicov4ph2PYvLz
zMW0Z4j2IQABCEAAAhCAAAQgMN8EEIDne36IDgIQgAAEINCXACna+mLhIATmgkDyjfmLDmrW94eZ
j/8CAIwj4k47vFPtn0OrfTy2hPo0q5S6o14/s15/o8Y76fJZ4x9fFDzHotI
gs+KaNIdlaa+fCOxj´´´
SzseH/cyisBZ98+s1Tnv6zAr/qx1ncUnqz7nIQABCEAAAhCAAASWi

使用Gmail API您可以检索cidbase64 ,如下所示:

gmail.users.messages.get({
  userId: "me",
  id: <MessageID>,
  fields: "payload.parts"
}).then(function({data}) {
  for (var part of data.payload.parts) {
    var cid = part.headers.find(_ => _.name.toLowerCase === "content-id").value;
    var base64 = part.body.data;
  }
});

我相信你的目标如下。

  • 您想从 Gmail 消息中检索内联图像文件的图像数据。
  • 您想使用 Google Apps 脚本实现此目的。

在这种情况下,下面的示例脚本怎么样?

示例脚本:

此脚本使用 Gmail API。 因此, 请在 Google 高级服务中启用 Gmail API 并且,请设置 email 的消息 ID,包括内联图像。

function myFunction() {
  var messageId = "###"; // Please set the message ID of mail you want to retrieve.

  var obj = Gmail.Users.Messages.get("me", messageId);
  var files = obj.payload.parts.reduce((ar, { body, headers, mimeType }) => {
    var ob = headers.find(({ name }) => name == "X-Attachment-Id");
    if (ob) {
      var { data } = Gmail.Users.Messages.Attachments.get("me", messageId, body.attachmentId);
      var blob = Utilities.newBlob(data, mimeType, ob.value);
      ar.push({ cid: ob.value, blob });
    }
    return ar;
  }, []);

  // If you want to create the files as each file, you can use the following script.
  files.forEach(({ blob }) => DriveApp.createFile(blob)); // By this, the files with the filename of "cid" are created to the root folder.
}
  • 运行此脚本时,首先,使用Gmail.Users.Messages.get从 email 检索附件 ID,包括内联图像。 并且,使用附件 ID,使用Gmail.Users.Messages.Attachments.get检索图像数据。 在高级 Google 服务的 Gmail API 的情况下,数据作为字节数组返回。 而且, files的值有一个数组,包括 cid 值和图像 blob。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM