Gmail API - 获取线程中的最后一条消息 [Python]

1 投票
1 回答
1163 浏览
提问于 2025-05-18 21:18

我正在使用Gmail的API来获取一个对话中的最后一条消息。

在下面的代码中,我获取了所有未读的对话。然后,对于每个对话,我获取最后一条消息。但是,当我想要获取那条最后消息的文本时,却得到了整个对话的文本。

import httplib2
import os
import json
from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
import base64
import email

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'
CLIENT_SECRET_FILE = str(os.path.dirname(os.path.abspath(__file__))).replace('MailAssistant', '') + '/static/MailAssistant/main/assets/client_secret.json'
APPLICATION_NAME = 'Gmail API Python Quickstart'


def get_credentials():

    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,
                                   'gmail-python-quickstart.json')

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials


def GetMessageBody(service, user_id, msg_id):

        message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
        msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
        mime_msg = email.message_from_bytes(msg_str)
        messageMainType = mime_msg.get_content_maintype()
        if messageMainType == 'multipart':
                for part in mime_msg.walk():
                        if part.get_content_maintype() == 'text':
                                return part.get_payload()
                return ""
        elif messageMainType == 'text':
                return mime_msg.get_payload()


def get_unread_threads(service, user_id='me'):
    # I get unseen threads
    threads = service.users().threads().list(userId=user_id, q='is:unread').execute().get('threads', [])
    print("Unread Threads: ", len(threads))
    biggest_internal_date = 0
    last_msg = []
    # Iterate each Thread
    for thread in threads:
        # I get those threads info
        tdata = service.users().threads().get(userId=user_id, id=thread['id']).execute()
        # I get the last message from the actual Thread
        for message in tdata['messages']:
            if int(message['internalDate']) > int(biggest_internal_date):
                biggest_internal_date = message['internalDate']
                last_msg = message
        # I get the data from that last message
        print(GetMessageBody(service, user_id, last_msg['id']))


def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)

    get_unread_threads(service)


if __name__ == '__main__':
    main()

但是我得到了所有对话的消息:

tuturuturururlastmessage

On Sat, Feb 17, 2018 at 11:43 PM, Danny Julian <dannyjulian.x@gmail.com>
wrote:

> asdadsadsas
>
> On Fri, Feb 16, 2018 at 12:35 PM, Danny Julian <dannyjulian.x@gmail.com>
> wrote:
>
>> message3
>>
>> On Fri, Feb 16, 2018 at 12:34 PM, Daniel Julian <djulian@x.com>
>> wrote:
>>
>>> message2
>>>
>>>
>>>
>>> 2018-02-16 12:33 GMT-03:00 Danny Julian <dannyjulian.x@gmail.com>:
>>>
>>>> message1
>>>>
>>>
>>>
>>
>

有没有办法只获取“tuturuturururlastmessage”?还是说我必须想办法从整个内容中提取出来?

谢谢你的帮助!

相关问题:

  • 暂无相关问题
暂无标签

1 个回答

0

不,实际上你只收到了一个消息,这个消息里引用了之前所有的消息,可能还包括第一条。这是这个对话的最后一条消息,你返回的内容是正确的。

顺便提一下,GMail的网页界面(还有其他邮件客户端)会通过一些线索来隐藏这些引用内容(通常是缩进或者'>'符号)。

如果你想把最后一条消息的真实内容和附加的引用分开,你需要做一些类似的处理,解析并转换你的字符串。

撰写回答