Gmail API编码-如何摆脱3D和&

时间:2018-08-20 23:42:44

标签: python base64 gmail-api

我正尝试使用Python很好地通过GMAIL API提取GMAIL电子邮件的正文。

我能够使用以下命令提取消息。但是,电子邮件文本的编码似乎存在问题(原始电子邮件中包含html)-由于某种原因,每次在每个报价 3D 出现之前。

此外,在a href =“ my_url”中,我出现了随机等号 = ,并且在链接末尾有&amp 字符,不在电子邮件的原始HTML中。

有人知道如何解决此问题吗?

我用来提取电子邮件的代码:

from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

from apiclient import errors
import base64
msgs = service.users().messages().list(userId='me', q="no-reply@hello.com",maxResults=1).execute()
for msg in msgs['messages']:message = service.users().messages().get(userId='me', id=m_id, format='raw').execute()

“原始”:返回完整的电子邮件消息数据,其中原始内容中的正文内容为base64url编码的字符串;有效负载字段未使用。“

print(base64.urlsafe_b64decode(message['raw'].encode('ASCII')))

td style = 3D ”填充:20px;颜色:#45555f;字体家族:Tahoma,He = 莱维蒂察font-size:12px; line-height:18px;

JPk79hd = JFQZEhc6%2BpAiQKF8M85SFbILbNd6IG8%2FEAWwe3VTr2jPzba4BHf%2FEnjMxq66fr228I7OS =

3 个答案:

答案 0 :(得分:0)

可悲的是,我无法找出解码消息的正确方法。

我最终使用以下变通方法,该变通方法是:

1)将消息拆分为一个列表,每行都作为一个列表项

2)找出其中一个字符串的列表位置和结束字符串的位置。

3)生成一个新列表从#2中删除,然后重新生成相同的列表,切出最后一个字符(等号)

4)从新列表中生成一个字符串

5)搜索URL我想要

    x= mime_msg.splitlines() #convert to list
    a = ([i for i, s in enumerate(x) if 'My unique start string' in s])[0] #get list# of beginning
    b = ([i for i, s in enumerate(x) if 'my end id' in s])[0] #end
    y = x[a:b]   #generate list w info we want
    new_list=[]
    for item in y:new_list.append(item[:-1]) #get rid of last character, which bs base64 encoding is "="
    url = ("".join(new_list)) #convert to string
    url = url.replace("3D","").replace("&amp","") #cleaner for some reason - encoding gives us random 3Ds + &amps
    csv_url = re.search('Whatever message comes before the URL (.*)',url).group(1)

以上使用

import re 
from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

from apiclient import errors
import base64
import email

答案 1 :(得分:0)

您应该检查Content-Transfer-Encoding标头以查看它是否指定quoted-printable,因为它看起来像quoted-printable编码的文本。

RFC 1521, Section 5.1

  

带引号的可打印编码旨在表示主要由八位字节组成的数据,这些八位字节对应于US-ASCII字符集中的可打印字符。它以一种方式对数据进行编码,使得生成的八位位组不太可能被邮件传输修改。如果要编码的数据大部分是US-ASCII文本,则数据的编码形式在很大程度上仍可以为人类所识别。完全为US-ASCII的正文也可以用Quoted-Printable进行编码,以确保消息通过字符转换和/或换行网关传递时,数据的完整性。

Python的quopri模块可用于以这种编码对电子邮件进行解码。

答案 2 :(得分:0)

我已经从asp.net中的网络服务向gmail发送了一封邮件 内容为纯HTML
尽管= 3D,它仍然显示为通缉犯

Dim Bericht As MailMessage
Bericht = New MailMessage

我的styleText的内容是

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-=1">
<meta content="text/html; charset=us-ascii">
<style>h1{color:blue;}
.EditText{
background:#ff0000;/*rood*/
height:100;
font-size:10px;
color:#0000ff;/*blauw*/
}
</head>

我身体的内容是

<div class='EditText'>this is just some text</div>

最后我将其合并

Bericht.Body = "<html>" & styleText & "<body>" & content& "</body></html>"

如果我查看收到的消息的来源,则仍然存在此3D 它显示

<html><head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Diso-8859-=
=3D1">
<meta content=3D"text/html; charset=3Dus-ascii">
<style>h1{color:blue;}
.EditText{
background:#ff0000;/*rood*/
height:100;
font-size:10px;
color:#0000ff;/*blauw*/
}
</style>
</head><body><div class=3D'EditText'>MailadresAfzender</div></body></html>

结果显示蓝色文本和红色背景。很好