Я редактирую электронное письмо, получая его и редактируя. полученную копию, записывая ее обратно с тем же идентификатором потока (хотя Gmail назначает новый идентификатор) и удаляя электронное письмо с исходным идентификатором, поэтому остается только измененная копия в том же месте, где находился оригинал. .
Но когда я пытаюсь добавить гиперссылку и просмотреть конечный результат в веб-интерфейсе Gmail, она неактивна, и в функции gmail show original я вижу следующее:
>
Код: Выделить всё
testurl text
После настройки службы в соответствии с документацией по быстрому запуску GMail Python и параметров запроса в переменной с именем query код выполняется согласно приведенному ниже:
Код: Выделить всё
# get content of first email matching query criteria
results = service.users().messages().list(userId='me', q=query, maxResults = 500).execute()
fullmsg = service.users().messages().get(userId='me', id=results['messages'][0]['id'], format='raw').execute()
unencoded = base64.urlsafe_b64decode(fullmsg['raw']).decode('utf-8')
mmsg = email.message_from_string(unencoded)
# find text/html part, and add link to start of html body using BeautifulSoup
for part in mmsg.walk():
if part.get_content_type() == 'text/html':
soup = BeautifulSoup(part.get_payload(), features='lxml')
linkTag = soup.new_tag('a', href='http://testurl.com')
linkTag.append("testurl text")
soup.body.insert(0,linkTag)
part.set_payload(str(soup))
encmsg = base64.urlsafe_b64encode(mmsg.as_string().encode('utf-8'))
# Add a label to indicate this email has been processed already (so query will exclude it from future searches) and write altered copy back to the server, deleting the original email
newLabels = fullmsg['labelIds'] + [doneLabelID]
fixedMsg = { 'raw' : encmsg.decode(), 'labelIds' : newLabels, 'threadId' : fullmsg['threadId'] }
response = service.users().messages().insert(userId='me', body=fixedMsg, internalDateSource='dateHeader').execute()
service.users().messages().delete(userId='me', id=results['messages'][0]['id']).execute()
Код: Выделить всё
fromg = service.users().messages().get(userId='me', id=response['id'], format='raw').execute()
unenc = base64.urlsafe_b64decode(fromg['raw']).decode('utf-8')
gmmsg = email.message_from_string(unenc)
for part in gmmsg.walk():
if part.get_content_type() == 'text/html':
print(part)
Я также пробовал без использования BeautifulSoup (вставляя теги привязки вручную), на случай, если это вводит что-то странное, но это не имело никакого значения.
Если кто-нибудь знает, что заставляет Gmail искажать эти сообщения при просмотре или пересылке из веб-интерфейса Gmail (но не делать этого, когда к сообщению обращаются через API), вся помощь будет очень полезна. оценил.
Подробнее здесь: https://stackoverflow.com/questions/791 ... n-existing